[Android]百度語(yǔ)音識(shí)別集成過(guò)程記錄

集成說(shuō)明:

在百度AI控制臺(tái)建立好自己的應(yīng)用之后,下載SDK包,解壓之后把core作為一個(gè)module直接導(dǎo)入,參照以下流程即可,需要權(quán)限申請(qǐng),完整代碼參考demo或者百度的文檔

demo:

https://git.dev.tencent.com/zhoulei26/android-scarlet.git
百度原文檔

1 初始化

1.1 初始化EventManager對(duì)象

注意識(shí)別事件管理器只能維持一個(gè),請(qǐng)勿同時(shí)使用多個(gè)實(shí)例

    private val asr: EventManager by lazy{
        // 基于sdk集成1.1 初始化EventManager對(duì)象
        // 第一個(gè)參數(shù)是Activity或其它Context類(lèi)
      EventManagerFactory.create(activity, "asr")
    }

1.2 自定義輸出事件類(lèi)

需要實(shí)現(xiàn)EventListener的輸出事件回調(diào)接口。該類(lèi)需要處理SDK在識(shí)別過(guò)程中的回調(diào)事件。

class BaiduyuyinFragment : BaseFragment(), EventListener

1.3 注冊(cè)自己的輸出事件類(lèi)

就是把1.1 和 1.2 兩個(gè)關(guān)聯(lián)起來(lái)

asr.registerListener(yourListener)

2.1 設(shè)置識(shí)別輸入?yún)?shù)

val params = LinkedHashMap<String, Any>()
params[SpeechConstant.ACCEPT_AUDIO_VOLUME] = false
val json = JSONObject(params).toString()

離線模式額外設(shè)置

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)

離線命令詞: 斷網(wǎng)時(shí)激活,只能識(shí)別預(yù)定義的短語(yǔ)。聯(lián)網(wǎng)時(shí),強(qiáng)制使用在線識(shí)別。固定短語(yǔ)的語(yǔ)法需要從控制臺(tái)“離線詞&本地語(yǔ)義”模塊預(yù)定義并下載為baidu_speech_grammar.bsg文件

2.2 發(fā)送start開(kāi)始事件

asr.send(SpeechConstant.ASR_START , json, null, 0, 0)

3 收到回調(diào)事件

3.1開(kāi)始回調(diào)事件

即在1.2環(huán)節(jié)EventListener接口中處理回調(diào)事件
完整參數(shù)說(shuō)明參見(jiàn)文章開(kāi)頭百度原文檔
我們重點(diǎn)關(guān)注name==“CALLBACK_EVENT_ASR_PARTIAL”時(shí)的params
將params轉(zhuǎn)換成對(duì)象

val param=GsonUtils.fromJson(params, AsrPartial::class.java)

param.best_result //best_result即為我們需要的最佳結(jié)果

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控制識(shí)別

//發(fā)送停止錄音事件,提前結(jié)束錄音等待識(shí)別結(jié)果
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0); 
//取消本次識(shí)別,取消后將立即停止不會(huì)返回識(shí)別結(jié)果
asr.send(SpeechConstant.ASR_CANCE, null, null, 0, 0);

離線語(yǔ)音識(shí)別注意點(diǎn):

  1. 官網(wǎng)申請(qǐng)應(yīng)用時(shí)的包名與build.gradle里一致,這步?jīng)]做會(huì)導(dǎo)致離線命令詞或者喚醒報(bào)“no licence” 錯(cuò)誤.

  2. 離線引擎識(shí)別失敗 。離線識(shí)別引擎只能識(shí)別grammar文件中約定好的固定的話(huà)術(shù),即使支持的話(huà)術(shù),識(shí)別率也不如在線。請(qǐng)確保說(shuō)的話(huà)清晰,是grammar中文件定義的,測(cè)試成功一次后,可以保存錄音,便于測(cè)試。實(shí)測(cè)識(shí)別率非常低!

  3. 離線識(shí)別文件在官網(wǎng)--控制臺(tái)--語(yǔ)音技術(shù)--離線詞&語(yǔ)義設(shè)置中,設(shè)置下載,之后替換掉assets中的同名文件即可.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容