TTS语音播报实践

文章探讨了Android平台TextToSpeech技术的使用,包括其监听器、文件合成、播放控制,以及在Android11的适配和不同手机品牌对TTS支持的现状。重点强调了如何处理不支持的手机,通过云端TTS和优化解决方案来确保服务可用。
摘要由CSDN通过智能技术生成


mSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {
          //播报开始
        }

        @Override
        public void onDone(String utteranceId) {
          //播报结束
        }

        @Override
        public void onError(String utteranceId) {
          //播报出错
        }
      });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
开始播报
long utteranceId = System.currentTimeMillis();
    HashMap ttsOptions = new HashMap<String, String>();
    ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
        String.valueOf(utteranceId));//utterance,这个参数随便写,用于监听播报完成的回调中
    ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_VOLUME, String.valueOf(1));//音量
    ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_NOTIFICATION));//播放类型
    int ret = mSpeech.speak(tts, TextToSpeech.QUEUE_FLUSH, ttsOptions);
    if (ret == TextToSpeech.SUCCESS) {
      //播报成功
    }
1
2
3
4
5
6
7
8
9
10
11
文本转换为语音文件
long utteranceId = System.currentTimeMillis();
File file = new File("/sdcard/audio_" + utteranceId + ".wav");
int ret = synthesizeToFile("xxxxx", null, file, String.valueOf(utteranceId));
if (ret == TextToSpeech.SUCCESS) {
      //合成文件成功
    }
1
2
3
4
5
6
停止播放
调用mSpeech.stop();此时会触发UtteranceProgressListener的onDone回调。

销毁引擎
mSpeech.shutdown();
1
Android11适配
为兼容Android11系统手机,我们需要在应用程序AndroidManifest.xml文件中增加如下声明:

  <queries>
    <intent>
      <action android:name="android.intent.action.TTS_SERVICE"/>
    </intent>
  </queries>
1
2
3
4
5
3.5.x版本Gradle需要使用3.5.4以上版本才能识别queries属性。

TextToSpeech手机兼容性问题
系统自带TextToSpeech API使用很方便,但是有些不支持中文引擎的手机就很头疼,而且市面上哪些手机支持哪些手机不支持我们没有底,所以线上跑了一波以后拿到了目前市面手机TextToSpeech中文引擎的支持情况。收集了694款手机,有90款不支持的手机。具体型号如下:

+--------------------------------------+
| Xiaomi MI+9+Transparent+Edition      |
| Xiaomi MI+8                          |
| OnePlus GM1900                       |
| OnePlus GM1910                       |
| Redmi M2006C3LC                      |
| OnePlus IN2020                       |
| meizu 16T                            |
| Xiaomi MI+MAX+3                      |
| OnePlus ONEPLUS+A6010                |
| OnePlus ONEPLUS+A5010                |
| meizu meizu+17                       |
| Redmi Redmi+K30                      |
| OnePlus KB2000                       |
| OnePlus HD1900                       |
| OnePlus ONEPLUS+A6000                |
| meizu 16s                            |
| Xiaomi M2102K1C                      |
| Xiaomi M2002J9E                      |
| Redmi M2007J17C                      |
| OnePlus IN2010                       |
| meizu meizu+17+Pro                   |
| nubia NX659J                         |
| meizu 16s+Pro                        |
| meizu meizu+16Xs                     |
| Xiaomi Mi+10                         |
| Lenovo Lenovo+L78051                 |
| meizu MEIZU+18                       |
| OnePlus HD1910                       |
| Hisense HLTE226T                     |
| xiaomi Redmi+Note+8                  |
| Redmi Redmi+K30i+5G                  |
| Redmi M2007J3SC                      |
| Redmi M2004J19C                      |
| Redmi Redmi+Note+8+Pro               |
| Redmi M2104K10AC                     |
| xiaomi Redmi+Note+7                  |
| Redmi M2003J15SC                     |
| Xiaomi MIX+2S                        |
| Redmi Redmi+K30+Pro                  |
| nubia NX627J                         |
| Xiaomi MI+CC9+Pro                    |
| Redmi Redmi+K30+5G                   |
| meizu MEIZU+18+Pro                   |
| Xiaomi MI+9                          |
| Xiaomi M2102K1AC                     |
| Xiaomi MI+8+UD                       |
| blackshark AWM-A0                    |
| Xiaomi M2011K2C                      |
| Xiaomi MI+8+Lite                     |
| Sony XQ-AT72                         |
| Xiaomi Mi+10+Pro                     |
| Xiaomi M2102J2SC                     |
| OnePlus ONEPLUS+A5000                |
| Xiaomi M2101K9C                      |
| Redmi M2103K19C                      |
| xiaomi Redmi+Note+7+Pro              |
| nubia NX616J                         |
| Redmi M2012K10C                      |
| Xiaomi MIX+3                         |
| Redmi M2004J7AC                      |
| Xiaomi MI+CC9+Pro+Premium+Edition    |
| nubia NX619J                         |
| Xiaomi M2007J1SC                     |
| koobee X60+Pro                       |
| Xiaomi Redmi+K20+Pro                 |
| SMARTISAN DT1901A                    |
| Redmi M2004J7BC                      |
| asus ASUS_I001DA                     |
| HONOR HLK-AL00a                      |
| Redmi M2006J10C                      |
| Redmi M2012K11AC                     |
| blackshark SHARK+PRS-A0              |
| HONOR BKL-AL20                       |
| SMARTISAN DT1902A                    |
| ZTE ZTE+A2322                        |
| Redmi M2007J22C                      |
| blackshark SKW-A0                    |
| Nokia Nokia+X7                       |
| Redmi M2012K11C                      |
| HUAWEI MAR-AL00                      |
| Redmi Redmi+K30+Pro+Zoom+Edition     |
| nubia NX669J                         |
| Meizu 16+X                           |
| Xiaomi Redmi+K20+Pro+Premium+Edition |
| asus ASUS_I005DA                     |
| blackshark SHARK+KLE-A0              |
| Xiaomi MI+6                          |
| motorola XT2125-4                    |
| GIONEE 20190619G                     |
| HUAWEI ART-AL00m                     |
+--------------------------------------+

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
因为大部分手机使用了手机系统TTS服务,对于少量不支持的手机我们可以通过走云端TTS合成,因为已经在我们的成本访问。也可以牺牲包体积和音质,通过拼接合成的方式在不支持的手机上提供TTS服务。

有些支持比较好的,如华为,可以在设置中选择发音音色。在系统设置—辅助功能—无障碍—文本转语音路径下可以选择引擎,调节语速音调:

并且点击引擎选项可以安装引擎提供的发音人语音包,并选择发音人:

总结
本文总结了TTS的现状及发展,并介绍了移动端实现TTS的几种方式以及如何系统提供的TextToSpeech API、系统API的局限、如何做兼容性等
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值