集成說(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):
官網(wǎng)申請(qǐng)應(yīng)用時(shí)的包名與build.gradle里一致,這步?jīng)]做會(huì)導(dǎo)致離線命令詞或者喚醒報(bào)“no licence” 錯(cuò)誤.
離線引擎識(shí)別失敗 。離線識(shí)別引擎只能識(shí)別grammar文件中約定好的固定的話(huà)術(shù),即使支持的話(huà)術(shù),識(shí)別率也不如在線。請(qǐng)確保說(shuō)的話(huà)清晰,是grammar中文件定義的,測(cè)試成功一次后,可以保存錄音,便于測(cè)試。
實(shí)測(cè)識(shí)別率非常低!離線識(shí)別文件在官網(wǎng)--控制臺(tái)--語(yǔ)音技術(shù)--離線詞&語(yǔ)義設(shè)置中,設(shè)置下載,之后替換掉assets中的同名文件即可.