一迁筛、語音識別篇
1啤誊、語音識別方案選擇
目前市場上提供語音識別技術(shù)公司相對較多刃滓,相關(guān)技術(shù)較為成熟酌媒,一些比較知名的語音服務(wù)提供商:
公司 | 相關(guān)產(chǎn)品 | 特點(diǎn) |
---|---|---|
科大訊飛 | 訊飛輸入法欠痴、京東迄靠、攜程、新浪微博喇辽、獵豹瀏覽器掌挚、有道翻譯官等 | 國內(nèi)語音產(chǎn)業(yè)的先行者,中文語音識別市場占有率第一菩咨,市面上大部分應(yīng)用的語音功能都是使用訊飛的接口 |
百度 | 百度輸入法吠式,魅族輸入法等 | 免費(fèi)! 技術(shù)實(shí)力也較為強(qiáng)大 |
思必馳 | 思必馳 | 更多偏向于智能硬件抽米,智能家具特占、車載方面 |
方案選擇時(shí)的注意點(diǎn):
技術(shù)方面:
- 識別準(zhǔn)確率 :目前市場上提供語音識別技術(shù)的主流公司的識別準(zhǔn)確率都在95%以上,差異不大云茸。 對于偏僻字是目、方言的識別訊飛更好一些
- 垂直領(lǐng)域的定制化:在垂直領(lǐng)域使用通用數(shù)據(jù)進(jìn)行識別,效果肯定不太好标捺,如果缺少支持該領(lǐng)域的相關(guān)功能懊纳,那么識別功能的效果就會大打折扣。比如生活服務(wù)中亡容,“陳魚落宴”是一家主營烤魚的餐廳嗤疯,用戶語音搜索中,如果按照通用識別闺兢,將會識別為“沉魚落雁”茂缚,那么這次搜索對于用戶來說就是無效的。除此之外列敲,如需要中英混合識別也需要注意能否支持。
服務(wù)方面:
- 文檔是否全面帖汞,出現(xiàn)問題是否能及時(shí)找到支持人員等
實(shí)踐: 我們在項(xiàng)目中所選用的是科大訊飛的語音識別戴而,總體很不錯,文檔和技術(shù)支持(大公司)都不錯翩蘸,但定制化方面略有局限所意。
2、訊飛語音識別的使用
(1)識別的過程
當(dāng)用戶開啟麥克風(fēng)并說話后:“今天天氣怎么樣”分井,訊飛會將聽到內(nèi)容截?cái)喑碘敖裉臁保疤鞖狻背呙缓髮⒆R別后的內(nèi)容返回珠闰,依次進(jìn)行,直到識別到最后一個字后瘫辩,返回結(jié)束符號伏嗜,完成此次識別。
舉例:識別的返回內(nèi)容
{
"sn": 1,
"ls": false,
"bg": 0,
"ed": 0,
"ws": [ {
"bg": 0,
"cw": [
{
"w": "今天",
"sc": 0
} ]
},
{
"bg": 0,
"cw": [
{
"w": "天氣",
"sc": 0
}
]
}
]
}
(2)訊飛的SDK使用
- 使用訊飛服務(wù)前需要初始化SDK
SpeechUtility.createUtility(android.content.Context, APPID) //需要在訊飛平臺上注冊一個App伐厌,初始化時(shí)需要這個Appid
- 設(shè)置識別的類型參數(shù)
通過setParameter(String key, java.lang.String value) 配置的識別參數(shù)承绸,可設(shè)置的參數(shù)有:
SpeechConstant.NET_TIMEOUT: 網(wǎng)絡(luò)連接超時(shí)時(shí)間
SpeechConstant.KEY_SPEECH_TIMEOUT:語音輸入超時(shí)時(shí)間
SpeechConstant.LANGUAGE:語言 //中文、外文等
SpeechConstant.ACCENT:語言區(qū)域 //普通話弧械、粵語八酒、等地方方言都支持
SpeechConstant.AUDIO_SOURCE:音頻源
SpeechConstant.BLUETOOTH: 藍(lán)牙錄音
SpeechConstant.VAD_BOS:前端點(diǎn)超時(shí),//開始錄入音頻后刃唐,音頻前面部分最長靜音時(shí)長
SpeechConstant.VAD_EOS:后端點(diǎn)超時(shí)//開始錄入音頻后羞迷,音頻后面部分最長靜音時(shí)長
SpeechConstant.ASR_PTT:設(shè)置是否有標(biāo)點(diǎn)符號
SpeechConstant.RESULT_TYPE:識別結(jié)果類型
SpeechConstant.ASR_AUDIO_PATH:識別錄音保存路徑
如需對識別內(nèi)容進(jìn)行翻譯,增加以下參數(shù):
SpeechConstant.ASR_SCH:語義或翻譯
SpeechConstant.ORI_LANG: 原始語種
SpeechConstant.TRANS_LANG: 目標(biāo)語種
SpeechConstant.ADD_CAP:語義或翻譯處理通道
SpeechConstant.TRS_SRC:翻譯結(jié)果格式
- 內(nèi)容識別后的回調(diào)方法
//音量變化 當(dāng)開始識別画饥,到停止錄音(停止寫入音頻流)或SDK返回最后一個結(jié)果自動結(jié)束識別為止衔瓮,
//SDK檢測到音頻數(shù)據(jù)(正在錄音或?qū)懭胍纛l流)的音量變化時(shí),會多次通過此函數(shù)回調(diào)抖甘,告知應(yīng)用層當(dāng)前的音量值热鞍。
void onVolumeChanged(int var1, byte[] var2);
//開始說話。調(diào)用開始錄音方法后衔彻,會自動開啟系統(tǒng)錄音機(jī)薇宠,錄音機(jī)開啟后會回調(diào)該函數(shù)
void onBeginOfSpeech();
//結(jié)束說話。SDK檢測到音頻的靜音斷點(diǎn)時(shí)艰额,會回調(diào)此函數(shù)
void onEndOfSpeech();
//返回結(jié)果 返回的結(jié)果可能為null澄港,請?jiān)黾优袛嗵幚怼?void onResult(RecognizerResult result, boolean islastWord);
///錯誤回調(diào) 當(dāng)此函數(shù)回調(diào)時(shí),說明當(dāng)次會話出現(xiàn)錯誤柄沮,會話自動結(jié)束回梧,錄音也會停止
void onError(SpeechError var1);
//事件拓展接口,由具體業(yè)務(wù)約定
void onEvent(int var1, int var2, int var3, Bundle var4);
二祖搓、語音合成篇
1狱意、語音合成方案選擇
公司 | 相關(guān)產(chǎn)品 | 特點(diǎn) |
---|---|---|
科大訊飛 | 滴滴出行、高德地圖拯欧、攜程详囤、叮咚音響 | - |
百度 | iReader、逍遙西游 | 免費(fèi)镐作! 技術(shù)實(shí)力也較為強(qiáng)大 |
語音合成方面纬纪,推薦上面兩家蚓再,也是市場上使用率較高的兩家。我們使用的是百度的包各,百度的開發(fā)文檔摘仅,社區(qū)內(nèi)容,確實(shí)沒有訊飛的全面问畅,不過按百度當(dāng)前的速度娃属,兩者的差距會很快被磨平,更重要的是百度免費(fèi)护姆!
2矾端、百度語音合成調(diào)研
-
接口模式:
- REST API 方式。 基于HTTP方式調(diào)用接口卵皂,每次下載全部的語音合成內(nèi)容秩铆。
- SDK方式。和REST API的區(qū)別在于支持邊下邊播灯变。
-
SDK識別模式的選擇殴玛。提供了兩種模式:
- 純在線合成。 任何網(wǎng)絡(luò)條件下都會連接百度服務(wù)器添祸,如果連接失敗滚粟,則合成失敗
- 離在線混合合成。區(qū)分用戶的網(wǎng)絡(luò)環(huán)境選擇在線或離線刃泌。網(wǎng)絡(luò)連接失敗自動切換為離線凡壤。離在線模式下還按網(wǎng)絡(luò)分為不同模式
-
SDK引入的Size大小
- 純在線模式。jar包380K + so庫1.6M
- 離在線混合模式:在純在線模式基礎(chǔ)上耙替,額外增加:聲音數(shù)據(jù)包260K/種 + 文本模型包4.5M
3亚侠、百度語音合成使用
我們選擇的是純在線模式。在使用前需要完成注冊俗扇,設(shè)置合成參數(shù)
private void initSpeechSynthesizer(Context context) {
SpeechSynthesizer mSpeechSynthesizer = SpeechSynthesizer.getInstance();
SynthesizerListener mSynthesizerListener = new SynthesizerListener();
//完成SDK的注冊
mSpeechSynthesizer.setAppId(BAIDU_APPID);
mSpeechSynthesizer.setApiKey(BAIDU_APIKEY, BAIDU_SECRETKEY);
mSpeechSynthesizer.setContext(context);
mSpeechSynthesizer.setSpeechSynthesizerListener(mSynthesizerListener);
mSpeechSynthesizer.auth(TtsMode.ONLINE); //純在線識別
mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");// 設(shè)置發(fā)聲的人聲音硝烂,在線生效
mSpeechSynthesizer.initTts(TtsMode.ONLINE); // 初始化在線模式
}
具體使用:
// 進(jìn)行播報(bào)
mSpeechSynthesizer.speak(String content)
// 停止播報(bào)
mSpeechSynthesizer.stop()
4、其他注意
額外說下SpeechSynthesizer.auth(TtsMode.ONLINE)方法狐援,按照文檔描述钢坦,auth()接口用于測試開發(fā)者是否成功申請了在線或者離線授權(quán)究孕。 不過在項(xiàng)目上線后發(fā)現(xiàn)該方法引發(fā)了較多ANR問題啥酱。經(jīng)過分析發(fā)現(xiàn),第一次打開App時(shí)auth方法耗時(shí)在1.5s左右厨诸,鑒權(quán)耗時(shí)較長泞遗,我們在開發(fā)中斟薇,要根據(jù)業(yè)務(wù)場景延后加載或進(jìn)行異步處理;除此之外刨疼,和百度同學(xué)溝通后,確定對于純在線模式挣郭,auth方法也可以不調(diào)用(好坑,demo和文檔中并沒有此描述)