首先需要在百度进行用户注册,然后新建一个应用,选择你需要的服务,并且设置好创建的apk的包名。
然后在AndroidManifest.xml中配置:
然后在AndroidManifest.xml中配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.baiduvoicetest">
<!-- 允许应用使用麦克风录音 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 获取当前的网络状态,优化录音及网络参数。-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允许应用联网,发送语音数据至服务器,获得识别结果。 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取当前wifi状态,优化录音及网络参数 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 获取用户手机的IMEI,用来唯一的标识用户。 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!-- begin: baidu speech sdk-->
<meta-data
android:name="com.baidu.speech.APP_ID"
android:value="api id" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="api key" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="secret key" />
<service
android:name="com.baidu.speech.VoiceRecognitionService"
android:exported="false"></service>
<!-- end: baidu speech sdk-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="com.baidu.action.RECOGNIZE_SPEECH" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
AndroidManifest.xml主要配置了一些权限和注册apk时生成的key。百度的文档中还有一个BaiduASRDigitalDialog的activity的注册,不过我没有用到,所以这里就不添加了。
然后将之前下载的jar包添加到lib文件夹,还有几个.so结尾的文件也要添加到main文件夹底下,不然会报错。
完整代码:
public class MainActivity extends Activity implements RecognitionListener {
@Bind(R.id.btn_voice)
public Button btnVoice;
@Bind(R.id.tv_content)
public TextView tvContent;
private SpeechRecognizer speechRecognizer;
private CircleLoadingProgress mLoadingDialog = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// 创建识别器
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this, new ComponentName(this, VoiceRecognitionService.class));
// 注册监听器
speechRecognizer.setRecognitionListener(this);
}
@OnClick(R.id.btn_voice)
public void startVoice() {
showLoadingDialog("识别中。。。");
start();
}
private void start() {
Intent intent = new Intent();
bindParams(intent);
speechRecognizer.startListening(intent);
}
public void bindParams(Intent intent) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
// 提示音
if (sp.getBoolean("tips_sound", true)) {
intent.putExtra(Constant.EXTRA_SOUND_START, R.raw.bdspeech_recognition_start);
intent.putExtra(Constant.EXTRA_SOUND_END, R.raw.bdspeech_speech_end);
intent.putExtra(Constant.EXTRA_SOUND_SUCCESS, R.raw.bdspeech_recognition_success);
intent.putExtra(Constant.EXTRA_SOUND_ERROR, R.raw.bdspeech_recognition_error);
intent.putExtra(Constant.EXTRA_SOUND_CANCEL, R.raw.bdspeech_recognition_cancel);
}
// 音频源
if (sp.contains(Constant.EXTRA_INFILE)) {
String tmp = sp.getString(Constant.EXTRA_INFILE, "").replaceAll(",.*", "").trim();
intent.putExtra(Constant.EXTRA_INFILE, tmp);
}
// 保存过程中产生的音频文件
if (sp.getBoolean(Constant.EXTRA_OUTFILE, false)) {
intent.putExtra(Constant.EXTRA_OUTFILE, "sdcard/outfile.pcm");
}
// 离线语音识别路径
if (sp.getBoolean(Constant.EXTRA_GRAMMAR, false)) {
intent.putExtra(Constant.EXTRA_GRAMMAR, "assets:///baidu_speech_grammar.bsg");
}
// 采样率
if (sp.contains(Constant.EXTRA_SAMPLE)) {
String tmp = sp.getString(Constant.EXTRA_SAMPLE, "").replaceAll(",.*", "").trim();
if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_SAMPLE, Integer.parseInt(tmp));
}
}
// 语种
if (sp.contains(Constant.EXTRA_LANGUAGE)) {
String tmp = sp.getString(Constant.EXTRA_LANGUAGE, "").replaceAll(",.*", "").trim();
if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_LANGUAGE, tmp);
}
}
// 语义解析设置
if (sp.contains(Constant.EXTRA_NLU)) {
String tmp = sp.getString(Constant.EXTRA_NLU, "").replaceAll(",.*", "").trim();
if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_NLU, tmp);
}
}
// 语义活动检测
// search 搜索(短)
// input 输入(长)
if (sp.contains(Constant.EXTRA_VAD)) {
String tmp = sp.getString(Constant.EXTRA_VAD, "").replaceAll(",.*", "").trim();
if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_VAD, tmp);
}
}
// 垂直领域
String prop = null;
if (sp.contains(Constant.EXTRA_PROP)) {
String tmp = sp.getString(Constant.EXTRA_PROP, "").replaceAll(",.*", "").trim();
if (null != tmp && !"".equals(tmp)) {
intent.putExtra(Constant.EXTRA_PROP, Integer.parseInt(tmp));
prop = tmp;
}
}
}
@Override
public void onReadyForSpeech(Bundle params) {
// 准备就绪
}
@Override
public void onBeginningOfSpeech() {
// 开始说话处理
}
@Override
public void onRmsChanged(float rmsdB) {
// 音量变化处理
}
@Override
public void onBufferReceived(byte[] buffer) {
// 录音数据传出处理
}
@Override
public void onEndOfSpeech() {
// 说话结束处理
}
@Override
public void onError(int error) {
StringBuilder sb = new StringBuilder();
switch (error) {
case SpeechRecognizer.ERROR_AUDIO:
sb.append("音频问题");
break;
case SpeechRecognizer.ERROR_SPEECH_TIMEOUT:
sb.append("没有语音输入");
break;
case SpeechRecognizer.ERROR_CLIENT:
sb.append("其它客户端错误");
break;
case SpeechRecognizer.ERROR_INSUFFICIENT_PERMISSIONS:
sb.append("权限不足");
break;
case SpeechRecognizer.ERROR_NETWORK:
sb.append("网络问题");
break;
case SpeechRecognizer.ERROR_NO_MATCH:
sb.append("没有匹配的识别结果");
break;
case SpeechRecognizer.ERROR_RECOGNIZER_BUSY:
sb.append("引擎忙");
break;
case SpeechRecognizer.ERROR_SERVER:
sb.append("服务端错误");
break;
case SpeechRecognizer.ERROR_NETWORK_TIMEOUT:
sb.append("连接超时");
break;
}
sb.append(":" + error);
tvContent.setText("识别失败:" + sb.toString());
cancelLoadingDialog();
}
@Override
public void onResults(Bundle results) {
ArrayList<String> nbest = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
// 语音结果json格式
String json_res = results.getString("origin_result");
tvContent.setText(nbest.get(0));
cancelLoadingDialog();
}
@Override
public void onPartialResults(Bundle partialResults) {
// 临时结果处理
}
@Override
public void onEvent(int eventType, Bundle params) {
// 处理事件回调
}
public void showLoadingDialog(String message) {
if (mLoadingDialog == null) {
mLoadingDialog = new CircleLoadingProgress(this);
}
if (message != null) {
mLoadingDialog.setMessage(message);
}
mLoadingDialog.show();
}
public void cancelLoadingDialog() {
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.cancel();
}
}
@Override
protected void onDestroy() {
speechRecognizer.destroy();
super.onDestroy();
ButterKnife.unbind(this);
}
}
界面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
tools:context="com.example.baiduvoicetest.MainActivity">
<Button
android:id="@+id/btn_voice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="语音" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Hello World!" />
</LinearLayout>
其中Constant文件来自于官网demo中。
示意图: