|
@@ -0,0 +1,155 @@
|
|
|
+# TTS音频播放基础
|
|
|
+#### 目录介绍
|
|
|
+- 01.TTS简单的描述
|
|
|
+- 02.TTS简单的案例
|
|
|
+- 03.TTS播报监听处理
|
|
|
+- 04.TTS播报异常分析
|
|
|
+- 05.TTS播放音频案例
|
|
|
+- 06.TTS播放测试用例
|
|
|
+- 08.TTS接口设计架构
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 01.TTS简单的描述
|
|
|
+- TTS全称Text To Speech ,是文本转语音服务
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+### 02.TTS简单的案例
|
|
|
+#### 2.1 初始化tts
|
|
|
+- 代码如下所示
|
|
|
+ ```
|
|
|
+ textToSpeech = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
|
|
|
+ @Override
|
|
|
+ public void onInit(int status) {
|
|
|
+ if (!mReady && (TextToSpeech.SUCCESS == status) && textToSpeech != null) {
|
|
|
+ VideoLogUtils.i("Initialize TTS success");
|
|
|
+ //获取locale
|
|
|
+ final Locale locale = mContext.getApplicationContext()
|
|
|
+ .getResources().getConfiguration().locale;
|
|
|
+ if (locale != null) {
|
|
|
+ VideoLogUtils.i("tts isLanguageAvailable " + mTts.isLanguageAvailable(locale) +
|
|
|
+ "; variant is " + locale.getVariant() +
|
|
|
+ "; locale is " + locale + " ; country is " + locale.getCountry());
|
|
|
+ }
|
|
|
+ //设置朗读语言
|
|
|
+ int setLanguage = this.textToSpeech.setLanguage(null != locale ? locale : Locale.getDefault());
|
|
|
+ switch (setLanguage) {
|
|
|
+ case TextToSpeech.LANG_MISSING_DATA:
|
|
|
+ VideoLogUtils.i("TTS set language: Language missing data");
|
|
|
+ break;
|
|
|
+ case TextToSpeech.LANG_NOT_SUPPORTED:
|
|
|
+ VideoLogUtils.i("TTS set language: Language not supported");
|
|
|
+ break;
|
|
|
+ case TextToSpeech.LANG_AVAILABLE:
|
|
|
+ VideoLogUtils.i("TTS set language: Language available");
|
|
|
+ break;
|
|
|
+ case TextToSpeech.LANG_COUNTRY_AVAILABLE:
|
|
|
+ VideoLogUtils.i("TTS set language: Language country available");
|
|
|
+ break;
|
|
|
+ case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
|
|
|
+ VideoLogUtils.i("TTS set language: Language country var available");
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ VideoLogUtils.i("TTS set language: Unknown error");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else if (TextToSpeech.ERROR == status) {
|
|
|
+ VideoLogUtils.i("Initialize TTS error");
|
|
|
+ } else {
|
|
|
+ VideoLogUtils.i("Initialize TTS error");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ ```
|
|
|
+
|
|
|
+
|
|
|
+#### 2.2 如何进行初始化
|
|
|
+- 如何进行播放?
|
|
|
+ ```
|
|
|
+ textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);
|
|
|
+ ```
|
|
|
+- 循环播放语音
|
|
|
+ - 想让他报个2-3遍或者循环播报的时候,我们来试一下
|
|
|
+ ```
|
|
|
+ for (int i=0 ; i<5 ; i++){
|
|
|
+ textToSpeech.speak("简单播放tts,"+i, TextToSpeech.QUEUE_FLUSH, null);
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ - 简单的不行,但是问题来了,一段长的文字他只播报前面几个字,然后又重新开始播报。
|
|
|
+ - 这是因为textToSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, null);这个方法会自动关闭掉上面一个播报的内容,从而进行新一轮的播报。
|
|
|
+- 播放完成后再播放
|
|
|
+ - 要等上一条播报完整了再进行播报,该如何操作呢?那么可以TTS有 isSpeaking() 这个方法
|
|
|
+ ```
|
|
|
+ for (int i=0 ; i<5 ; i++){
|
|
|
+ if (!textToSpeech.isSpeaking()){
|
|
|
+ textToSpeech.speak("简单播放tts,"+i, TextToSpeech.QUEUE_FLUSH, null);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ - 这样就可以播全了嘛? 非也,for循环飞快的跑只要发现在speaking那么直接跳过开始走下一个i
|
|
|
+- 如何正确循环播放
|
|
|
+ ```
|
|
|
+ for (int i=0 ; i<5 ; i++){
|
|
|
+ textToSpeech.speak("简单播放,"+i, TextToSpeech.QUEUE_ADD, null);
|
|
|
+ }
|
|
|
+ ```
|
|
|
+ - 这样就相当于在一个消息队列然后进行循环的播报。
|
|
|
+
|
|
|
+
|
|
|
+### 03.TTS播报监听处理
|
|
|
+- 关于监听tts状态如下所示:
|
|
|
+ ```
|
|
|
+ private final class OnCompleteListener extends UtteranceProgressListener {
|
|
|
+
|
|
|
+ OnCompleteListener() {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 播放完成。这个是播报完毕的时候 每一次播报完毕都会走
|
|
|
+ * @param utteranceId 话语id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onDone(final String utteranceId) {
|
|
|
+ VideoLogUtils.i("TTSPlayer OnCompleteListener onDone");
|
|
|
+ onCompleted();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 播放异常
|
|
|
+ * @param utteranceId 话语id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onError(final String utteranceId) {
|
|
|
+ VideoLogUtils.i("TTSPlayer OnCompleteListener onError");
|
|
|
+ stop();
|
|
|
+ onError("TTSPlayer has play fail : " + utteranceId);
|
|
|
+ onCompleted();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 播放开始。这个是开始的时候。是先发声之后才会走这里
|
|
|
+ * 调用isSpeaking()方法在这为true
|
|
|
+ * @param utteranceId 话语id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onStart(final String utteranceId) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ```
|
|
|
+
|
|
|
+
|
|
|
+### 08.TTS接口设计架构
|
|
|
+
|
|
|
+
|
|
|
+### 参考
|
|
|
+- https://blog.csdn.net/qq_30359699/article/details/105388575
|
|
|
+- https://blog.csdn.net/awodefengduanwu/article/details/105683306
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|