zoukankan      html  css  js  c++  java
  • Android语音搜索

    前言

    在现有的软件的搜索框中基本上都会加上语音搜索的图标,以方便用户输入.我们xxxx的搜索框其实也可以借鉴这样的输入方式,提高用户体验.
    语音识别有3种方式实现①使用intent调用语音识别程序;②通过sevice的方式实现;③选用接入第3方语音识别库;
    下面就这一方案技术①,③实现进行描述.

    1.  使用intent调用语音识别程序

    Android系统已经为我们提供了通过intent的方式来启动,在代码中只发出一个”android.speech.action.RECOGNIZE_SPEECH”的intent,就可以调用到系统中已经安装好的语音识别软件.我们只要获取返回值并显示即可.调用代码如下:
      Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
      intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT, getString(R.string.hint_code));
    startActivityForResult(intent, REQUEST_CODE_RECOGNITION_REQUEST);
     
    当然,如果用户的机子没有安装相关的软件,就会报错,所以我们还需要做如下的处理之一.
    1.为上面的代码段添加异常捕获并提示;
    2.在调用之前判断下时候用户的机子已经安装了相关的软件,没有则把语音输入的按钮隐藏或者不可操作,判断的代码如下:
        public static boolean isApkInstalled(String strIntent){
           PackageManager packageManager = context.getPackageManager();
          List<ResolveInfo> activities = packageManager.queryIntentActivities(new Intent(strIntent), 0);
          
           return activities != null && !activities.isEmpty();
        }
    在调用之后在onActivityResult()里添加对语音输入返回的值的过滤.例如在intent中就存在结果集data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);下面示例就是显示输入结果让用户选择正确的输入值,这里是弹出对话框的方式.
            if(requestCode == REQUEST_CODE_RECOGNITION_REQUEST && resultCode == RESULT_OK) {
                ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
               
                if(results!=null && !results.isEmpty()){
                  int size=results.size();
                  audioArray=new String[size];
                  results.toArray(audioArray);
                 
                  for(int i=0; i<size;i++){
                     String str=results.get(i);
                     if(str!=null){
                         str.replaceAll(" ", "");
                         str.replaceAll(" ", "");
                     }
                    
                     audioArray[i]=str;
                  }
                 
                  showDialog(DIALOG_AUDIO);
                }else{
                  Toast.makeText(this, R.string.hite_audio, Toast.LENGTH_SHORT).show();
                }
            }

    2.  选用接入第3方语音识别库

    上面那种是依赖于用户自己已经安装了语音输入的方式,但如果用户机子上没有的话,可以用过提示用户安装.其实更好的方式是采用接入第2,3方的语音输入来实现更可靠些. 下面介绍选用科大讯飞的语音识别库.
    科大讯飞语音识别库中主要是用到RecognizerDialog,他是继承与Dialog,所以只要用过showDialog()的方式即可直接显示其输入界面.createDialog代码如下:
           RecognizerDialog recognizerDialog = new RecognizerDialog(MainActivity.this, "appid=1234567");
           // appid应该写从科大讯飞申请到的appid      recognizerDialog.setEngine("sms", null, null);//”sms”:普通文本转写       recognizerDialog.setListener(new RecognizerDialogListener() {
               @Override
               public void onResults(ArrayList<RecognizerResult> results,
                      boolean arg1) {
                  StringBuffer result = new StringBuffer();
                  for (RecognizerResult r : results) {
                      result.append(r.text);
                  }
                  editText.setText(result.toString());
               }
     
               @Override
               public void onEnd(SpeechError arg0) {
     
               }
        });

  • 相关阅读:
    94. Binary Tree Inorder Traversal
    101. Symmetric Tree
    38. Count and Say
    28. Implement strStr()
    实训团队心得(1)
    探索性测试入门
    LC.278. First Bad Version
    Search in Unknown Sized Sorted Array
    LC.88. Merge Sorted Array
    LC.283.Move Zeroes
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/3712005.html
Copyright © 2011-2022 走看看