* voicemodule是app的外部依賴Module,包含有語音識別、合成、喚醒三大功能。靈聚APP當前使用的語音SDK是訊飛語音。
### RecognizerBase:語音識別器(實現類:IflyRecognizer)
* * * * *
基類RecognizerBase定義了語音識別需要的基本通用方法(作用:當開發者想要替換語音SDK時,只需另外定義一個實現類實現這些方法即可,而不需要替換整個voicemodule),而實現類IflyRecognizer則是對訊飛語音識別的封裝,并實現基類定義的方法。其中IflyRecognizer的兩個變量long_record_mode,long_time_record控制著語音的識別模式。
| long_record_mode | long_time_record | 識別模式 |
| --- | --- | --- |
| -1(默認) | false(默認) | 訊飛正常識別,本地不錄音,不保存錄音文件 |
| 0(CREATE_MEMO_MODE) | true | 無限時音頻流識別,本地錄音,不保存錄音文件 |
| 1(MODIFY_MEMO_MODE) | true | 無限時音頻流識別,本地錄音,不保存錄音文件 |
| 2(DEFAULT_TAPE) | true | 訊飛正常錄音,本地錄音,保存錄音文件 |
| 3(LONG_TAPE) | true | 無限時音頻流識別,本地錄音,保存錄音文件 |
變量設置方法如下:
~~~
//設置long_record_mode
public void setLong_record_mode(int)
//設置long_time_record
public void setRecognizeMode(boolean)
~~~
### SynthesizerBase:語音合成器(實現類:IflySynthesizer)
* * * * *
基類和實現類的作用同上,不一樣的是IflySynthesizer的語音合成方法是使用了RxJava的。其好處是使得語音合成在一個獨立的線程進行,方便控制和管理,且不阻塞主線程。
語音合成示例:
~~~
SpeechMsgBuilder builder = SpeechMsgBuilder.create("合成文本");
/*可選設置,設置合成后執行的語音動作
(SpeechMsg.CONTEXT_KEEP_RECOGNIZE:合成后自動開啟識別
SpeechMsg.CONTEXT_KEEP_AWAKEN:合成后自動試圖打開喚醒) */
//builder.setContextMode(SpeechMsg.CONTEXT_KEEP_RECOGNIZE);
//合成聲音
SynthesizerBase.get().startSpeakAbsolute(builder.build())
.doOnNext(new Consumer<SpeechMsg>() {
@Override
public void accept(SpeechMsg speechMsg) throws Exception {
if (speechMsg.state() == SpeechMsg.State.OnBegin) {
//發送合成動畫開始事件
EventBus.getDefault().post(new SynthesizeEvent(SynthesizeEvent.SYNTH_START));
}
}
})
.doOnComplete(new Action() {
@Override
public void run() throws Exception {
//發送合成動畫結束事件
EventBus.getDefault().post(new SynthesizeEvent(SynthesizeEvent.SYNTH_END));
}
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.computation())
.subscribe();
~~~
* SpeechMsgBuilder:合成信息建造者,包含了合成信息對象以及合成信息的來源、優先級、合成后動作等設置。
### WakeupEngineBase:語音喚醒器(實現類:VoiceAwakener )
* * * * *
特別的,喚醒屬于訊飛語音的定制服務,需要開發者在[訊飛開放平臺](http://www.xfyun.cn/services/awaken?type=awaken)購買服務并定制喚醒詞。然后將訊飛SDK開發包的\res\ivw\路徑下的喚醒資源文件引入到 \voicemodule\src\main\assets\ivw\ 中,將訊飛appid填入\voicemodule\src\main\res\values\strings.xml的app_id中。如下圖所示:


然后,通過語音控制類的VoiceMediator的
~~~
/** 進入/退出喚醒模式 */
public void setWakeUpMode(boolean flag)
/** 打開喚醒 */
public void startWakeup()
/** 停止喚醒 */
public void stopWakenup()
~~~
可以對語音喚醒進行控制。