Android 离线文字转语音功能-TTS(Text To Speech)

前言

     在 Android 中,TTS全称叫做 Text to Speech,从字面就能理解它解决的问题是什么,把文本转为语音服务,意思就是你输入一段文本信息,然后Android 系统可以把这段文字播报出来。这种应用场景目前比较多是在各种语音助手APP上,很多手机系统集成商内部都有内置文本转语音服务,可以读当前页面上的文本信息。同样,在一些阅读类APP上我们也能看到相关服务,打开微信读书,里面就直接可以把当前页面直接用语音方式播放出来,特别适合哪种不方便拿着手机屏幕阅读的场景。

     Android系统从1.6版本开始就支持TTS, 不过遗憾的是系统默认的TTS引擎:Pico TTS,并不支持中文。

     在查找了许相关资料后, 发现很多的资源都已经失效, APK找不到, 对应的页面404. 更多的厂商则转成了开放平台甚至不再提供离线/免费服务.

目前找到的离线TTS

注:下面的链接可能需要科学上网才可以访问

应用名称支持离线备注下载地址
ITRI TTS下载
讯飞语记需打开一次, 但不需要登陆下载
科大讯飞语音引擎3.0推荐下载
Speech Services by Google需要科学上网, 离线需要先下载语音包下载

使用

首先, 安装对应的TTS应用, 再在设置中设置对应的语音输出服务
一般设置的步骤为: 设置>无障碍>文字转语音(TTS)输出
在这里插入图片描述
程序调用只需使用SDK标准的TTS接口即可.
在介绍TTS使用的文章中, 下面这一段的代码, 对于前面的科大讯飞或ITRI TTS并没什么效果, 只是多了一个弹窗, 当然, 也可以理解为, 这两个APP并没有按标准接口开发.

//显示应用选择窗.
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);private TextToSpeech mTts;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == MY_DATA_CHECK_CODE) {if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {// success, create the TTS instancemTts = new TextToSpeech(this, this);} else {// missing data, install itIntent installIntent = new Intent();installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);startActivity(installIntent);}}
}

在这里插入图片描述

在程序中打印TTS所支持的语言及声音getAvailableLanguagesgetVoices:

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {Set<Locale> ava = mTts.getAvailableLanguages();if (ava != null) {for (Locale l : ava) {Logger.v(TAG, "supported " + l.toString());}} else {Logger.d(TAG, "no supported language");}Set<Voice> voices = mTts.getVoices();if(voices != null){for(Voice v : voices){Logger.d(TAG, "TTS Voice: " + v.toString());}}}String engine = mTts.getDefaultEngine();Logger.d(TAG, "TTS Engine = " + engine);
2022-10-18 15:21:22.577 25266-25266 TextToSpeech       com.tts.test         I  Connected to ComponentInfo{tw.pu.tts/tw.pu.tts.UttsService}
2022-10-18 15:21:22.582 25266-26006 TextToSpeech       com.tts.test         I  Set up connection to ComponentInfo{tw.pu.tts/tw.pu.tts.UttsService}
2022-10-18 15:21:22.594 25266-25266 TTS                com.tts.test         D   onInit 0
2022-10-18 15:21:22.650 25266-25266 TTS                com.tts.test         V   supported zh
2022-10-18 15:21:22.650 25266-25266 TTS                com.tts.test         V   supported en
2022-10-18 15:21:22.650 25266-25266 TTS                com.tts.test         V   supported zh__#Hans
2022-10-18 15:21:22.650 25266-25266 TTS                com.tts.test         V   supported zh__#Hant
2022-10-18 15:21:22.690 25266-25266 TTS                com.tts.test         D   TTS Voice: Voice[Name: zh, locale: zh__#Hans, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS                com.tts.test         D   TTS Voice: Voice[Name: en, locale: en, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS                com.tts.test         D   TTS Voice: Voice[Name: zh, locale: zh, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.691 25266-25266 TTS                com.tts.test         D   TTS Voice: Voice[Name: zh, locale: zh__#Hant, quality: 300, latency: 300, requiresNetwork: false, features: []]
2022-10-18 15:21:22.698 25266-25266 TTS                com.tts.test         D   TTS Engine = tw.pu.tts

注: TTS的功能需要在TextToSpeech.OnInitListener回调, 并确认状态正常后才可以开始正常工作

完整代码TTS.java

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.speech.tts.TextToSpeech;
import android.speech.tts.Voice;import java.util.Locale;
import java.util.Set;public class TTS implements TextToSpeech.OnInitListener {final String TAG = "TTS";TextToSpeech mTts;public TTS(Context context){mTts = new TextToSpeech(context, this);}public TTS(Context context, TextToSpeech.OnInitListener lis){mTts = new TextToSpeech(context, this);setOnInitListener(lis);}final int DATA_CHECK_CODE = 0x774;@Deprecatedpublic TTS(Activity activity){Intent checkIntent = new Intent(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);activity.startActivityForResult(checkIntent, 0x774);}@Deprecatedpublic void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {if (requestCode == DATA_CHECK_CODE) {if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {// success, create the TTS instancemTts = new TextToSpeech(activity, this);} else {// missing data, install itIntent installIntent = new Intent(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);activity.startActivity(installIntent);}}}public TextToSpeech getTts(){return mTts;}private void dump(){if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {Set<Locale> ava = mTts.getAvailableLanguages();if (ava != null) {for (Locale l : ava) {Logger.v(TAG, "supported " + l.toString());}//mTts.setLanguage(Locale.US);} else {Logger.d(TAG, "no supported language");}Set<Voice> voices = mTts.getVoices();if(voices != null){for(Voice v : voices){Logger.d(TAG, "TTS Voice: " + v.toString());}}}String engine = mTts.getDefaultEngine();Logger.d(TAG, "TTS Engine = " + engine);}public void setSpeechSpeed(float speed){mTts.setSpeechRate(speed);}public void setVoiceFreq(float freq){mTts.setPitch(freq);}public void speak(String s){if(mTts == null){Logger.e(TAG, "speak failed: TTS not ready");return;}int res = mTts.speak(s, TextToSpeech.QUEUE_ADD, null);if(res != 0){Logger.w(TAG, "speak failed: " + res);}else{Logger.d(TAG, "speak " + s + " done");}}public void stop(){mTts.stop();}@Overridepublic void onInit(int status) {Logger.d(TAG, "onInit " + status);if(status == 0) {dump();mTts.setPitch(1f);mTts.setSpeechRate(1f);if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {AudioAttributes attr = new AudioAttributes.Builder().setLegacyStreamType(AudioManager.STREAM_MUSIC).build();mTts.setAudioAttributes(attr);}}if(initLis != null)initLis.onInit(status);}TextToSpeech.OnInitListener initLis;public void setOnInitListener(TextToSpeech.OnInitListener initLis){this.initLis = initLis;}
}

参考

Android 中文語音引擎資源
Android中使用自带TextToSpeech实现离线语音合成功能
The 7 Best Text-to-Speech Apps for Android
Android中提供的免费文字转语音功能TextToSpeech之快速入门用法(Android TTS 语音合成播报)
An introduction to Text-To-Speech in Android

附:
文字转语音(TTS) 应用 (APK)

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

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

相关文章

微信24小时客服热线电话/如何转到人工服务办理

这个时候&#xff0c;我们就可以拨打微信服务电话到人工客服咨询中心&#xff0c;让人工客服为我们解决我们需要解决的问题和我们想要知道的信息电话接通后&#xff0c;按照微信人工服务的提示指示去做&#xff0c;这样我们就可以24小时打通微信人工服务热线&#xff1f;

在线客服功能介绍-了解常见在线客服系统的功能点

在线客服&#xff0c;通常我们说这个基本都是指IM客服(区分于电话客服等)。“客服”表示了系统的使用人群或系统功能&#xff0c;“在线”说明了交互方式。我们在日常生活中多多少少都有用到或接触过在线客服&#xff0c;比如&#xff1a; ​ 在生活中我们可能会遇到各种各样的…

微信哪个电话能转人工服务器,如何联系微信人工客服?掌握好窍门,只需30秒可接通,亲测有效...

原标题&#xff1a;如何联系微信人工客服&#xff1f;掌握好窍门&#xff0c;只需30秒可接通&#xff0c;亲测有效 很多人都会使用微信&#xff0c;但是使用过程中难免会遇到问题&#xff0c;比如账号封号、转错账、支付问题等。如果在机器人自动回答中解决不了问题&#xff0c…

人工客服为什么总是接不通?

原文链接 “有问题找客服”&#xff0c;人们总是会这样说&#xff0c;感觉一切售前售后都可以通过客服快速解决&#xff0c;可是当我们真正拨打客服热线的时候却遇上了等待时间过长&#xff0c;甚至是在线人工客服迟迟转接不上等种种情形。而接通以后如果是智能客服机器人&…

LCHub:Zoho联手ChatGPT,为8,000万用户提供生成式AI服务!

近日,全球著名SaaS服务商Zoho宣布与OpenAI达成技术合作,将ChatGPT集成在产品矩阵中,并推出全新生成式AI产品——Zia。 据悉,Zia在ChatGPT加持下,具备自动生成文本、量身定制文本、文本重置、邮件内容生成、会议摘要、生成公式、客服摘要、数据格式转换等功能。 简单来说…

如何使用ChatGPT辅助编程:通过引导自动生成编程代码

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 大型语言模型基本上是一台可以理解和生成文本的机器。取决于它的训练方式&#xff0c;有时模型可以生成文本以外的内容。ChatGPT就是这样一个大型语言模型。如果您正确提示&#xff0c;它可以生成编程代码。在这篇文章中&a…

【Tomcat内核】server和servic的区别

以下回答来自chatGPT server是什么&#xff1f; Server可以翻译为服务器&#xff0c;是一种提供网络服务的计算机系统。它可以接受来自客户端的请求并响应这些请求&#xff0c;以满足客户端的需求。服务器可以提供各种服务&#xff0c;例如网站托管、电子邮件、数据库、文件共享…

今天,微软重新发明搜索引擎:首款 ChatGPT 搜索来了

这是「进击的Coder」的第 795 篇技术分享 来源&#xff1a;机器之心 “ 阅读本文大概需要 8 分钟。 ” 从现在起&#xff0c;比 ChatGPT 更强大的语言模型直接进入了你的浏览器。 一夜之间&#xff0c;全球最大的科技公司仿佛都回到了自己年轻时的样子。 在谷歌宣布「实验性对…

chatgpt赋能python:用Python开发软件的SEO:如何让您的应用程序更容易被搜索引擎索引

用Python开发软件的SEO&#xff1a;如何让您的应用程序更容易被搜索引擎索引 引言 在当今数字化时代中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是一项非常重要的工作&#xff0c;尤其是对于那些寻求在互联网上推广新软件的开发人员。如果您正在寻找一种使您的软…

天秤座的主动在于次文

文章导读&#xff1a; 不主动找你聊天&#xff0c;不是因为你不重要&#xff0c;而是我不知道我不重要。太主动反而被敷衍&#xff0c;只好把想念和热情都收敛&#xff0c;可你永远不知道&#xff0c;主动的人需要鼓起多大的勇气&#xff0c;一点人际关系&#xff0c;一点机遇…

比特未来:Facebook仍将在2020年启动天秤座

比特未来&#xff1a;Facebook仍将在2020年启动天秤座 比特未来的前沿新闻称&#xff0c;Facebook将在2020年前推出Libra&#xff0c;尽管监管机构推迟了这一计划。 Facebook副总裁达维•马库西(Dawei•makusi)在Facebook上表示&#xff0c;尽管监管机构对天秤座项目存在强烈敌…

【天秤座区块链】元宇宙知识普以及简单解读清华研究报告

本节目录 温馨提示关于分栏【天秤座区块链】由来提前感受元宇宙区块链的两个注意点区块链革命简单认识清华大学报告解读&#xff08;元宇宙&#xff09;前传《雪崩》元宇宙具体是什么&#xff1f;元宇宙不是什么&#xff1f;那为什么要冲击元宇宙呢&#xff1f; 小补充及感谢 温…

处女座男生颜值测试软件,颜值在线又绅士的星座男(图)

颜值在线又绅士的星座男 绅士气质还不够&#xff0c;还有颜值来加分--这样的男主&#xff0c;有多少等爱的小仙女在期盼&#xff1f;然而不是谁都符合有颜绅士的标准&#xff0c;如何才能找到最名副其实的呢&#xff1f;摘星工厂-星吧用星座来支招。 处女座 时代在改变&#xf…

做跨境人人都是天秤座,三个月都没能建起一个店铺

小编告诉你个秘密&#xff0c;做电商的都是天秤座&#xff01; 近几年&#xff0c;因为疫情的影响&#xff0c;实体生意确实不太好做&#xff0c;反而给了线上电商一次前所未有的机会。 很多人想抓住机会&#xff0c;一头钻进国内市场&#xff0c;小编只能说格局小了&#xf…

来自天秤座的梦想_天秤座:单线全自动机器学习

来自天秤座的梦想 Libra is one of the python package, which helps in performing deep learning on a given data set with minimum no of lines of code. The recent usages of Machine Learning in many of daily applications. There has been many platforms for perfor…

天秤座

天秤座 9月24日&#xff5e;10月23日  主宰行星&#xff1a;金星  属性&#xff1a;风相星座 秋天出生的生辰星位或太阳在天秤座的人的特点&#xff1a; 天秤座是象征着秋天来临的星座&#xff0c;秋意表现在天秤座的人身上是对意气相投的特殊嗅觉。你寻求着共同点和互相谅…

如何防止人工智能毁灭人类

朋友们&#xff0c;如需转载请标明出处&#xff1a;http://blog.csdn.net/jiangjunshow 超级智能 很多人担心超人工智能总有一天会选择伤害人类。之前&#xff0c;史蒂芬霍金曾呼吁建立一个新的世界“政府”来管理我们给予人工智能的能力以免其毁灭人类。这个陈述是很大胆的&a…

卡巴斯基郑启良:支持信创发展是卡巴斯基的重要使命

6月8日&#xff0c;卡巴斯基在京举办媒体见面会&#xff0c;分享了其对2023年安全行业可能出现的威胁格局变化趋势&#xff0c;并对卡巴斯基近年业务发展情况做了说明和展望。 【卡巴斯基大中华区总经理郑启良】 “今年上半年&#xff0c;卡巴斯基中国市场的业务增长速度已经超…

零基础转行网络工程师,过来人给的一些建议

最近收到好多学员的一些提问&#xff0c;零基础没经验&#xff0c;能不能转行到网络工程师&#xff1f;薪资能有多少&#xff1f;发展前景怎么样&#xff1f; 应该有不少朋友都有这个疑问&#xff0c;那么&#xff0c;今天我尽量给大家做出一个详细的解答&#xff0c;希望能有…

ChatGPT评中国考研最好就业的10大专业!

以下是ChatGPT认为未来考研最好就业的十大专业&#xff0c;并按照重要性从高到低排列&#xff08;仅供娱乐哦&#xff09; 需要注意的是&#xff0c;这只是ChatGPT的看法&#xff0c;其他人可能会有不同的观点和评价标准。此外&#xff0c;不同的发展阶段和政策导向也会对专业需…