1 總體思路javascript
需求:前端
語音輸入功能:java
1 提供問題語音播報功能android
2 支持語音輸入功能api
3 語音輸入須要邊輸入邊識別,並把識別後的結果傳給前端展現app
4 若是用戶發現語音輸入不是本身想要的,能夠從新輸入函數
5 若是用戶不想語音輸入,能夠關閉語音輸入。this
前端與andriod交互apiurl
andriod apispa
KFZ.startRecorder: 開始錄音
KFZ.stopRecorder: 關閉錄音api
KFZ.cancelRecorder: 取消本次錄音
前端api
window['onduration']: 供android端持續調用[javascript:window. + 'callbackname'方式調用],前端經過支持該方法時,傳遞迴調函數,不斷往頁面中追加內容
window['onsuccess']: 供android端調用[javascript:window. + 'callbackname'方式調用],通知前端本次錄音結束。
window['onfailed']: 供android端調用[javascripte:window. + 'callbackname方式調用'],以通知前端 本次錄音識別失敗。
前端實現:
1 語音播報功能,根據後臺返回的音頻資源url進行語音播放;
var audio = createAudio('audio'); audio.src = url;
function createAudio(id) { var audio = $(id); if (audio) { document.body.removeChild(audio); } audio = document.createElement('audio'); audio.id = id; audio.style.display = 'none'; document.body.appendChild(audio); return audio }
2 建立錄音對象,添加語音調用接口
var Recorder = { started: false, ending: false, start: function (dsuccess, esuccess, efailed) { this.started = true; KFZ.startRecorder(); window['ondurative'] = function (res) {// 持續識別 dsuccess(res); }; window['onsuccess'] = function (res) {// 持續識別 esuccess(res); deleteApi(); }; window['onfailed'] = function (res) { // 錄音識別失敗結束 efailed(res); deleteApi(); }; }, stop: function () { if (!this.started) { return; } KFZ.stopRecorder(); this.started = false; }, cancel: function () { if (!this.started) { return; } KFZ.cancelRecorder(); this.started = false; } };
function deleteApi() { //刪除沒必要要的引用定義,防止內存泄漏
if (window.ondurative) {
window.ondurative = null;
}
if (window.onsuccess) {
window.onsuccess = null;
}
if (window.onfailed) {
window.onfailed = null;
}
}
2.1 監聽語音播報結束事件('ended'), 開始調用android startRecorder接口
audio.addEventListener('ended', function () {
Recorder.start(function duration(durationres) {},
function success(susres) {},
function failed(failres) {});
});
3 從新輸入功能實現
調用andriod接口 KFZ.cancel方法結束;
調用KFZ.startRecorder方法,從新啓動語音輸入;
調用deleteApi
4 關閉當前錄音:調用KFZ.stop通知andriod結束當前的錄音功能。
調用andriod接口 KFZ.cancelRecorder方法取消當前錄音
調用deleteApi