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混合使用的更多相关文章

  1. asp.net 实现 tts

    之前用WinForm实现tts已经成功,就调用了下系统的类库.但我把相同的代码搬到asp.net上时却碰到了许多问题,查了好多网站.试过了很多方法,到现在算是做出了一部分吧. 之前调用微软的TTS是用 ...

  2. iOS 文本转语音(TTS)详解:Swift

    上一篇博客讲解了iOS的speech FrameWork语音识别的功能:http://www.cnblogs.com/qian-gu-ling/p/6599670.html,对应的这篇博客就写一下文本 ...

  3. Android -- 多媒体播放之MediaPlayer使用内部实现简析

    Android -- MediaPlayer内部实现简析 在之前的博客中,已经介绍了使用MediaPlayer时要注意的内容.如今,这里就通过一个MediaPlayer代码实例,来进一步分析Media ...

  4. Mediaplayer error (-19,0)

    Android MediaPlayer 发生 error (-19,0) 错误解决方法. 引起原因:由于多次实例化MediaPlayer.start() 进行播放操作引起的.由于没有及时释放内存资源导 ...

  5. C#语音朗读文本 — TTS的实现

    TTS, Text To Speech的缩写,是使用语音朗读文本的技术.目前,在国内应用较多的是排队叫号系统 Windows 平台的TTS,通常使用的是微软自带的 Speech API. Window ...

  6. 关于从Activity A跳转到Activity B ,其中Activity A中有一个VideoView,Activity B中有一个MediaPlayer。

    两个不同的视频的跳转, 前面我是在onStop()方法中销毁VideoView(因为MediaPlayer是全局共用的,而VideoView内包含MediaPlayer),但是每次进入Activity ...

  7. 混合使用UITabBarController和UINavigationController

    混合使用这两个控件的好处是我们可以在NavigationBar添加更多的东西,如标题,按钮等.让用户能够获得更多的信息. UITabBarController的属性ViewControllers接受以 ...

  8. Android四大组件--MediaPlayer详解(转)

    一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : ...

  9. 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

    本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...

随机推荐

  1. android ViewStub简单介绍

    ViewStub是一种非常灵活的视图,主要用于布局资源的实时加载. ViewStub 的继承类关系如下: public final class ViewStubextends View java.la ...

  2. 使用ajax实现前后端是数据交互

    ajax的概念 ajax一个前后台配合的技术,它可以让javascript发送http请求,与后台通信,获取数据和信息.ajax技术的原理是实例化xmlhttp对象,使用此对象与后台通信.jquery ...

  3. BZOJ--1045-- 糖果传递(中位数,排序)

    题目链接 :BZOJ--1045-- 糖果传递 我们知道如果不头尾相连的话 直接求一个前缀和 答案为ans+=s[i] 不相连的话就是1 和n之间断开 头尾相连的话就是 在第k个人之间断开 设A[i] ...

  4. 如何在Windows 10上运行Docker和Kubernetes?

    如何在Windows 10上运行Docker和Kubernetes? 在Windows上学习Docker和Kubernetes,开始的时候会让你觉得无从下手.最起码安装好这些软件都不是一件容易的事情. ...

  5. vue router获取整条路径参数

    $route.path 当前路由对象的路径,如'/vi$route.query 请求参数,如/foo?user=1获取到query.user = 1$route.router 所属路由器以及所属组件信 ...

  6. R语言修改标题、坐标轴刻度、坐标轴名称的大小(cex.axis、cex.lab、cex.main函数)

    修改标题.坐标轴刻度.坐标轴名称的大小,用到了cex.axis.cex.lab.cex.main函数,其中,cex.axis表示修改坐标轴刻度字体大小,cex.lab表示修改坐标轴名称字体大小,cex ...

  7. http请求流程

  8. hdu 2476"String painter"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...

  9. Linux平台中使用PHP让word转pdf

    1.ubantu下安装libreoffice        sudo apt-get install libreoffice 2.命令行执行word转pdf    将 /home/wordToPdf/ ...

  10. JS学习笔记Day4

    一.什么是函数 将反复使用的功能代码,封装成一独立的模块,这个模块叫做函数 二.封装函数的好处 1.一次封装,多次使用 2.使程序可控 三.函数的分类:内置()函数和自定义函数 四.函数的数据类型(f ...