TTS与MediaPlayer混合使用
package com.xxx.xxx.Util; import android.content.Context;
import android.media.MediaPlayer;
import android.speech.tts.TextToSpeech;
import android.util.Log; import java.io.File;
import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.ConcurrentLinkedQueue; public class TTSUtil implements TextToSpeech.OnInitListener {
private MediaPlayer mediaPlayer = new MediaPlayer();
private final TextToSpeech mTextToSpeech;//TTS对象
private final ConcurrentLinkedQueue mBufferedMessages;//消息队列
private Context mContext;
private boolean mIsReady;//标识符 public TTSUtil(Context context){
this.mContext=context;//获取上下文
this.mBufferedMessages=new ConcurrentLinkedQueue();//实例化队列
this.mTextToSpeech=new TextToSpeech(this.mContext,this);//实例化TTS
} //初始化TTS引擎
@Override
public void onInit(int status) {
Log.i("TextToSpeechDemo",String.valueOf(status));
if(status==TextToSpeech.SUCCESS){
int result = this.mTextToSpeech.setLanguage(Locale.CHINA);//设置识别语音为英文或者中文 synchronized (this){
this.mIsReady=true;//设置标识符为true
for(Object bufferedMessage : this.mBufferedMessages){
String s = String.valueOf(bufferedMessage);
speakText(s);//读语音
}
this.mBufferedMessages.clear();//读完后清空队列
}
}
}
//释放资源
public void release(){
synchronized (this){
this.mTextToSpeech.shutdown();
this.mIsReady=false;
}
} //更新消息队列,或者读语音
public void notifyNewMessage(String text){
//如果已经有音频文件,使用MediaPlayer播放
try {
File file = new File(mContext.getCacheDir().getAbsolutePath()+"//", text+".wav");
if(file.exists()) {
mediaPlayer.reset();
mediaPlayer.setDataSource(file.getPath()); // 指定音频文件的路径
mediaPlayer.prepare(); // 让MediaPlayer进入到准备状态
mediaPlayer.start();
return;
} } catch (Exception e) { e.printStackTrace(); } String message=text;
synchronized (this){
if(this.mIsReady){
speakText(message);
}else{
this.mBufferedMessages.add(message);
}
}
}
//把TTS朗读结果保存
public void sayTofile(String text)
{
HashMap<String,
String> ttsRender = new HashMap<String,
String>();
String destFileName = mContext.getCacheDir().getAbsolutePath()+"//"+text+".wav";
ttsRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
text);
this.mTextToSpeech.synthesizeToFile(text,
ttsRender, destFileName); }
//自定义文字播放
public void sayFromFile(String text)
{
String destFileName = mContext.getCacheDir().getAbsolutePath()+"//"+text+".wav";
this.mTextToSpeech.addSpeech(text,destFileName);
this.mTextToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH, null);
}
//读语音处理
private void speakText(String message){
HashMap params=new HashMap();
params.put(TextToSpeech.Engine.KEY_PARAM_STREAM,"STREAM_NOTIFICATION");//设置播放类型(音频流类型)
this.mTextToSpeech.speak(message, TextToSpeech.QUEUE_ADD, params);//将这个发音任务添加当前任务之后
this.mTextToSpeech.playSilence(100,TextToSpeech.QUEUE_ADD,params);//间隔多长时间
}
}
有些平板上tts有bug,比如华为某64G存储 平板,有时启动不起来,需要点击一下收听示例才行,通过以上程序,第一次使用时可以实现把需要的几个语音文件生成出来,会自动保存语音到文件,之后就可以直接mediaplayer播放语音文件。
ttsUtil.sayTofile("测试语音");
ttsUtil.notifyNewMessage("测试语音");
比如上面第一句话执行后,第二句话直接调用wav文件。
注:程序中代码片段来自网友分享。 有的时候播放tts还是会无声情况,直接把wav文件放入程序资源中调用方法:https://www.cnblogs.com/zhaogaojian/p/10128827.html
TTS与MediaPlayer混合使用的更多相关文章
- asp.net 实现 tts
之前用WinForm实现tts已经成功,就调用了下系统的类库.但我把相同的代码搬到asp.net上时却碰到了许多问题,查了好多网站.试过了很多方法,到现在算是做出了一部分吧. 之前调用微软的TTS是用 ...
- iOS 文本转语音(TTS)详解:Swift
上一篇博客讲解了iOS的speech FrameWork语音识别的功能:http://www.cnblogs.com/qian-gu-ling/p/6599670.html,对应的这篇博客就写一下文本 ...
- Android -- 多媒体播放之MediaPlayer使用内部实现简析
Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.如今,这里就通过一个MediaPlayer代码实例,来进一步分析Media ...
- Mediaplayer error (-19,0)
Android MediaPlayer 发生 error (-19,0) 错误解决方法. 引起原因:由于多次实例化MediaPlayer.start() 进行播放操作引起的.由于没有及时释放内存资源导 ...
- C#语音朗读文本 — TTS的实现
TTS, Text To Speech的缩写,是使用语音朗读文本的技术.目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API. Window ...
- 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。
两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...
- 混合使用UITabBarController和UINavigationController
混合使用这两个控件的好处是我们可以在NavigationBar添加更多的东西,如标题,按钮等.让用户能够获得更多的信息. UITabBarController的属性ViewControllers接受以 ...
- Android四大组件--MediaPlayer详解(转)
一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : ...
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...
随机推荐
- 「洛谷2495」「BZOJ3052」「SDOI2001」消耗战【虚树+树形动态规划】
题目大意 给你\(k\)个点,让这一些点和一号节点断开,删去某一些边,求最小的删去边权之和. 做题的心路历程 做了\(HG\)昨天的模拟赛,深深感觉到了窝的菜,所以为了\(A\)掉T1这一道毒瘤,窝就 ...
- 【转】gcc 编译使用动态链接库和静态链接库
1 库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 有 ...
- Ubuntu相关配置
1.Ubuntu配置root密码 2.开机ssh连接--nat 编辑网络设置端口转发
- C语言中的类型转换——将字符串s转换为整数型(int)类型
在讲类型转换之前,我们先要理解下C语言中单引号和双引号的区别. 先讲双引号,双引号就是字符串,我们要证实我们的想法,我选择写一段代码看看开: #include <stdio.h> int ...
- 初入react-redux (基于webpack babel的react应用框架)
react这么热门的框架也不介绍了,redux是一个单项数据流的小框架,当然不只配合react,它起初是为react而配的,现在面向所有了,比如ng-redux的项目.redux做为react的标准搭 ...
- Linux基本命令总结(三)
接上篇: 11,more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示 ...
- (转)深入理解Java注解类型(@Annotation)
背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...
- 【洛谷P1601 A+B Problem(高精)】
题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...
- TP5.0+小程序商城构建(1)
1.导语 1.整体的思路与编程思想(大局观.AOP面向切面编程,10-20%) 2.具体的编程知识与技巧(TP5.小程序.数据库等80%) 2.课程内容与产品技术点 1.ThinkPHP5框架 1.编 ...
- Linux 系统设置sh文件开机自启动
工作中有一个linux下的服务需要启动,但是机器总是断电,导致需要反复启动,找了一下开机自启动的方法,解决了这个问题.Linux设置开机自启动非常简单,只要找到rc.local文件,将你需要自启动的文 ...