Android TTS语音播报实践

在工作中遇到了语音播报的需求,在收到push后,用语音播报push携带的播报内容。类似于微信支付宝的收款信息一样。调研后主要的语音播报方案有一下几种:

  1. 基于第三方的TTS SDK,如百度、思必驰、讯飞等;
  2. 自研Native的TTS引擎+模型;
  3. 基于云端的TTS方案;
  4. 使用手机自带的TTS引擎。

无外乎就是自研或者采购,本地或者云端。

先来点废话,介绍下TTS的发展。

TTS 现状及发展

语音合成又称文语转换(Text to Speech,TTS)技术,是语音处理领域的一个重要的研究方向,旨在让机器生成自然动听的人类语音。

TTS技术主要分为两种:

  • 通用TTS:适用于导航、语音播报、智能客服和大多数语音交互场景;
  • 个性化TTS:主要应用于对声音质量较高的教育、长音频、直播以及影视游戏配音等场景中。

语音合成模型经过长时间的发展,由最初的基于拼接合成,到参数合成,逐渐达到了现阶段感情充沛的基于端到端合成,最新一代端到端合成降低了对语言学知识的要求,可批量实现多语种的合成系统,语音自然程度高。

语音合成技术内部分为前端和后端。

  • 前端主要负责文本的语音解析和处理,其处理内容主要包括语种、分词、词性预测、多音字处理、韵律预测、情感等。把文本上的发音的这些信息都预测出来之后,将信息送给TTS后端系统,后台声学系统融合这些信息后,将内容转换为语音。
  • 后端声学系统从第一代的语音拼接合成,到第二代的语音参数合成,到第三代端到端合成,后端声学系统的智能化程度逐步增加,训练素材需要标记的详细程度和难度也在逐步减弱。

TTS在语音交互场景里的应用:

基于拼接合成

为了更好的拟合人声,拼接合成技术需要一个大规模的真人音库,音库内容按照音素和不同特征进行标注,合成时根据语言学特征寻找符合的音素,拼接起来完成合成。

  • 优点:效果接近真人,运算量低
  • 缺点:拼接而成,语音不连贯,依赖音库,需要人工介入制定很多挑选规则和参数,制作成本高。

基于参数合成

通过深度学习构建文本特征和音库之间的映射关系,构建参数合成模型,当输入一个语言学特征时,基于神经网络给出音频特征,后通过声码器合成语音波形。

  • 优点:音库数量需求不多,合成语音连接平稳,质量高;
  • 缺点:对声码器依赖程度高,同时,由于传统参数系统建模时存在信息损失,限制了合成语音表现力的进一步提升。

基于端到端(Tactron为例)

端到端语音合成一定程度上解决了拼接合成和参数合成存在的缺陷。端到端合成系统直接输入文本或者注音字符,通过文本或者文本特征和语音直接建模,跳过声码器阶段,减少对声码器的依赖,弱化前端概念。

  • 优点:降低对语音学知识的要求,可方便的在不同语种上复制,批量实现几十种甚至更多语种的合成系统,语音自然程度高;
  • 缺点:运算量大,无法人工调优,实时性低。

方案选择

做这个功能的时候公司已经有团队在自研TTS引擎了,而且云端TTS服务已经跑起来了,并且之前也在外部采购了些云端TTS服务。但是由于我们的Push推送量级很大,不管是外采还是自研云端引擎的成本都很高,出于成本考虑,我们选择只能考虑使用端上的方案。

客户端实现有三种方案:

  1. 外采:出于成本考虑,淘汰;
  2. 自研引擎:语音团队基于参数的合成引擎已完成开发,但是没有人力支撑后续的调试,而播报的话术比较固定,并且对合成声音的音质要求不是特别高,所以选择了一种基于拼接的合成方案作为备选,语句的前部分和后部分使用完整的语音,中间变换部分通过逐字方式合成;
  3. 手机自带TTS引擎:Android系统已自带了TTS引擎,但是并不是所有的手机都带了中文引擎。

Android TTS引擎使用

初始化TTS引擎

class TTSListener implements TextToSpeech.OnInitListener {@Overridepublic void onInit(int status) {if (mSpeech != null) {int isSupportChinese = mSpeech.isLanguageAvailable(Locale.CHINESE);//是否支持中文mSpeech.getMaxSpeechInputLength();//最大播报文本长度if (isSupportChinese == TextToSpeech.LANG_AVAILABLE) {int setLanRet = mSpeech.setLanguage(Locale.CHINESE);//设置语言int setSpeechRateRet = mSpeech.setSpeechRate(1.0f);//设置语int setPitchRet = mSpeech.setPitch(1.0f);//设置音量String defaultEngine = mSpeech.getDefaultEngine();//默认引擎if (status == TextToSpeech.SUCCESS) {//初始化TextToSpeech引擎成功,初始化成功后才可以play等}}} else {//初始化TextToSpeech引擎失败}}}TextToSpeech mSpeech = new TextToSpeech(ContextHolder.appContext(), new TTSListener());

设置播报状态回调

mSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {@Overridepublic void onStart(String utteranceId) {//播报开始}@Overridepublic void onDone(String utteranceId) {//播报结束}@Overridepublic void onError(String utteranceId) {//播报出错}});

开始播报

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) {//播报成功}

文本转换为语音文件

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) {//合成文件成功}

停止播放

调用mSpeech.stop();此时会触发UtteranceProgressListener的onDone回调。

销毁引擎

mSpeech.shutdown();

Android11适配

为兼容Android11系统手机,我们需要在应用程序AndroidManifest.xml文件中增加如下声明:

  <queries><intent><action android:name="android.intent.action.TTS_SERVICE"/></intent></queries>

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                     |
+--------------------------------------+

因为大部分手机使用了手机系统TTS服务,对于少量不支持的手机我们可以通过走云端TTS合成,因为已经在我们的成本访问。也可以牺牲包体积和音质,通过拼接合成的方式在不支持的手机上提供TTS服务。

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

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

总结

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

作者:轻口味
链接:https://juejin.cn/post/7025531623017807886

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集
在这里插入图片描述
二、源码解析合集

在这里插入图片描述
三、开源框架合集

在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,可扫描文末CSDN官方认证微信卡片免费领取↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/42611.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

感谢ChatGPT,救了我狗的命!

前一段时间&#xff0c;国外一位小哥哥在推特上发布了一条消息&#xff0c;声称GPT-4拯救了自家狗狗的性命。 这是怎么一回事呢&#xff1f; 这个小哥哥养了一只两岁的边境牧羊犬&#xff0c;这只牧羊犬被诊断出患有蜱传疾病&#xff0c;这属于一种细菌性传染病。 虽然小哥哥一…

ChatGPT热潮下水力模型的思考

ChatGPT横空出世&#xff0c;快速火爆全球&#xff0c;基于大数据、大算力的人工智能技术来势汹汹、势不可挡&#xff0c;似乎要革全世界打工人的命! 本人多年来一直从事供排水系统水力建模和应用相关的工作&#xff0c;在水行业里&#xff0c;算是跟数据和模型打交道比较多了。…

chatgpt赋能python:Python基础词汇解析

Python基础词汇解析 作为一门流行且易学的编程语言&#xff0c;Python在很多场合得到了广泛的应用。在学习Python编程的过程中&#xff0c;掌握各类基础词汇是非常关键的。本文将介绍Python编程中一些常见且重要的基础词汇&#xff0c;帮助大家更好地了解和掌握Python编程。 …

全网最全的AI绘画提示词网站,看这一篇就够了!

要说2023年什么最火&#xff0c;绝对是以ChatGPT为代表的AI工具了&#xff0c;特别是AI绘画&#xff0c;而用好AI的关键&#xff0c;就是要学会使用关键词&#xff0c;也叫提示词&#xff0c;提示词是AI绘画的核心&#xff0c;本次就给大家分享几个AI绘画关键词网站&#xff0c…

ChatGPT+markmap,1分钟帮我写完了一份测试用例

近段时间&#xff0c;我相信没有人不知道AI吧&#xff0c;今天&#xff0c;我尝试了下&#xff0c;用ChatGPT来写测试用例&#xff0c;而且顺带在markmap生成了脑图&#xff0c;整个过程非常丝滑&#xff0c;下面分享给大家&#xff0c;希望对大家有所启发。 1、使用ChatGPT提问…

【ChatGPT|AI 应用】如何用 ChatGPT 快速制作思维导图

应用背景 ChatGPT 应用越来越广&#xff0c;前面的文章有介绍【如何用 ChatPDF 秒读论文】&#xff0c;它能帮助我们更快的提炼 PDF 文献的重点&#xff0c;帮助我们快速阅读&#xff01;接下来&#xff0c;我们将进一步使用 ChatGPT 生成思维导图&#xff0c;建立记忆链接。本…

OpenAI发布AGI路线图,AGI或成为人类的巨大力量增幅器!网友:适应or死亡

编&#xff5c;桃子 昕朋源&#xff5c;新智元 ChatGPT爆火出圈让人们开始重新思考人工智能的未来在哪&#xff1f;恰在昨日&#xff0c;OpenAI发布了通用人工智能路线图&#xff0c;分享了其对AGI的短期和长期规划。 继ChatGPT成当红炸子鸡后&#xff0c;微软、谷歌、Meta等大…

“释放你内心的艺术家:用我们的革命性API接口探索绘画世界“(免费API绘画接口)

接口调用介绍 文章目录 接口调用介绍前言一、在线文档地址二、使用步骤1.请求方式2.注意事项3.header4.请求参数5.请求示例6.返回结果&#xff1a;7.返回示例8.效果图集合 总结 前言 绘画是一种充满创造力和想象力的艺术形式&#xff0c;许多人喜欢通过绘画来表达自己的情感和…

推荐一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器!

点击关注 &#x1f449; JAVA日知录 2023-04-28 08:32 发表于安徽 收录于合集#开发工具14个 什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。Bit…

文心一言是中文版的ChatGPT?多角度分析猜测文心一言到底是什么?

文心一言是中文版的ChatGPT&#xff1f;多角度分析/猜测文心一言到底是什么&#xff01; ChatGPT爆火网络&#xff0c;一时间风靡不断。 AI替代人类工作的传言四起 宣布ChatGPT类似产品的公司股价大涨&#xff0c;这到底是什么&#xff1f; 国产的类似产品到底到了什么程度…

chatgpt赋能python:Python中数字相乘的简介和应用

Python中数字相乘的简介和应用 什么是Python数字相乘 在Python编程语言中&#xff0c;数字相乘是一个很常见的计算操作&#xff0c;它用于将两个数字相乘&#xff0c;结果是乘积。Python的数字类型可以是整数、浮点数或复数。Python支持三种基本算术运算符&#xff1a;加号&a…

李永乐团队2021数学基础过关660题勘误表

李永乐团队2021数学基础过关660题勘误表 附&#xff1a;各大高校专业课资料整理可以看一下我的博客主页上传的资源哦&#xff01;感谢关注&#xff0c;评论♥点个赞再白嫖呗☞2333

【考研数学】张宇1000题,汤家凤1800,李永乐660,应该怎么选择?

这三本练习册&#xff0c;想必没有人不知道。 什么&#xff1f;你不知道&#xff1f;你肯定每天做的是假题&#xff0c;考的是假研究生&#xff01; 每年都有许多同学在选择复习资料的问题上停滞不前&#xff0c;为了选一本最好的&#xff0c;比来比去&#xff0c;一个礼拜过去…

Review of Algorithm (HITSZ) 含22年真题回忆

Review of Algorithm &#xff08;HITSZ&#xff09;含22年真题回忆 1. Time Analysis1.1 Basic1.2 Master Method1.3 Recurrence Problems 2. Sorting Algorithm2.1 Comparing Sort2.1.1 Insertion Sort2.1.2 Merge Sort 2.1.3 Shell Sort2.1.4 Lower boundary of comparison …

李永乐老师讲博弈论:帝王为啥要杀掉有功之臣

帝王为啥要杀掉有功之臣&#xff1f;李永乐老师给大家讲讲博弈论基础。 博弈论最早由数学家冯诺依曼开拓&#xff0c;后来经过约翰纳什发展&#xff0c;是数学的一个分支。博弈论所研究的是&#xff1a;在一定的规则之下&#xff0c;参与博弈的几个人通过一定的规则使自己的利…

李永乐讲卷积神经网络,卷积神经网络最新进展

BP神经网络的核心问题是什么?其优缺点有哪些? 。 人工神经网络,是一种旨在模仿人脑结构及其功能的信息处理系统,就是使用人工神经网络方法实现模式识别.可处理一些环境信息十分复杂,背景知识不清楚,推理规则不明确的问题,神经网络方法允许样品有较大的缺损和畸变.神经网络的…

傅里叶变换与反变换(李永乐老师笔记)

一) 傅里叶分解 任何一个时域空间的周期性函数都可以分解成一组正(余)弦波, (图一) 二) 傅里叶变换 时域函数 -> 频域函数 f(t) 经过F操作分解成一组正余弦波(F操作为傅里叶变换) (图二) 怎么在频域空间描述这组正余弦波呢,直觉的答案是用不同频率和相应的振幅来描述…

【笔记】ChatGPT是怎样炼成的(李宏毅2023机器学习课程引入部分)

来源&#xff1a;【授权】李宏毅2023春机器学习课程 ChatGPT太火热了&#xff0c;借此简单了解一下 ChatGPT的newbie之处在哪里&#xff1f; 同一个问题&#xff0c;它的每次回答都不同&#xff1b;处于同一个chat中&#xff0c;我可以追问多个问题&#xff0c;因为它知道上下…

登录、退出(关于token)

关于token https://www.jianshu.com/p/8d28e60af440 一般APP都是刚安装后&#xff0c;第一次启动时需要登录&#xff08;提示你需要登录或者直接启动在登录界面&#xff09;。而只要登录成功后&#xff0c;以后每次启动时都是登录状态&#xff0c;不需要每次启动时再次登录。…

ChatGPT商业版免授权源码/AI绘画系统/用户付费系统

&#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 最新 ChatGPT商业版源码&#xff0c;该产品支持用户付费套餐&#xff0c;AI 绘画&#xff0c;支付对接&#xff0c;卡密购买兑换等功能&#…