package samton.com.mscphone; import android.app.Activity; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.ContactsContract; import android.provider.MediaStore; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; import android.support.v4.print.PrintHelper; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; import com.google.gson.Gson; import com.iflytek.cloud.ErrorCode; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.RecognizerListener; import com.iflytek.cloud.RecognizerResult; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechRecognizer; import com.iflytek.cloud.SpeechSynthesizer; import com.iflytek.cloud.VoiceWakeuper; import com.iflytek.cloud.WakeuperListener; import com.iflytek.cloud.WakeuperResult; import com.iflytek.cloud.ui.RecognizerDialog; import com.iflytek.cloud.ui.RecognizerDialogListener; import com.iflytek.cloud.util.ResourceUtil; import java.io.File; import java.util.ArrayList; import java.util.List; import samton.com.mscphone.bean.Dst; import samton.com.mscphone.bean.XFBean; /** * Created by admin on 2018/8/2. */ public class MakkActivity extends AppCompatActivity implements View.OnClickListener { File s1 = Environment.getExternalStorageDirectory(); String FFFF="li.png"; private EditText viewById; private SpeechRecognizer mAsr; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.isrdemo); into(); init(); rouse(); } private void into() { // 初始化识别对象 mAsr = SpeechRecognizer.createRecognizer(this, new InitListener() { @Override public void onInit(int i) { } }); } //唤醒 private void rouse() { VoiceWakeuper mIvw = VoiceWakeuper.createWakeuper(this, null); //594760d9 唤醒路径 String resPath = ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets,"ivw/oo.jet"); Toast.makeText(this,resPath,Toast.LENGTH_SHORT).show(); // 唤醒资源路径,需下载使用对应的语音唤醒SDK。 mIvw.setParameter( SpeechConstant.IVW_RES_PATH, resPath ); // 唤醒类型 mIvw.setParameter( SpeechConstant.IVW_SST, "wakeup" ); // 唤醒门限 String curThresh; mIvw.setParameter( SpeechConstant.IVW_THRESHOLD, "1450" ); // 持续唤醒 mIvw.setParameter( SpeechConstant.KEEP_ALIVE, "1" ); int ret = mIvw.startListening(new WakeuperListener() { @Override public void onBeginOfSpeech() { } @Override public void onResult(WakeuperResult wakeuperResult) { String resultString = wakeuperResult.getResultString(); Toast.makeText(MakkActivity.this,"LLLLLLLLL"+ resultString, Toast.LENGTH_SHORT).show(); } @Override public void onError(SpeechError speechError) { } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } @Override public void onVolumeChanged(int i) { } }); } private void init() { findViewById(R.id.isr_recognize).setOnClickListener( this); findViewById(R.id.isr_grammar).setOnClickListener(this); findViewById(R.id.isr_lexcion).setOnClickListener(this); viewById = (EditText) findViewById(R.id.isr_text); findViewById(R.id.isr_stop).setOnClickListener(this); findViewById(R.id.isr_cancel).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.isr_recognize://开始识别 isr(); break; case R.id.isr_grammar://翻译 ToEnglish(); break; case R.id.isr_lexcion: break; case R.id.isr_stop://转化语音 String s = viewById.getText().toString(); TextToVoice(s); break; case R.id.isr_cancel: mAsr.stopListening(); break; } } /** * 吊起语音 */ public void isr() { //1.创建RecognizerDialog对象,第二参数就是一个初始化的监听,我们用不上就设置为null RecognizerDialog mDialog = new RecognizerDialog(this,null); //2.设置accent、language等参数 mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//设置为中文模式 mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置为普通话模式 //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解 // mDialog.setParameter("asr_sch", "1"); //mDialog.setParameter("nlp_version", "2.0"); //3.设置回调接口,语音识别后,得到数据,做响应的处理. mDialog.setListener(new RecognizerDialogListener() { //识别成功执行 参数1 recognizerResult:识别出的结果,Json格式(用户可参见附录12.1) // 参数2 b:等于true时会话结束。方法才不会继续回调 //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加,(关于解析Json的代码可参见MscDemo中JsonParser类) @Override public void onResult(RecognizerResult recognizerResult, boolean b) { if (!b) { //拿到讯飞识别的结果 String resultString = recognizerResult.getResultString(); System.out.println("讯飞识别的结果 " + resultString); System.out.println("b参数是什么 " + b); Log.d("HHa",resultString); Toast.makeText(MakkActivity.this, resultString, Toast.LENGTH_LONG).show(); Log.d("HHa",resultString); parseData(resultString);//解析json } } @Override//识别失败执行 speechError:错误码 public void onError(SpeechError speechError) { Log.d("HHa",speechError.getMessage()); } }); //4.显示dialog,接收语音输入 mDialog.show(); } /** * 语音解析 * @param resultString * @return */ private String parseData(String resultString) { //创建gson对象,记得要关联一下gson.jar包方可以使用. Gson gson = new Gson(); //参数 1.String类型的json数据 参数 2.存放json数据对应的bean类 XFBean xfBean = gson.fromJson(resultString, XFBean.class); //创建一个集合,用来存放bean类里的对象. List<XFBean.WsBean> ws = xfBean.getWs(); //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高 StringBuilder stringBuilder = new StringBuilder(); //使用高级for循环,取出特定属性的特有数据,装入StringBuilder中 for ( XFBean.WsBean w:ws) { for (XFBean.WsBean.CwBean cwBean : w.getCw()) { String w1 = cwBean.getW(); stringBuilder.append(w1); } // String text = w.getCw().get(0).getW(); } viewById.setText(stringBuilder.toString()); ff(stringBuilder.toString()); //把容器内的数据转为字符串返回出去. return stringBuilder.toString(); } /** * 字转换成语音 * @param text */ public void TextToVoice(String text){ //1.创建SpeechSynthesizer对象, 第一个参数上下文,第二个参数:本地合成时传InitListener SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null); //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100 mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端,这些功能用到讯飞服务器,所以要有网络. //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm” //保存在SD卡需要在AndroidManifest.xml添加写SD卡权限 //如果不需要保存合成音频,注释该行代码 mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm"); //3.开始合成,第一个参数就是转成声音的文字,可以自定义 第二个参数是合成监听器对象.我们不需要对声音有什么特殊处理,就传null mTts.startSpeaking(text,null); } /** * 判断 * @param result */ public void ff(String result){ //回答对象,在没有匹配到用户说的话,默认输出语句 String answer="不好意思,没有听清楚"; //这里的result参数,就是我们通过讯飞听写里最终拿到用户说话的结果 if(result.contains("你好")){ answer="你好,我是智能语音助手"; }else if(result.contains("谁是世界上最帅的人")){ answer="哈哈,当然是您"; }else if (result.contains("中午吃什么")) { String[] anwserList = new String[]{"火锅", "烧烤", "烤鱼", "麻辣烫"}; int random = (int) (Math.random() * anwserList.length); String anwser = anwserList[random]; } else if (result.contains("打印机")){ doPhotoPrint(); answer="以为您,打开打印机"; }else if (result.contains("通讯录")){ intentContacts(); }else if(result.contains("名字")) { answer="我叫小明,很高兴认识您"; }else if (result.contains("你有哪些功能")){ answer="初步完成,功能不完善"; }else if (result.contains("你能干什么")){ answer="现在待定,正在开发中"; }else if (result.contains("做个自我介绍")){ answer="您好,我是机器人小明,我貌赛潘安,义超关羽,智胜孔明,上知天文,下晓地理,出口成章,提笔成文,懂阴阳,测八卦,知奇门,晓遁甲的,大豪杰,大英雄,大剑客,大宗师,人称山崩地裂水倒流,赶浪无丝鬼见愁,前无古人,后无来者的,天下第一——“帅”呀"; }else if(result.contains("开相机 ")){ //摄像投 video(); } //调用语音助手说话的方法,把回答对象传进去. TextToVoice(answer); } //摄像头 private void video() { Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(s1, FFFF))); startActivityForResult(intentFromCapture, 11); } /*** * 通讯录的方法 */ private void intentContacts() { Uri uri = ContactsContract.Contacts.CONTENT_URI; Intent intent = new Intent(Intent.ACTION_PICK,uri); startActivityForResult(intent,0); } /** * 翻译 * @param dd */ public void ToEnglish(){ mAsr = SpeechRecognizer.createRecognizer(this, null); //SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null); mAsr.setParameter( SpeechConstant.ASR_SCH, "1" );// mAsr.setParameter( SpeechConstant.ADD_CAP, "translate" ); mAsr.setParameter( SpeechConstant.TRS_SRC, "its" ); mAsr.setParameter( SpeechConstant.ORI_LANG, "cn" ); mAsr.setParameter( SpeechConstant.TRANS_LANG, "en" ); mAsr.setParameter( SpeechConstant.AUDIO_FORMAT_AUE,"speex-wb"); //synthesizeToUri(java.lang.String text, java.lang.String uri, SynthesizerListener listener) int i = mAsr.startListening(new RecognizerListener() { @Override public void onVolumeChanged(int i, byte[] bytes) { } @Override public void onBeginOfSpeech() { } @Override public void onEndOfSpeech() { } @Override public void onResult(RecognizerResult recognizerResult, boolean b) { if (!b) { String resultString = recognizerResult.getResultString(); Log.d("HHa","onResult="+resultString); Toast.makeText(MakkActivity.this, resultString, Toast.LENGTH_LONG).show(); parseData2(resultString); } } @Override public void onError(SpeechError speechError) { Toast.makeText(MakkActivity.this, "失败:" + speechError.getMessage(), Toast.LENGTH_LONG).show(); } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }); Toast.makeText(MakkActivity.this, "码:" + i, Toast.LENGTH_LONG).show(); if (i != ErrorCode.SUCCESS) { // showTip("识别失败,错误码: " + ret); Toast.makeText(MakkActivity.this, "识别失败,错误码:" + i, Toast.LENGTH_LONG).show(); } } /** * 翻译解析 * @param resultString * @return */ private String parseData2(String resultString) { //创建gson对象,记得要关联一下gson.jar包方可以使用. Gson gson = new Gson(); //参数 1.String类型的json数据 参数 2.存放json数据对应的bean类 Dst xfBean = gson.fromJson(resultString, Dst.class); //创建一个集合,用来存放bean类里的对象. String ws = xfBean.getTrans_result().getDst(); //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBuilder效率更高 StringBuilder stringBuilder = new StringBuilder(); //使用高级for循环,取出特定属性的特有数据,装入StringBuilder中 stringBuilder.append(ws); viewById.setText(ws); ff(ws); //把容器内的数据转为字符串返回出去. return stringBuilder.toString(); } /** * 调取打印机 */ private void doPhotoPrint() { PrintHelper photoPrinter = new PrintHelper(this); photoPrinter.setScaleMode(PrintHelper.SCALE_MODE_FIT);//设置填充的类型,填充的类型指的是在A4纸上打印时的填充类型,两种模式 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher); //jpgTestPrint photoPrinter.printBitmap("jpgTestPrint", bitmap); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Toast.makeText(this,"ggggggg"+resultCode,Toast.LENGTH_SHORT).show(); if (requestCode==0&&resultCode==Activity.RESULT_OK){ Toast.makeText(this,"ggggggg",Toast.LENGTH_SHORT).show(); Uri data1 = data.getData(); String[] phoneContacts = getPhoneContacts(data1); List<String> userName=new ArrayList<>(); List<String> userMobile=new ArrayList<>(); for (int i = 0; i < phoneContacts.length; i++) { if (i%2==1){ userName.add(phoneContacts[i]); }else { userMobile.add(phoneContacts[i]); } } for (int i = 0; i < userName.size(); i++) { Toast.makeText(this,"姓名:"+userName+"手机号:"+userMobile,Toast.LENGTH_SHORT).show(); } } } /*** * 处理通讯录返回的结果 * @param uri * @return */ private String[] getPhoneContacts(Uri uri){ String[] contact=new String[2]; //得到ContentResolver对象 ContentResolver cr = getContentResolver(); //取得电话本中开始一项的光标 Cursor cursor=cr.query(uri,null,null,null,null); if(cursor!=null){ cursor.moveToFirst(); //取得联系人姓名 int nameFieldColumnIndex=cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); contact[0]=cursor.getString(nameFieldColumnIndex); //取得电话号码 String ContactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + ContactId, null, null); if(phone != null){ phone.moveToFirst(); contact[1] = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phone.close(); cursor.close(); } else{ return null; } return contact; } }
科大语音
最新推荐文章于 2021-11-13 17:16:50 发布