Android自带的语音播报不支持中文;

科大讯飞开始收费了;

百度离线语音合成也收费,但是! 在线语音合成不收费,需要在百度开放平台申请AppId;

文档:https://cloud.baidu.com/doc/SPEECH/index.html

SDK下载:https://ai.baidu.com/sdk#tts

百度在线语音合成:

没有找到百度在线语音合成的文档,自己参考百度语音SDK抽取了一下;

1、下载百度的SDK https://cloud.baidu.com/doc/SPEECH/s/Ck4nlz4cx , 把jar包之类的拷贝一下;

2、初始化,在线语音合成很简单(获取实例,给上下文、设置appid等、然后调用初始化就行了),百度建议放在子线程中:

protected SpeechSynthesizer mSpeechSynthesizer;                mSpeechSynthesizer = SpeechSynthesizer.getInstance();mSpeechSynthesizer.setContext(context);// 2. 设置listenermSpeechSynthesizer.setSpeechSynthesizerListener(null);// 3. 设置appId,appKey.secretKeymSpeechSynthesizer.setAppId(AppConfig.BaiduTTSAppId);mSpeechSynthesizer.setApiKey(AppConfig.BaiduTTSAppKey, AppConfig.BaiduTTSSecretKey);// 5. 以下setParam 参数选填。不填写则默认值生效// 设置在线发声音人: 0 普通女声(默认) 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");// 设置合成的音量,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "15");// 设置合成的语速,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");// 设置合成的语调,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);// 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。// 6. 初始化int result = mSpeechSynthesizer.initTts(TtsMode.ONLINE);

3、播放、暂停、恢复播放、停止播放:

mSpeechSynthesizer.speak(text); //开始播放
mSpeechSynthesizer.pause(); //暂停
mSpeechSynthesizer.resume(); //恢复
mSpeechSynthesizer.stop(); //停止

百度在线语音合成封装:


/*** 百度语音合成 在线TTS** 播放 :立即播报*       排在正在播放的下一个*       排在播放列表的最后** 暂停 : 立即暂停*        播报完成当前语音再暂停** 停止 : 立即停止*        播报完成当前语音再停止** 恢复播放 : 若当前播报未完成,继续播报当前语音 否则播报队列中的;** 可以获取当前播报状态**/
public class TtsSyntherizer {public TtsSyntherizer(Context context) {this.context = context;initTTs();}private Context context;protected SpeechSynthesizer mSpeechSynthesizer;private volatile boolean isInitTts = false;/*** 初始化语音播报*/protected void initTTs() {new Thread(new Runnable() {@Overridepublic void run() {if (AppConfig.IS_DEV) LoggerProxy.printable(true); // 日志打印在logcat中// 1. 获取实例mSpeechSynthesizer = SpeechSynthesizer.getInstance();mSpeechSynthesizer.setContext(context);// 2. 设置listenermSpeechSynthesizer.setSpeechSynthesizerListener(new MessageListener(){@Overridepublic void onSpeechStart(String utteranceId) {super.onSpeechStart(utteranceId);L.cc("播放开始");ttsState = TtsStateEnum.PLAY;}@Overridepublic void onSpeechFinish(String utteranceId) {super.onSpeechFinish(utteranceId);if (!ListUtils.isEmpty(ttsPlayDatas) && ttsState == TtsStateEnum.PLAY){//如果当前播放列表中有数据,并且不是暂停状态或停止状态ttsSpeak(ttsPlayDatas.get(0));ttsPlayDatas.remove(0);}L.cc("播放结束");ttsState = TtsStateEnum.LDLE;}});// 3. 设置appId,appKey.secretKeymSpeechSynthesizer.setAppId(AppConfig.BaiduTTSAppId);mSpeechSynthesizer.setApiKey(AppConfig.BaiduTTSAppKey, AppConfig.BaiduTTSSecretKey);// 5. 以下setParam 参数选填。不填写则默认值生效// 设置在线发声音人: 0 普通女声(默认) 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");// 设置合成的音量,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "15");// 设置合成的语速,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");// 设置合成的语调,0-15 ,默认 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);// 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。// 6. 初始化int result = mSpeechSynthesizer.initTts(TtsMode.ONLINE);if (result == 0) {isInitTts = true;} else {isInitTts = false;}}}).start();}private TtsStateEnum ttsState = TtsStateEnum.LDLE; //默认是空闲状态private List<String> ttsPlayDatas; //语音播报列表/*** 开始语音播报* @param text 播报内容* @param code 1 代表立即播报*             2 排在正在播放的下一个*             3 排在最后* @param isClearQueue 是否播放完本条内容后清空队列停止播报* @return*/public int ttsSpeak(String text , int code , boolean isClearQueue) {if (mSpeechSynthesizer != null && isInitTts){int result = 0;if (ttsPlayDatas == null)ttsPlayDatas = new ArrayList<>();switch (code){case 1: //立即播报if (ttsState != TtsStateEnum.LDLE)ttsStop(true);ttsSpeak(text);break;case 2: //排在正在播放的下一个if (ttsState != TtsStateEnum.LDLE) {ttsPlayDatas.add(0, text);}else {ttsSpeak(text);}break;case 3:if (ttsState != TtsStateEnum.LDLE) {ttsPlayDatas.add(text);}else {ttsSpeak(text);}break;}if (isClearQueue) ttsPlayDatas.clear();return result;}else {return 1;}}/*** 默认开始播放* @param text* @return*/public int ttsSpeak(String text) {if (AppConfig.IS_OFF_TTS_PLAY){return 2; //已经关闭语音播报开关}if (mSpeechSynthesizer != null && isInitTts){int result = mSpeechSynthesizer.speak(text);return result;}else {return 1;}}/*** 暂停语音播报*  @parem afterCurrent 是否立即暂停* @return 0 是成功*/public int ttsPause(boolean afterCurrent) {if (mSpeechSynthesizer != null && isInitTts){if (afterCurrent){ //立即暂停int result = mSpeechSynthesizer.pause();ttsState = TtsStateEnum.PAUSE;return result;}else { //播放完当前语音再暂停ttsState = TtsStateEnum.PAUSE;return 0;}}else {return 1;}}/*** 恢复语音播报* @return 0 是成功*/public int ttsResume() {if (mSpeechSynthesizer != null && isInitTts){if (ttsState == TtsStateEnum.PAUSE){ //如果是暂停状态,就恢复播放int result = mSpeechSynthesizer.resume();ttsState = TtsStateEnum.PLAY;return result;}else { //如果不是暂停状态if (!ListUtils.isEmpty(ttsPlayDatas) && ttsState == TtsStateEnum.LDLE){ttsSpeak(ttsPlayDatas.get(0));}return 0;}}else {return -1;}}/***  停止语音播报*  @parem afterCurrent 是否立即暂停* @return 0是成功*/public int ttsStop(boolean afterCurrent) {if (mSpeechSynthesizer != null && isInitTts){if (ttsPlayDatas != null) ttsPlayDatas.clear();if (afterCurrent){ //立即停止播报int result = mSpeechSynthesizer.stop();ttsState = TtsStateEnum.LDLE;return result;}else { //当前播报完成再停止ttsState = TtsStateEnum.LDLE;return 0;}}else {return 1;}}/***  获取TTS状态* @return 0是成功*/public TtsStateEnum getTtsState() {if (mSpeechSynthesizer != null && isInitTts){return ttsState;}else {return TtsStateEnum.LDLE;}}/*** 释放TTS资源*/public void release() {if (mSpeechSynthesizer != null){mSpeechSynthesizer.stop();mSpeechSynthesizer.release();isInitTts = false;ttsState = TtsStateEnum.LDLE;ttsPlayDatas = null;mSpeechSynthesizer = null;}}
}
public enum TtsStateEnum {PLAY(0),PAUSE(1),LDLE(2);private int state;TtsStateEnum(int state){this.state = state;}public int getState(){return state;}
}

代码其实很简单,自己又封装了一下队列播放消息;

最后,如果你打开了混淆,别忘记添加混淆配置:

# TTS
-keep class com.baidu.tts.**{*;}
-keep class com.baidu.speechsynthesizer.**{*;}

Android 语音播报 , 百度在线语音合成封装;相关推荐

  1. 自定义封装android语音播报库

    自定义封装android语音播报库 在开发的时候,需要用到语音播报和音乐提醒,然后就封装了一套库,只需要调用一个方法,传入需要的文字或者音乐,方便快捷 首先在project视图下,将aar文件添加到l ...

  2. Xamarin开发笔记—百度在线语音合成

    续<是时候开始用C#快速开发移动应用了>刷屏之后,把C#开发移动应用的技术 => Xamarin,在这里和大家做一个分享! 语音合成:也被称为文本转换技术(TTS),它是将计算机自己 ...

  3. 视频合成剪辑者的福音-百度在线语音合成

    AI人工智能为大家介绍百度语音识别的系列产品在线语音合成,它是基于业界领先的深度神经网络技术,提供高度拟人.流畅自然的语音合成服务,让您的应用.设备开口说话,更具个性,下面我们来看下它的功能.优势.应 ...

  4. Android 语音播报之项目实战

    TextToSpeech项目应用 文字转语音 官网简介 项目前景 项目实战 真机调试 结尾 文字转语音 从文本合成语音以立即播放或创建声音文件.即TextToSpeech(以下简称TTS)       ...

  5. Android语音播报、后台播报、语音识别

    Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...

  6. java语音播报源代码_详解Android 语音播报实现方案(无SDK)

    本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到"支付宝到账12. ...

  7. python爬取百度在线语音合成的音频

    python爬取百度在线语音合成 URL:https://ai.baidu.com/tech/speech/tts_online 抓包 api从这里抓包,用的post请求,返回的是base64文件格式 ...

  8. Android讯飞语音集成【在线语音合成2】

    前言: 语音合成: 与语音听写相反,语音合成是将一段文字转换为语音,可根据需要合成出不同音色.语速和语调的声音,让机器像人一样开口说话 效果图: 2.直接上代码,配置不再重复说明了: ①.TTSAct ...

  9. android语音播报

    百度TTS引擎离线语音合成+语音播报已个人测试,可用声音满意,代码只是一个模块参考还需要一些文件下面连接方可进入下载demo,虽花钱但是负责你到最后实现 mqtts长连接   双进程保活   tts中 ...

最新文章

  1. 带学生参加电赛,5个国一,2个国二!15个省奖!
  2. 文件字符输入流的使用 FileReader java
  3. mysql初始化主机名无法解析
  4. 2017.9.5 组合数学 思考记录
  5. mysql报错2059
  6. SDWebImage 笔记
  7. WPF之DatePicker使其只能选择日期,不能输入日期
  8. shell初学之nginx(域名)
  9. php采集虎牙,全网首发PHP虎牙直播解析接口源码
  10. 基于Qt的屏幕共享工具(含源码)
  11. 个人风景网站模板HTML+CSS+JS(源码)
  12. C++ 异常是如何实现的
  13. (转)wuauclt.exe病毒解决方案
  14. python画柱状图-Python绘图之柱形图绘制详解
  15. pdf会签_图纸会签规定
  16. 前后落差大用什么词语_形容两个人反差特别大的成语-有明显的反差 用什么词形容-形容前后态度反差巨大的词...
  17. ubuntu 18.04 LORD 3DM-GX5-45 IMU ros_mscl ros驱动安装
  18. Gif动态图片怎样在线生成?一招快速完成gif在线制作
  19. matlab矢量场数值可视化(动态数值模拟)
  20. xxxx.readyState==4 xxxx.status==200

热门文章

  1. 前端萌新看过来了—— 0基础1小时vue入门到实战
  2. Linux 未定义的引用解决记录
  3. 中职学生计算机学情分析报告,中职学生学情分析及对策
  4. 什么是好人,什么是坏人,你有标准答案吗
  5. HTML前端(一)----DIV布局
  6. word中插入页码方法
  7. 在线查看相机快门次数_我是亲民_新浪博客
  8. 时间序列预测-深度学习方法
  9. 安卓AndroidManifast
  10. 多系统如何共享蓝牙设备?