[Android]百度语音识别集成过程记录

作者: Coair_Scarlet | 来源:发表于2019-09-27 20:06 被阅读0次

    集成说明:

    在百度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);
    

    离线语音识别注意点:

    1. 官网申请应用时的包名与build.gradle里一致,这步没做会导致离线命令词或者唤醒报“no licence” 错误.

    2. 离线引擎识别失败 。离线识别引擎只能识别grammar文件中约定好的固定的话术,即使支持的话术,识别率也不如在线。请确保说的话清晰,是grammar中文件定义的,测试成功一次后,可以保存录音,便于测试。实测识别率非常低!

    3. 离线识别文件在官网--控制台--语音技术--离线词&语义设置中,设置下载,之后替换掉assets中的同名文件即可.

    相关文章

      网友评论

        本文标题:[Android]百度语音识别集成过程记录

        本文链接:https://www.haomeiwen.com/subject/mcydyctx.html