下午看了语音识别教程:科大讯飞的中文识别后,功能做出来了,详见开发文档。
晚上的时候,无意浏览到一个开发包,做的竟然比我的更高级,并且重要的是代码更少,然后结合自己的重新做了语音识别第3个版本。
spech1,spech2是一种开发方法,speech是另外一种方法。
该版本相对于前两种优点:
1.提供了录音界面,更加人性化。
2,不需要对json语句进行解析,该接口已经做完了。
步骤:
建立安卓工程,命名为speech3,包名为:com.swust.speech3
一、前台文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="350dp" > <EditText android:id="@+id/txt_result" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textSize="20sp" android:paddingBottom="40dip" android:gravity="top|left" android:editable="true" /> </RelativeLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dip" > <Button android:id="@+id/btnStart" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginTop="10dip" android:text="录制" > </Button> <Button android:id="@+id/btnClear" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginTop="10dip" android:layout_marginLeft="10dip" android:text="清空" /> </LinearLayout> </LinearLayout>
效果:
二、后台文件:
整体上需要注意:
第一,从此类开发版本的libs中拷贝文件:armeabi文件夹和Msc.jar
第二,获取按键,文本框资源id,设置监听事件
第三,在对应的按键中,赋予相应功能
重点,是录制按钮,响应事件函数:
//按钮监听:开始录制 btnStart.setOnClickListener(new OnClickListener(){ public void onClick(View v){ Toast.makeText(MainActivity.this,"...",0).show(); showReconigizerDialog(); } });
里面的函数:
1 private void showReconigizerDialog() { 2 //setEngine(String engine,String params,String grammar); 3 /** 4 * 识别引擎选择,目前支持以下五种 5 “sms”:普通文本转写 6 “poi”:地名搜索 7 “vsearch”:热词搜索 8 “vsearch”:热词搜索 9 “video”:视频音乐搜索 10 “asr”:命令词识别 11 12 params 引擎参数配置列表 13 附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null 14 */ 15 rd.setEngine("sms", null, null); 16 17 //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。 18 rd.setSampleRate(RATE.rate16k); 19 20 final StringBuilder sb = new StringBuilder(); 21 Log.i(TAG, "识别准备开始............."); 22 23 //设置识别后的回调结果 24 rd.setListener(new RecognizerDialogListener() { 25 @Override 26 public void onResults(ArrayList<RecognizerResult> result, boolean isLast) { 27 for (RecognizerResult recognizerResult : result) { 28 sb.append(recognizerResult.text); 29 Log.i(TAG, "识别一条结果为::"+recognizerResult.text); 30 } 31 } 32 @Override 33 public void onEnd(SpeechError error) { 34 Log.i(TAG, "识别完成............."); 35 txt_result.append(sb.toString());//追加方式 36 Log.i(TAG, "识别完成:"+txt_result.getText().toString()); 37 } 38 }); 39 40 //txt_result.setText(""); //先设置为空,等识别完成后设置内容 41 txt_result.append("\n"); 42 rd.show(); 43 }
注意的是:
在从别处复制粘贴时,要特别注意同时也导入了别的工程的包,删除即可
该工程的资源对象均在工程前面全局初始化了
代码:
package com.swust.speech3; import java.util.ArrayList; import com.iflytek.speech.RecognizerResult; import com.iflytek.speech.SpeechError; import com.iflytek.speech.SpeechConfig.RATE; import com.iflytek.ui.RecognizerDialog; import com.iflytek.ui.RecognizerDialogListener; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { protected static final String TAG = "ThirdActivity"; private EditText txt_result; private Button btnStart; private Button btnClc; //开始录制及清空按钮 private RecognizerDialog rd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 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() { //获取对象资源ID btnStart =(Button) findViewById(R.id.btnStart); btnClc =(Button) findViewById(R.id.btnClear); txt_result = (EditText) findViewById(R.id.txt_result); //按钮监听:清除 btnClc.setOnClickListener(new OnClickListener(){ public void onClick(View v){ txt_result.setText(""); } }); //按钮监听:开始录制 btnStart.setOnClickListener(new OnClickListener(){ public void onClick(View v){ Toast.makeText(MainActivity.this,"...",0).show(); showReconigizerDialog(); } }); } 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.append(sb.toString());//追加方式 Log.i(TAG, "识别完成:"+txt_result.getText().toString()); } }); //txt_result.setText(""); //先设置为空,等识别完成后设置内容 txt_result.append("\n"); rd.show(); } }
三、权限文件
要注意对应的录音权限,上网权限等
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.swust.speech3" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> <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" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
整体就是这样啦,加油