集成说明:
在百度AI控制台建立好自己的应用之后,下载SDK包,解压之后把core作为一个module直接导入,参照以下流程即可,需要权限申请,完整代码参考demo或者百度的文档
demo:
https://git.dev.tencent.com/zhoulei26/android-scarlet.git
百度原文档
1 初始化
1.1 初始化EventManager对象
注意识别事件管理器只能维持一个,请勿同时使用多个实例
private val asr: EventManager by lazy{
// 基于sdk集成1.1 初始化EventManager对象
// 第一个参数是Activity或其它Context类
EventManagerFactory.create(activity, "asr")
}
1.2 自定义输出事件类
需要实现EventListener的输出事件回调接口。该类需要处理SDK在识别过程中的回调事件。
class BaiduyuyinFragment : BaseFragment(), EventListener
1.3 注册自己的输出事件类
就是把1.1 和 1.2 两个关联起来
asr.registerListener(yourListener)
2.1 设置识别输入参数
val params = LinkedHashMap<String, Any>()
params[SpeechConstant.ACCEPT_AUDIO_VOLUME] = false
val json = JSONObject(params).toString()
离线模式额外设置
params[SpeechConstant.DECODER] = 2
params[SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH] ="assets://baidu_speech_grammar.bsg"
asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, JSONObject(params).toString(), null, 0, 0)
离线命令词: 断网时激活,只能识别预定义的短语。联网时,强制使用在线识别。固定短语的语法需要从控制台“离线词&本地语义”模块预定义并下载为baidu_speech_grammar.bsg文件
2.2 发送start开始事件
asr.send(SpeechConstant.ASR_START , json, null, 0, 0)
3 收到回调事件
3.1开始回调事件
即在1.2环节EventListener接口中处理回调事件
完整参数说明参见文章开头百度原文档
我们重点关注name==“CALLBACK_EVENT_ASR_PARTIAL”时的params
将params转换成对象
val param=GsonUtils.fromJson(params, AsrPartial::class.java)
param.best_result //best_result即为我们需要的最佳结果
data class AsrPartial(
val best_result: String,
val error: Int,
val origin_result: OriginResult,
val result_type: String,
val results_recognition: List<String>
)
data class OriginResult(
val corpus_no: Long,
val err_no: Int,
val result: Result,
val sn: String,
val voice_energy: Double
)
data class Result(
val word: List<String>
)
4控制识别
//发送停止录音事件,提前结束录音等待识别结果
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
//取消本次识别,取消后将立即停止不会返回识别结果
asr.send(SpeechConstant.ASR_CANCE, null, null, 0, 0);
离线语音识别注意点:
官网申请应用时的包名与build.gradle里一致,这步没做会导致离线命令词或者唤醒报“no licence” 错误.
离线引擎识别失败 。离线识别引擎只能识别grammar文件中约定好的固定的话术,即使支持的话术,识别率也不如在线。请确保说的话清晰,是grammar中文件定义的,测试成功一次后,可以保存录音,便于测试。
实测识别率非常低!
离线识别文件在官网--控制台--语音技术--离线词&语义设置中,设置下载,之后替换掉assets中的同名文件即可.