SDK 支持细粒度的播放进度回调。开发者可以在收到 MESSAGE_TYPE_TTS_PLAYBACK_PROGRESS
状态回调时,解析附加的 data
字段,获得播放进度(单位:百分比),格式如下:
{ "progress": 0.3, "reqid": "bb081d44-0671-4789-8df5-0050edae517b", }
SDK 返回的播放进度是当句已播放的音频长度除以该句音频的总长度:
综上,如果开发者想要获得准确的播放进度,建议根据标点(;!?。!?;…)对文本进行分割,分句提前合成进行缓存。该策略下,已完成合成的句子,后续的播放进度为准确值。
SDK 支持鉴权证书下载功能,因为没有必要每次初始化都重新下载证书,所以下载只可能在以下几种情况才会触发:
如果需要语音合成 SDK 在后台播报,就可能遇到其他应用使用播放器或录音机的场景。针对这几种情况,我们推荐开发者参考下面的示例代码进行处理,篇幅有限故仅展示核心代码,完整样例程序可参考 Demo 源码。以下示例代码实现了几种效果:
通过请求、抛弃 Audio Focus
并注册相应的 Listener 完成相应的处理:
// Add this code to the onCreate method mAFChangeListener = new AudioManager.OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_GAIN: Log.d(SpeechDefines.TAG, "onAudioFocusChange: AUDIOFOCUS_GAIN, " + mResumeOnFocusGain); if (mResumeOnFocusGain) { mResumeOnFocusGain = false; resumePlayback(); } break; case AudioManager.AUDIOFOCUS_LOSS: Log.d(SpeechDefines.TAG, "onAudioFocusChange: AUDIOFOCUS_LOSS"); mResumeOnFocusGain = false; pausePlayback(); break; case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: Log.d(SpeechDefines.TAG, "onAudioFocusChange: AUDIOFOCUS_LOSS_TRANSIENT"); mResumeOnFocusGain = mEngineStarted; pausePlayback(); break; } } }; mAudioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE); // Invoke this method before StartEngine public void AcquireAudioFocus() { // requesting audio focus and processing the response int res = mAudioManager.requestAudioFocus(mAFChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (res == AudioManager.AUDIOFOCUS_REQUEST_FAILED) { mPlaybackNowAuthorized = false; } else if (res == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { mPlaybackNowAuthorized = true; } } // Add this code in MESSAGE_TYPE_ENGINE_STOP process methoid if (mPlaybackNowAuthorized) { mAudioManager.abandonAudioFocus(mAFChangeListener); mPlaybackNowAuthorized = false; }
在华为 P30
手机,EMUI 11.0.0.142
上,测试中发现有时会出现播放器音量变低的情况。目前认为这是一个系统 bug, 在系统自带音频播放器上也存在这样的现象。
在部分 Android 机型(魅族 16th
, 酷派大神 Note3
)上,如果应用没有使用 foreground services
,会出现后台播报卡顿的现象。目前认为这是一种系统行为,建议有后台播放需求的调用方为应用添加 foreground services
。