div>

百度公司推出语音识别An⁃droid SDK(离在线),给开发者提供一个语音识别的接口,通过云端的识别,给开发者返回识别结果,使开发者能够使用语音进行二次开发。语音控制具有非接触、非侵入性和易于使用的特点,是智能家居的一个新的方向。该设计是基于语音控制的智能家居系统,采用基于Android平台的移动设备作为控制终端,STM32 模块作为执行设备的主控板,通过服务器命令转发,实现了用语音命令通过Android移动设备对家居的设备控制。</
 
语音唤醒功能。在此功能界面中,无须手动控制,通过检测关键词,唤醒语音识别功能。通过创建唤醒管理器,注册唤醒事件监听器,当有唤醒词出现时,进入处理事件,在处理事件中跳转到语音识别界面,启动录音,等待使用者说话,等语音输入结束,进行预处理,通过百度语音接口上传到服务器并获取识别出来的字符串。
 
 
参考的demo中的"唤醒后识别", 就是比较费电^_
使用demo中的"唤醒后识别", 这个只要没有主动释放, 就会一直处于被唤醒状态, 你试下官方demo就知道了
使用的手机所以服务是一直在运行导致比较耗电,  智能音箱应该是有单独的低功耗模块识别唤醒
 

百度语音所有功能免费,功能也比较简单实用,包括语音识别,语音合成和语音唤醒,正好可以组成一套完整的语音交互功能。

 

百度语音的demo里给的语音唤醒是在onResume()开始唤醒监听,唤醒成功后在onPause()里就停止唤醒监听。

而我现在要在唤醒成功后弹出语音识别的UI界面,所以弹出UI的同时就会停止唤醒监听。如果语音识别成功,UI界面消失,唤醒监听会重新开始,此时说出唤醒词即可重新唤醒。但是如果识别失败,封装好的UI界面会变成下图情况,这时候就要手动点击重试或者取消才可以,不符合全语音交互的理念。为了解决这个情况,要将停止(应该是开始吧?) 唤醒监听写到onStop()里,这样即使语音识别失败,也可以重新唤醒。

 
 
 

接口使用及调用流程

SDK调用过程如下:

  1. 初始化

    1.1.初始化EventManager类

    1.2.自定义输出事件类

    1.3.注册自己的输出事件类

    1.4.加载离线资源(如果需要离线命令词功能)

  2. 开始识别/唤醒

    2.1. 设置识别/唤醒输入参数

    2.2. 发送start开始事件

  3. 回调事件

    3.1. 开始回调事件

  4. 控制识别/唤醒

    4.1. 控制停止识别/唤醒,可以向SDK发送停止事件

    4.2. 取消本次识别,可以向SDK发送取消事件

  5. 事件管理器退出。

    5.1. 卸载离线资源(如果1.4加载离线资源)

    5.2. 释放资源

 

在线识别调用流程

SDK 的调用过程可以参见DEMO中的ActivityMiniRecog类

 

 

集成时请确认已经复制或者修改了一下文件,一共4步:

  1. AndroidManifest.xml
  2. app/libs/bdasr_V3_xxxxx_xxxxx.jar
  3. app/src/main/jniLibs 下armeabi等5个目录
  4. 官网申请应用时的包名与build.gradle里一致,demo的包名是"com.baidu.speech.recognizerdemo"。这步没做会导致离线命令词或者唤醒报“no licence” 错误
  5. 运行时 getApplicationInfo().nativeLibraryDir 目录下查看是否有完整so文件。 特别是系统app需要手动push so文件到这个目录下。

准备工作:

百度AI开发平台下载语音识别sdk

官网注册应用,将自己的包名填写在官网申请的应用(应该是包名!!!)

AndroidManifest.xml  中是   包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smartcar">

 app\build.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.gradlemodule app)文件发现自动添加了如下一行  

  implementation files('libs\\bdasr_V3_20191210_81acdf5.jar')

3.复制NDK 架构目录     

  1. 将 core/src/main/jniLibs 下armeabi等包含so文件的5个目录,复制合并到您的项目的同名或者存放so的目录中。如果build.gradle中定义过jniLibs.srcDirs ,则复制合并到这个目录。
  2. 如与第三方库集成,至少要保留armeabi目录。如第三方库有7个架构目录,比语音识别SDK多出2个目录 mips和mips64,请将mips和mips64目录删除,剩下5个同名目录合并
  3. 如第三方库仅有armeabi这一个目录,请将语音识别SDK的额外4个目录如armeabi-v7a删除,合并armeabi目录下的so。 即目录取交集,so文件不可随意更改所属目录。
  4. 打包成apk文件,按照zip格式解压出libs目录可以验证。
  5. 运行时 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)