android 语音识别 之 讯飞语音移植

转载自:http://blog.csdn.net/chenshufei2/article/details/8496905

一、简介

    语音识别现在应用越来越广泛了 比如语音写短信、语音搜索商品、语音搜索关键字等等,这遍我们就简单的谈谈国内比较流行的讯飞语音在android平台上的实现。

   笔者认为:

           google语音识别并不是十分符合中国人的习惯,且google语音识别一个重要弊端的是,需要用户手机上必须有google语音应用。

    一般的国行android手机并没有,比如笔记手机小米就没有。需要下载单独google语音apk。所以用户体现自然不如讯飞。

          但讯飞笔者认为,也有一定风险。讯飞应用协议中,他们是具有任何时候,停掉你语音识别服务的权限的,而且还不用和你商量。

      一旦你的应用达到了百万级了,那么讯飞是要收取你一定的服务费的,所以一般大公司的项目基本上不会用讯飞语音或与讯飞语音合作比如小米,

      Android4.0以上版本语音小助手就有小米与讯飞语音合作开发出来的。

二、讯飞Android小示例

     先看看效果图:

 

   嗯,看到效果图后下面就谈谈如何去实现效果:

   2.1 到讯飞官网开发者专区中注册用户并获取appid  地址:http://open.voicecloud.cn/developer.php

   2.2 新建android工程,并在清单文件中声明好相应的权限

  

  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” />  
  7. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” />  
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2.3 下载libmsc.so与Msc.jar,并分别放在android工程的libs/armeabi与libs文件夹中,如图
   

  3.4 使用示例如下,代码中都带有相应的注释了:

  

  1. import java.util.ArrayList;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.EditText;  
  9.   
  10. import com.iflytek.speech.RecognizerResult;  
  11. import com.iflytek.speech.SpeechConfig.RATE;  
  12. import com.iflytek.speech.SpeechError;  
  13. import com.iflytek.ui.RecognizerDialog;  
  14. import com.iflytek.ui.RecognizerDialogListener;  
  15.   
  16. /** 
  17.  * @author 陈淑飞 
  18.  * 2013-1-8 上午1:10:24 
  19.  */  
  20. public class HelloDemoActivity extends Activity implements OnClickListener {  
  21.     protected static final String TAG = “ThirdActivity”;  
  22.     private EditText txt_result;  
  23.     private RecognizerDialog rd;  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.demo);  
  29.           
  30.         findView();  
  31.         //RecognizerDialog(Context context, String params); “appid=1234567,usr=test,pwd=12345”  usr、pwd不是必选的  
  32.         //创建语音识别dailog对象,appid到讯飞就注册获取  
  33.         rd = new RecognizerDialog(this ,“appid=50e1b967”);  
  34.     }  
  35.   
  36.     private void findView() {  
  37.         txt_result = (EditText) findViewById(R.id.txt_result);  
  38.         findViewById(R.id.bt_search).setOnClickListener(this);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onClick(View v) {  
  43.         switch (v.getId()) {  
  44.         case R.id.bt_search:  
  45.             showReconigizerDialog();  
  46.             break;  
  47.   
  48.         default:  
  49.             break;  
  50.         }  
  51.     }  
  52.   
  53.     private void showReconigizerDialog() {  
  54.         //setEngine(String engine,String params,String grammar);  
  55.         /** 
  56.          * 识别引擎选择,目前支持以下五种 
  57.             “sms”:普通文本转写 
  58.             “poi”:地名搜索 
  59.             “vsearch”:热词搜索 
  60.             “vsearch”:热词搜索 
  61.             “video”:视频音乐搜索 
  62.             “asr”:命令词识别 
  63.              
  64.             params  引擎参数配置列表 
  65.             附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null 
  66.          */  
  67.         rd.setEngine(”sms”nullnull);  
  68.           
  69.         //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。  
  70.         rd.setSampleRate(RATE.rate16k);  
  71.           
  72.         final StringBuilder sb = new StringBuilder();  
  73.         Log.i(TAG, ”识别准备开始………….”);  
  74.           
  75.         //设置识别后的回调结果  
  76.         rd.setListener(new RecognizerDialogListener() {  
  77.             @Override  
  78.             public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {  
  79.                 for (RecognizerResult recognizerResult : result) {  
  80.                     sb.append(recognizerResult.text);  
  81.                     Log.i(TAG, ”识别一条结果为::”+recognizerResult.text);  
  82.                 }  
  83.             }  
  84.             @Override  
  85.             public void onEnd(SpeechError error) {  
  86.                 Log.i(TAG, ”识别完成………….”);  
  87.                 txt_result.setText(sb.toString());  
  88.             }  
  89.         });  
  90.           
  91.         txt_result.setText(”“); //先设置为空,等识别完成后设置内容  
  92.         rd.show();  
  93.     }  
  94.   
  95. }  
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechConfig.RATE;
import com.iflytek.speech.SpeechError;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;

/**
 * @author 陈淑飞
 * 2013-1-8 上午1:10:24
 */
public class HelloDemoActivity extends Activity implements OnClickListener {
    protected static final String TAG = "ThirdActivity";
    private EditText txt_result;
    private RecognizerDialog rd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo);

        findView();
        //RecognizerDialog(Context context, String params); "appid=1234567,usr=test,pwd=12345"  usr、pwd不是必选的
        //创建语音识别dailog对象,appid到讯飞就注册获取
        rd = new RecognizerDialog(this ,"appid=50e1b967");
    }

    private void findView() {
        txt_result = (EditText) findViewById(R.id.txt_result);
        findViewById(R.id.bt_search).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_search:
            showReconigizerDialog();
            break;

        default:
            break;
        }
    }

    private void showReconigizerDialog() {
        //setEngine(String engine,String params,String grammar);
        /**
         * 识别引擎选择,目前支持以下五种
            “sms”:普通文本转写
            “poi”:地名搜索
            “vsearch”:热词搜索
            “vsearch”:热词搜索
            “video”:视频音乐搜索
            “asr”:命令词识别

            params  引擎参数配置列表
            附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null
         */
        rd.setEngine("sms", null, null);

        //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。
        rd.setSampleRate(RATE.rate16k);

        final StringBuilder sb = new StringBuilder();
        Log.i(TAG, "识别准备开始.............");

        //设置识别后的回调结果
        rd.setListener(new RecognizerDialogListener() {
            @Override
            public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
                for (RecognizerResult recognizerResult : result) {
                    sb.append(recognizerResult.text);
                    Log.i(TAG, "识别一条结果为::"+recognizerResult.text);
                }
            }
            @Override
            public void onEnd(SpeechError error) {
                Log.i(TAG, "识别完成.............");
                txt_result.setText(sb.toString());
            }
        });

        txt_result.setText(""); //先设置为空,等识别完成后设置内容
        rd.show();
    }

}

笔者注:呵呵请大家转载时,注下来源呗,也帮我弄弄人气撒。

另:工程示例domo,已上传到csdn中(免积分哦),地址:http://download.csdn.net/detail/chenshufei2/4989030

转载自:http://blog.csdn.net/chenshufei2/article/details/8496905

一、简介

    语音识别现在应用越来越广泛了 比如语音写短信、语音搜索商品、语音搜索关键字等等,这遍我们就简单的谈谈国内比较流行的讯飞语音在android平台上的实现。

   笔者认为:

           google语音识别并不是十分符合中国人的习惯,且google语音识别一个重要弊端的是,需要用户手机上必须有google语音应用。

    一般的国行android手机并没有,比如笔记手机小米就没有。需要下载单独google语音apk。所以用户体现自然不如讯飞。

          但讯飞笔者认为,也有一定风险。讯飞应用协议中,他们是具有任何时候,停掉你语音识别服务的权限的,而且还不用和你商量。

      一旦你的应用达到了百万级了,那么讯飞是要收取你一定的服务费的,所以一般大公司的项目基本上不会用讯飞语音或与讯飞语音合作比如小米,

      Android4.0以上版本语音小助手就有小米与讯飞语音合作开发出来的。

二、讯飞Android小示例

     先看看效果图:

 

   嗯,看到效果图后下面就谈谈如何去实现效果:

   2.1 到讯飞官网开发者专区中注册用户并获取appid  地址:http://open.voicecloud.cn/developer.php

   2.2 新建android工程,并在清单文件中声明好相应的权限

  

  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” />  
  7. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” />  
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  2.3 下载libmsc.so与Msc.jar,并分别放在android工程的libs/armeabi与libs文件夹中,如图
   

  3.4 使用示例如下,代码中都带有相应的注释了:

  

  1. import java.util.ArrayList;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.EditText;  
  9.   
  10. import com.iflytek.speech.RecognizerResult;  
  11. import com.iflytek.speech.SpeechConfig.RATE;  
  12. import com.iflytek.speech.SpeechError;  
  13. import com.iflytek.ui.RecognizerDialog;  
  14. import com.iflytek.ui.RecognizerDialogListener;  
  15.   
  16. /** 
  17.  * @author 陈淑飞 
  18.  * 2013-1-8 上午1:10:24 
  19.  */  
  20. public class HelloDemoActivity extends Activity implements OnClickListener {  
  21.     protected static final String TAG = “ThirdActivity”;  
  22.     private EditText txt_result;  
  23.     private RecognizerDialog rd;  
  24.   
  25.     @Override  
  26.     protected void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.demo);  
  29.           
  30.         findView();  
  31.         //RecognizerDialog(Context context, String params); “appid=1234567,usr=test,pwd=12345”  usr、pwd不是必选的  
  32.         //创建语音识别dailog对象,appid到讯飞就注册获取  
  33.         rd = new RecognizerDialog(this ,“appid=50e1b967”);  
  34.     }  
  35.   
  36.     private void findView() {  
  37.         txt_result = (EditText) findViewById(R.id.txt_result);  
  38.         findViewById(R.id.bt_search).setOnClickListener(this);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onClick(View v) {  
  43.         switch (v.getId()) {  
  44.         case R.id.bt_search:  
  45.             showReconigizerDialog();  
  46.             break;  
  47.   
  48.         default:  
  49.             break;  
  50.         }  
  51.     }  
  52.   
  53.     private void showReconigizerDialog() {  
  54.         //setEngine(String engine,String params,String grammar);  
  55.         /** 
  56.          * 识别引擎选择,目前支持以下五种 
  57.             “sms”:普通文本转写 
  58.             “poi”:地名搜索 
  59.             “vsearch”:热词搜索 
  60.             “vsearch”:热词搜索 
  61.             “video”:视频音乐搜索 
  62.             “asr”:命令词识别 
  63.              
  64.             params  引擎参数配置列表 
  65.             附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null 
  66.          */  
  67.         rd.setEngine(”sms”nullnull);  
  68.           
  69.         //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。  
  70.         rd.setSampleRate(RATE.rate16k);  
  71.           
  72.         final StringBuilder sb = new StringBuilder();  
  73.         Log.i(TAG, ”识别准备开始………….”);  
  74.           
  75.         //设置识别后的回调结果  
  76.         rd.setListener(new RecognizerDialogListener() {  
  77.             @Override  
  78.             public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {  
  79.                 for (RecognizerResult recognizerResult : result) {  
  80.                     sb.append(recognizerResult.text);  
  81.                     Log.i(TAG, ”识别一条结果为::”+recognizerResult.text);  
  82.                 }  
  83.             }  
  84.             @Override  
  85.             public void onEnd(SpeechError error) {  
  86.                 Log.i(TAG, ”识别完成………….”);  
  87.                 txt_result.setText(sb.toString());  
  88.             }  
  89.         });  
  90.           
  91.         txt_result.setText(”“); //先设置为空,等识别完成后设置内容  
  92.         rd.show();  
  93.     }  
  94.   
  95. }  
import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechConfig.RATE;
import com.iflytek.speech.SpeechError;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;

/**
 * @author 陈淑飞
 * 2013-1-8 上午1:10:24
 */
public class HelloDemoActivity extends Activity implements OnClickListener {
    protected static final String TAG = "ThirdActivity";
    private EditText txt_result;
    private RecognizerDialog rd;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo);

        findView();
        //RecognizerDialog(Context context, String params); "appid=1234567,usr=test,pwd=12345"  usr、pwd不是必选的
        //创建语音识别dailog对象,appid到讯飞就注册获取
        rd = new RecognizerDialog(this ,"appid=50e1b967");
    }

    private void findView() {
        txt_result = (EditText) findViewById(R.id.txt_result);
        findViewById(R.id.bt_search).setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_search:
            showReconigizerDialog();
            break;

        default:
            break;
        }
    }

    private void showReconigizerDialog() {
        //setEngine(String engine,String params,String grammar);
        /**
         * 识别引擎选择,目前支持以下五种
            “sms”:普通文本转写
            “poi”:地名搜索
            “vsearch”:热词搜索
            “vsearch”:热词搜索
            “video”:视频音乐搜索
            “asr”:命令词识别

            params  引擎参数配置列表
            附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null
         */
        rd.setEngine("sms", null, null);

        //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。
        rd.setSampleRate(RATE.rate16k);

        final StringBuilder sb = new StringBuilder();
        Log.i(TAG, "识别准备开始.............");

        //设置识别后的回调结果
        rd.setListener(new RecognizerDialogListener() {
            @Override
            public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
                for (RecognizerResult recognizerResult : result) {
                    sb.append(recognizerResult.text);
                    Log.i(TAG, "识别一条结果为::"+recognizerResult.text);
                }
            }
            @Override
            public void onEnd(SpeechError error) {
                Log.i(TAG, "识别完成.............");
                txt_result.setText(sb.toString());
            }
        });

        txt_result.setText(""); //先设置为空,等识别完成后设置内容
        rd.show();
    }

}

笔者注:呵呵请大家转载时,注下来源呗,也帮我弄弄人气撒。

另:工程示例domo,已上传到csdn中(免积分哦),地址:http://download.csdn.net/detail/chenshufei2/4989030

猜你喜欢

转载自blog.csdn.net/ffb920724/article/details/77947410