3.2 voicemodule(语音模块)

<br/><p> * 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中。如下图所示: ![图片.png](https://sjwx.easydoc.xyz/72919679/files/kahjiz1g.png) ![图片.png](https://sjwx.easydoc.xyz/72919679/files/kahjj4ng.png) 然后,通过语音控制类的VoiceMediator的 ~~~ /** 进入/退出唤醒模式 */ public void setWakeUpMode(boolean flag) /** 打开唤醒 */ public void startWakeup() /** 停止唤醒 */ public void stopWakenup() ~~~ 可以对语音唤醒进行控制。