* 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中。如下图所示:
![](https://box.kancloud.cn/ec574cf160d7635288c1f718fb88b254_279x322.png)
![](https://box.kancloud.cn/27f5f438bf7fc127428926cdd3dce16e_1163x346.png)
然后,通过语音控制类的VoiceMediator的
~~~
/** 进入/退出唤醒模式 */
public void setWakeUpMode(boolean flag)
/** 打开唤醒 */
public void startWakeup()
/** 停止唤醒 */
public void stopWakenup()
~~~
可以对语音唤醒进行控制。