下午看了语音识别教程:科大讯飞的中文识别后,功能做出来了,详见开发文档。
晚上的时候,无意浏览到一个开发包,做的竟然比我的更高级,并且重要的是代码更少,然后结合自己的重新做了语音识别第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>
Activity.xml
效果:
二、后台文件:
整体上需要注意:
第一,从此类开发版本的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();
}
}
ActivityView.java
三、权限文件
要注意对应的录音权限,上网权限等
<?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>
AndroidManifest.xml
整体就是这样啦,加油