Android 语音播报 , 百度在线语音合成封装;
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 语音播报 , 百度在线语音合成封装;相关推荐
- 自定义封装android语音播报库
自定义封装android语音播报库 在开发的时候,需要用到语音播报和音乐提醒,然后就封装了一套库,只需要调用一个方法,传入需要的文字或者音乐,方便快捷 首先在project视图下,将aar文件添加到l ...
- Xamarin开发笔记—百度在线语音合成
续<是时候开始用C#快速开发移动应用了>刷屏之后,把C#开发移动应用的技术 => Xamarin,在这里和大家做一个分享! 语音合成:也被称为文本转换技术(TTS),它是将计算机自己 ...
- 视频合成剪辑者的福音-百度在线语音合成
AI人工智能为大家介绍百度语音识别的系列产品在线语音合成,它是基于业界领先的深度神经网络技术,提供高度拟人.流畅自然的语音合成服务,让您的应用.设备开口说话,更具个性,下面我们来看下它的功能.优势.应 ...
- Android 语音播报之项目实战
TextToSpeech项目应用 文字转语音 官网简介 项目前景 项目实战 真机调试 结尾 文字转语音 从文本合成语音以立即播放或创建声音文件.即TextToSpeech(以下简称TTS) ...
- Android语音播报、后台播报、语音识别
Android语音播报.后台播报.语音识别 本文介绍使用讯飞语音实现语音播报.语音识别功能. 讯飞开放平台:http://www.xfyun.cn/index.php/default/index 程序 ...
- java语音播报源代码_详解Android 语音播报实现方案(无SDK)
本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到"支付宝到账12. ...
- python爬取百度在线语音合成的音频
python爬取百度在线语音合成 URL:https://ai.baidu.com/tech/speech/tts_online 抓包 api从这里抓包,用的post请求,返回的是base64文件格式 ...
- Android讯飞语音集成【在线语音合成2】
前言: 语音合成: 与语音听写相反,语音合成是将一段文字转换为语音,可根据需要合成出不同音色.语速和语调的声音,让机器像人一样开口说话 效果图: 2.直接上代码,配置不再重复说明了: ①.TTSAct ...
- android语音播报
百度TTS引擎离线语音合成+语音播报已个人测试,可用声音满意,代码只是一个模块参考还需要一些文件下面连接方可进入下载demo,虽花钱但是负责你到最后实现 mqtts长连接 双进程保活 tts中 ...
最新文章
- 带学生参加电赛,5个国一,2个国二!15个省奖!
- 文件字符输入流的使用 FileReader java
- mysql初始化主机名无法解析
- 2017.9.5 组合数学 思考记录
- mysql报错2059
- SDWebImage 笔记
- WPF之DatePicker使其只能选择日期,不能输入日期
- shell初学之nginx(域名)
- php采集虎牙,全网首发PHP虎牙直播解析接口源码
- 基于Qt的屏幕共享工具(含源码)
- 个人风景网站模板HTML+CSS+JS(源码)
- C++ 异常是如何实现的
- (转)wuauclt.exe病毒解决方案
- python画柱状图-Python绘图之柱形图绘制详解
- pdf会签_图纸会签规定
- 前后落差大用什么词语_形容两个人反差特别大的成语-有明显的反差 用什么词形容-形容前后态度反差巨大的词...
- ubuntu 18.04 LORD 3DM-GX5-45 IMU ros_mscl ros驱动安装
- Gif动态图片怎样在线生成?一招快速完成gif在线制作
- matlab矢量场数值可视化(动态数值模拟)
- xxxx.readyState==4 xxxx.status==200