Android中TextToSpeech的使用
系列文章目录
Android中TextToSpeech的使用
文章目录
- 系列文章目录
- 前言
- 实现
- 1.初始化语音。这是一个异步操作。初始化完成后调用oninitListener(第二个参数)。
- 2.实现TextToSpeech.OnInitListener
- 3.写一个朗读方法,在需要的时候触发(如:点击事件)
- 4.记得利用Activity的生命周期中将其关闭
- 源码
前言
在一年前,和朋友一起码了一个英语APP,仿照某APP实现了单词的功能,最开始就是借助的TextToSpeech,后面感觉声音不够好听,于是使用了第三方
APP初稿如图:
实现
1.初始化语音。这是一个异步操作。初始化完成后调用oninitListener(第二个参数)。
TextToSpeech mTts = new TextToSpeech(this, this);
2.实现TextToSpeech.OnInitListener
注意:语言可能不可用。
// 实现TextToSpeech.OnInitListener.public void onInit(int status) {if (status == TextToSpeech.SUCCESS) {//设置首选语言为中文,注意,语言可能是不可用的,结果将指示此int result = mTts.setLanguage(Locale.CHINA);if (result == TextToSpeech.LANG_MISSING_DATA ||result == TextToSpeech.LANG_NOT_SUPPORTED) {//语言数据丢失或不支持该语言。Log.e(TAG, "语言数据丢失或不支持该语言");} else {//检查文档中其他可能的结果代码。// 例如,语言可能对区域设置可用,但对指定的国家和变体不可用// TTS引擎已成功初始化。// 允许用户按下按钮让应用程序再次发言。mAgainButton.setEnabled(true);}} else {// 初始化失败Log.e(TAG, "初始化失败");}}
3.写一个朗读方法,在需要的时候触发(如:点击事件)
TextToSpeech的speak方法有两个重载。
- 执行朗读的方法
speak(CharSequence text,int queueMode,Bundle params,String utteranceId);
第二个参数queueMode用于指定发音队列模式,两种模式选择。
(1)TextToSpeech.QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务
(2)TextToSpeech.QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,等前面的语音任务执行完了才会执行新的语音任务。
- 将朗读的的声音记录成音频文件
synthesizeToFile(CharSequence text,Bundle params,File file,String utteranceId);
private void sayHello() {String hello ="Hellow";//TextToSpeech的speak方法有两个重载。// 执行朗读的方法//speak(CharSequence text,int queueMode,Bundle params,String utteranceId);// 将朗读的的声音记录成音频文件//synthesizeToFile(CharSequence text,Bundle params,File file,String utteranceId);//第二个参数queueMode用于指定发音队列模式,两种模式选择//(1)TextToSpeech.QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务//(2)TextToSpeech.QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,//等前面的语音任务执行完了才会执行新的语音任务mTts.speak(hello,TextToSpeech.QUEUE_FLUSH,null);}
4.记得利用Activity的生命周期中将其关闭
@Overridepublic void onDestroy() {// 生命周期中结束if (mTts != null) {mTts.stop();mTts.shutdown();}super.onDestroy();}
源码
SpeechActivity.java
public class SpeechActivity extends Activity implements TextToSpeech.OnInitListener {private static final String TAG = "SpeechDemo";private TextToSpeech mTts;private Button mButton;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.text_to_speech);//初始化语音。这是一个异步操作。初始化完成后调用oninitListener(第二个参数)。mTts = new TextToSpeech(this, this);mButton = (Button) findViewById(R.id.again_button);//触发mButton.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {sayHello();}});}@Overridepublic void onDestroy() {// 生命周期中结束if (mTts != null) {mTts.stop();mTts.shutdown();}super.onDestroy();}// 实现TextToSpeech.OnInitListener.public void onInit(int status) {if (status == TextToSpeech.SUCCESS) {//设置首选语言为中文,注意,语言可能是不可用的,结果将指示此int result = mTts.setLanguage(Locale.CHINA);if (result == TextToSpeech.LANG_MISSING_DATA ||result == TextToSpeech.LANG_NOT_SUPPORTED) {//语言数据丢失或不支持该语言。Log.e(TAG, "语言数据丢失或不支持该语言");} else {//检查文档中其他可能的结果代码。// 例如,语言可能对区域设置可用,但对指定的国家和变体不可用// TTS引擎已成功初始化。// 允许用户按下按钮让应用程序再次发言。mAgainButton.setEnabled(true);}} else {// 初始化失败Log.e(TAG, "初始化失败");}}private void sayHello() {String hello ="计蒙不吃鱼";//TextToSpeech的speak方法有两个重载。// 执行朗读的方法//speak(CharSequence text,int queueMode,Bundle params,String utteranceId);// 将朗读的的声音记录成音频文件//synthesizeToFile(CharSequence text,Bundle params,File file,String utteranceId);//第二个参数queueMode用于指定发音队列模式,两种模式选择//(1)TextToSpeech.QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务//(2)TextToSpeech.QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,//等前面的语音任务执行完了才会执行新的语音任务mTts.speak(hello,TextToSpeech.QUEUE_FLUSH,null);}}
text_to_speech.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Button android:id="@+id/again_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:enabled="false" />
</LinearLayout>
Android中TextToSpeech的使用相关推荐
- Android中使用自带TextToSpeech实现语音合成时Pico TTS引擎不能播放中文怎样解决
场景 Android中使用自带TextToSpeech实现离线语音合成功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/109 ...
- Android中实现为TextView添加多个可点击的文本
这篇文章主要介绍了Android中实现为TextView添加多个可点击的文本,可实现类似Android社交软件显示点赞用户并通过用户名称进入该用户主页的功能,是非常实用的技巧,需要的朋友可以参考下.具 ...
- android 弹出fragment,Android中ViewPager获取当前显示的Fragment
前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...
- android 读取内部存储文件格式,Android中的数据储存之文件存储
当我们在使用各种程序时,其实际上是在和各种数据打交道,当我们聊QQ,刷微博,看新闻,其实都是在和里面的数据交互 例如在聊天时发出的消息,以及在登录时输入的账号密码,其实都是瞬时数据,那什么是瞬时数据呢 ...
- android中一种不支持的lua操作
今天写了一段lua代码,在win32中正常运行,在android中运行无效. 大概是这样的: ------file1.lua----- local t = {} t.str = "this ...
- Android中对Log日志文件的分析[转]
一,Bug出现了, 需要"干掉"它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只 ...
- 在Android中进行单元测试遇到的问题
问题1.Cannot connect to VM socket closed 在使用JUnit进行测试的时候,遇到这个问题.网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还 ...
- android中设置控件获得焦点 (转)
android中,要使控件获得焦点,需要先setFocus,再requestFocus. 以Button为例: btn.setFocusable(true); ...
- Android中怎么使图片显示
android中经常到利用图片,利用图片时我们都是把图片放在drawable-xxx目录下,因为这里就是存储图片的地方,xxx不用理他,就是关于分辨率而已. 楼主在学习android的时候一直尝试把图 ...
- Android中处理崩溃异常
2019独角兽企业重金招聘Python工程师标准>>> 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象 ...
最新文章
- 不需要程序员,产品经理也能10分钟打造一个深度学习模型
- Swift 必备开发库 (高级篇)
- 奔跑吧Linux内核 入门篇(第二版)遇到问题发
- Hadoop多次format格式化会导致节点的clusterID不一致
- 【控制】《多智能体机器人系统信息融合与协调》范波老师-第6章-基于分布式强化学习的多 Agent 协调方法
- Oracle内部错误:ORA-07445[kcflfi()+466] [INT_DIVIDE_BY_ZERO]一例
- c语言学生成绩管理论文,学生成绩管理系统毕业论文c语言.doc
- android listview 刷新不正确,Android中设置ListView内容刷新问题
- 普通账户信息是SIEM的盲点
- 一、华为设备telnet命令配置
- Linux下图片 jpg、png、gif 与 eps 格式的相互转换
- 数织游戏中的程序思维和数织的程序解法
- 理解偏差(Bias)和方差(Variance)
- 项目接入即时聊天客服系统(环信系统)PHP后端操作
- linux测试读写的工具,Linux 下的硬盘读写速度测试工具
- dorado弹框方式
- 大数据项目实践过程笔记
- 算法竞赛中计算机1000ms一般能运行的范围
- Eclipse时区出问题,与北京时间相差八小时
- Queuing HDU2604