zoukankan      html  css  js  c++  java
  • 自然语言交流系统 phxnet团队 创新实训 个人博客 (六)

    讯飞的语音sdk是需要申请的,地址是:http://dev.voicecloud.cn/developer.php?vt=1 。申请一个讯飞的开发者账号,然后申请一个appid,申请的时候需要填写开发者信息和你的应用的信息。

    申请之后经过审核通过,会得到一个appid,这个是在使用语音服务时需要用到的。(笔者感觉申请还是比较容易通过的,简单地填写一下就通过了。速度也很快,我在晚上十一点多申请的,到第二天早上九点多就收到审核通过的邮件。个人感觉这个审核只是为了防止恶意使用,毕竟语音服务是要使用讯飞的服务器资源的。)

    申请到appid之后就可以下载SDK了,然后使用语音服务了。

    以下我试用的过程,(点击button,弹出语音框,说完之后将识别的结果显示在EditText中):

    • 在eclipse里新建一个android工程
    • 导入讯飞的语音jar包
    • 讯飞的服务是需要一堆权限的,在manifest.xml中加入
      [html] view plain copy
       
       print?
      1. <uses-permission android:name="android.permission.RECORD_AUDIO" />  
      2. <uses-permission android:name="android.permission.INTERNET" />  
      3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
      4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
      5. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
      6. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
      分别为:通过麦克风录音、联网、获取网络信息状态、获取wifi状态、改变网络状态如是否能联网、访问电话状态
    • 在main.xml中添加一个EditText和一个Button,如下
      [html] view plain copy
       
       print?
      1. <?xml version="1.0" encoding="utf-8"?>  
      2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
      3.     android:layout_width="fill_parent"  
      4.     android:layout_height="fill_parent"  
      5.     android:orientation="vertical" >  
      6.   
      7.     <EditText  
      8.         android:id="@+id/editText"  
      9.         android:layout_width="fill_parent"  
      10.         android:layout_height="300dp"  
      11.         android:gravity="top"  
      12.         android:inputType="textMultiLine" >  
      13.   
      14.         <requestFocus />  
      15.     </EditText>  
      16.   
      17.     <Button  
      18.         android:id="@+id/button_start"  
      19.         android:layout_width="wrap_content"  
      20.         android:layout_height="wrap_content"  
      21.         android:text="点击开始说话" />  
      22.   
      23. </LinearLayout>  
    • 然后在MainActivity中编写代码实现了

    (这里可以看到在线的文档:http://dev.voicecloud.cn/developer.php?category=YW5kcm9pZA%3D%3D&column=ZG9jdW1lbnQ%3D&type=d2lkZ2V0

    通过阅读讯飞给的文档,可以发现标准的识别控件是RecognizerDialog——是一个Dialog的子类,所以我们是可以在Activity中通过showDialog(int)方法来调用它的。

    重写Activity的方法

    [java] view plain copy
     
     print?
    1. @Override  
    2. protected Dialog onCreateDialog(int id) {}  

    在其中创建并设置好一个RecognizerDialog即可。

    创建RecognizerDialog方法为

    [java] view plain copy
     
     print?
    1. RecognizerDialog recognizerDialog = new RecognizerDialog(  
    2.         MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid  

    (其中appid应该写自己从讯飞申请到的appid,由于协议的问题,我不便把自己申请的id公开,所以这里用了1234567来代替。根据讯飞的说明,非法的appid是不能使用语音服务的,但是我用随机数字试验了一下,居然也是能用的,不知道是不是BUG。)

                              官方的文档:

            

    然后需要设置识别参数

    [java] view plain copy
     
     print?
    1. recognizerDialog.setEngine("sms", null, null);  

    第一个参数“sms”表示为请求的服务为“语音识别”。后两个参数暂时设为null就好。

                 官方文档:

    最后还需给recognizerDialog设置一个listener,回调接口用以获取结果,

    recognizerDialog.setListener(RecognizerDialogListener listener)的参数为RecognizerDialogListener接口,实现此接口要重写两个方法:onResults(ArrayList results,boolean isLast)和onEnd(SpeechError error)。用以获取和处理结果。

    我的实现为直接写了一个匿名类:

    [java] view plain copy
     
     print?
    1. recognizerDialog.setListener(new RecognizerDialogListener() {  
    2.     @Override  
    3.     public void onResults(ArrayList<RecognizerResult> results,  
    4.             boolean arg1) {  
    5.         StringBuffer result = new StringBuffer();  
    6.         for (RecognizerResult r : results) {  
    7.             result.append(r.text);  
    8.         }  
    9.         editText.setText(result.toString());  
    10.     }  
    11.   
    12.     @Override  
    13.     public void onEnd(SpeechError arg0) {  
    14.   
    15.     }  
    16. });  

    然后将此RecognizerDialog返回即可。

    完整的MainActivity代码:

    [java] view plain copy
     
     print?
    1. import com.iflytek.speech.RecognizerResult;  
    2. import com.iflytek.speech.SpeechError;  
    3. import com.iflytek.ui.RecognizerDialog;  
    4. import com.iflytek.ui.RecognizerDialogListener;  
    5.   
    6. public class MainActivity extends Activity {  
    7.   
    8.     EditText editText = null;  
    9.     Button startButton = null;  
    10.   
    11.     @Override  
    12.     public void onCreate(Bundle savedInstanceState) {  
    13.         super.onCreate(savedInstanceState);  
    14.         setContentView(R.layout.main);  
    15.         editText = (EditText) findViewById(R.id.editText);  
    16.         startButton = (Button) findViewById(R.id.button_start);  
    17.         startButton.setOnClickListener(new OnClickListener() {  
    18.             @Override  
    19.             public void onClick(View v) {  
    20.                 showDialog(1);  
    21.             }  
    22.         });  
    23.     }  
    24.   
    25.     @Override  
    26.     protected Dialog onCreateDialog(int id) {  
    27.         RecognizerDialog recognizerDialog = new RecognizerDialog(  
    28.                 MainActivity.this, "appid=1234567");// 这里应该写从科大讯飞申请到的appid  
    29.         recognizerDialog.setEngine("sms", null, null);  
    30.         recognizerDialog.setListener(new RecognizerDialogListener() {  
    31.             @Override  
    32.             public void onResults(ArrayList<RecognizerResult> results,  
    33.                     boolean arg1) {  
    34.                 StringBuffer result = new StringBuffer();  
    35.                 for (RecognizerResult r : results) {  
    36.                     result.append(r.text);  
    37.                 }  
    38.                 editText.setText(result.toString());  
    39.             }  
    40.   
    41.             @Override  
    42.             public void onEnd(SpeechError arg0) {  
    43.   
    44.             }  
    45.         });  
    46.         return recognizerDialog;  
    47.     }  
    48. }  


    程序在真机运行截图,经过检验,科大讯飞的识别率还是很高的。

             

          

  • 相关阅读:
    设计模式之工厂模式-抽象工厂(02)
    1036 跟奥巴马一起编程 (15 分)
    1034 有理数四则运算 (20 分)
    1033 旧键盘打字 (20 分)
    1031 查验身份证 (15 分)
    大学排名定向爬虫
    1030 完美数列 (25 分)二分
    1029 旧键盘 (20 分)
    1028 人口普查 (20 分)
    1026 程序运行时间 (15 分)四舍五入
  • 原文地址:https://www.cnblogs.com/qiaoyanlin/p/6876003.html
Copyright © 2011-2022 走看看