div>
百度语音所有功能免费,功能也比较简单实用,包括语音识别,语音合成和语音唤醒,正好可以组成一套完整的语音交互功能。
百度语音的demo里给的语音唤醒是在onResume()开始唤醒监听,唤醒成功后在onPause()里就停止唤醒监听。
而我现在要在唤醒成功后弹出语音识别的UI界面,所以弹出UI的同时就会停止唤醒监听。如果语音识别成功,UI界面消失,唤醒监听会重新开始,此时说出唤醒词即可重新唤醒。但是如果识别失败,封装好的UI界面会变成下图情况,这时候就要手动点击重试或者取消才可以,不符合全语音交互的理念。为了解决这个情况,要将停止(应该是开始吧?) 唤醒监听写到onStop()里,这样即使语音识别失败,也可以重新唤醒。
接口使用及调用流程
SDK调用过程如下:
-
初始化
1.1.初始化EventManager类
1.2.自定义输出事件类
1.3.注册自己的输出事件类
1.4.加载离线资源(如果需要离线命令词功能)
-
开始识别/唤醒
2.1. 设置识别/唤醒输入参数
2.2. 发送start开始事件
-
回调事件
3.1. 开始回调事件
-
控制识别/唤醒
4.1. 控制停止识别/唤醒,可以向SDK发送停止事件
4.2. 取消本次识别,可以向SDK发送取消事件
-
事件管理器退出。
5.1. 卸载离线资源(如果1.4加载离线资源)
5.2. 释放资源
在线识别调用流程
SDK 的调用过程可以参见DEMO中的ActivityMiniRecog类
集成时请确认已经复制或者修改了一下文件,一共4步:
- AndroidManifest.xml
- app/libs/bdasr_V3_xxxxx_xxxxx.jar
- app/src/main/jniLibs 下armeabi等5个目录
- 官网申请应用时的包名与build.gradle里一致,demo的包名是"com.baidu.speech.recognizerdemo"。这步没做会导致离线命令词或者唤醒报“no licence” 错误
- 运行时 getApplicationInfo().nativeLibraryDir 目录下查看是否有完整so文件。 特别是系统app需要手动push so文件到这个目录下。
准备工作:
百度AI开发平台下载语音识别sdk
官网注册应用,将自己的包名填写在官网申请的应用里(应该是包名!!!)
AndroidManifest.xml 中是 包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smartcar">
appuild.gradle 中是 applicationId (应用的唯一标识)
defaultConfig {
applicationId "xt.car"
开始向项目中集成百度语音接口:
1.AndroidManifest.xml 文件
设置权限(Application外)
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
设置APP_ID, APP_KEY, SECRET_KEY (Application内)
<meta-data android:name="com.baidu.speech.APP_ID"
android:value="××××××××××" />
<meta-data
android:name="com.baidu.speech.API_KEY"
android:value="×××××××××××××" />
<meta-data
android:name="com.baidu.speech.SECRET_KEY"
android:value="×××××××××××××" />
<service android:name="com.baidu.speech.VoiceRecognitionService" android:exported="false" />
2.bdasr_V3_xxxxxxxx_xxxx.jar 库
将core/libs/bdasr_V3_xxxxx_xxxxx.jar 复制到您的项目的同名目录中。
右击,add as library
此时观察build.gradle(module :app)文件,发现自动添加了如下一行
implementation files('libs\bdasr_V3_20191210_81acdf5.jar')
3.复制NDK 架构目录
- 将 core/src/main/jniLibs 下armeabi等包含so文件的5个目录,复制合并到您的项目的同名或者存放so的目录中。如果build.gradle中定义过jniLibs.srcDirs ,则复制合并到这个目录。
- 如与第三方库集成,至少要保留armeabi目录。如第三方库有7个架构目录,比语音识别SDK多出2个目录 mips和mips64,请将mips和mips64目录删除,剩下5个同名目录合并。
- 如第三方库仅有armeabi这一个目录,请将语音识别SDK的额外4个目录如armeabi-v7a删除,合并armeabi目录下的so。 即目录取交集,so文件不可随意更改所属目录。
- 打包成apk文件,按照zip格式解压出libs目录可以验证。
- 运行时 getApplicationInfo().nativeLibraryDir 目录下查看是否有完整so文件。 特别是系统app需要手动push so文件到这个目录下。
4. .xml
5. MainActivity.java
————————————————————————————————————————————————————————
识别输入事件
,以下参数均为SpeechConstant类的常量,如SpeechConstant.ASR_START**, 实际的String字面值可以参见SpeechConstant类或自行打印
事件名 | 类型 | 值 | 场景 | 描述 |
---|---|---|---|---|
ASR_START | String (JSON结构的字符串) |
json内的参数 见下文 “ASR_START 参数” |
全部 | 开始一次识别。 注意不要连续调用ASR_START参数。下次调用需要在CALLBACK_EVENT_ASR_EXIT回调后,或者在ASR_CANCEL输入后。 |
ASR_STOP | 全部 | 停止录音 | ||
ASR_CANCEL | 全部 | 取消本次识别 |
输出参数
语音回调事件统一由 public void onEvent(String name, String params, byte[] data, int offset, int length) 该方法回调。其中name是回调事件, params是回调参数。(data,offset,length)缓存临时数据,三者一起,生效部分为 data[offset] 开始,长度为length。
事件名(name) | 事件参数 | 类型 | 值 | 描述 |
---|---|---|---|---|
CALLBACK_EVENT _ASR_READY |
引擎准备就绪,可以开始说话 | |||
CALLBACK_EVENT _ASR_BEGIN |
检测到第一句话说话开始。SDK只有第一句话说话开始的回调,没有长语音每句话说话结束的回调。 | |||
CALLBACK_EVENT _ASR_END |
检测到第一句话说话结束。SDK只有第一句话说话结束的回调,没有长语音每句话说话结束的回调。 | |||
CALLBACK_EVENT _ASR_PARTIAL |
params | json | 识别结果 | |
params[results_recognition] | String[] | 解析后的识别结果。如无特殊情况,请取第一个结果 | ||
params[result_type] | String | partial_result | 临时识别结果 | |
params[result_type] | String | final_result | 最终结果,长语音每一句都有一个最终结果 | |
params[result_type] | String | nlu_result | 语义结果,在final_result后回调。语义结果的内容在(data,offset,length中) | |
(data,offset,length) | String | 语义结果的内容 ,当 params[result_type]=nlu_result时出现。 | ||
CALLBACK_EVENT _ASR_EXIT |
识别结束,资源释放 | |||
CALLBACK_EVENT _ASR_VOLUME |
params | json | 当前音量回调。必须输入ACCEPT_AUDIO_VOLUME参数激活 | |
params[volume] | float | 当前音量 | ||
params[volume-percent] | int | 当前音量的相对值(0-100) |