安卓TTS语音合成经验分享(科大讯飞语音+)集成
应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒。老程序是使用双屏显卡,windows系统PC上运行一个无人值守桌面程序。如今安卓机顶盒(WIFI)和MINI电视棒通过HDMI接口和支持大屏幕高清液晶显示器(电视)组合,让这一应用场景的成本大幅下降,实用性更好。
通过一番调研,发现国内上市公司科大讯飞的语音+SDK包口碑好,效果好,集成也方便。语音+支持离线应用,这是最主要的。集成过程走起:
1、下载DEMO程序。DEMO程序就包含了全部需要的资源。
2、SDK集成关键代码:
(1)SpeechSynthesizer 是 jar包里封装的语音合成对象她是我们的女主角。
// 语音合成对象
private SpeechSynthesizer mTts;
public static String SPEAKER = "speaker";
从demo照抄实例化mTts的代码。调用方式应该是jar里封装好的方法外包调用,暂时不关注,先关注一下怎样用起来。
private void checkVoiceServiceIsInstalled() {
// 检测语音引擎是否可用,如果没有安装自动安装
if (!checkSpeechServiceInstall()) {
String assetsApk = "SpeechService.apk";
if (processInstall(this, assetsApk))
SpeechUtility.getUtility(this).setAppid("53c776aa");
return;
}
// 引擎初始化
SpeechUtility.getUtility(this).setAppid("53c776aa");
mTts = new SpeechSynthesizer(this, mTtsInitListener);
}
(2)检查语音加引擎是否安装
/**
* 执行本地安装 语音+
*
* @param context
* @param assetsApk
* @return
*/
private boolean processInstall(Context context, String assetsApk) {
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 本地安装方式
if (!ApkInstaller.installFromAssets(context, assetsApk)) {
Toast.makeText(activity_main.this, "安装语音引擎失败!", Toast.LENGTH_SHORT)
.show();
return false;
}
return true;
} /**
* 检测科大讯飞语音+引擎是否安装
*
* @return
*/
private boolean checkSpeechServiceInstall() {
String packageName = "com.iflytek.speechcloud";
List<PackageInfo> packages = getPackageManager()
.getInstalledPackages(0);
for (int i = 0; i < packages.size(); i++) {
PackageInfo packageInfo = packages.get(i);
if (packageInfo.packageName.equals(packageName)) {
return true;
} else {
continue;
}
}
return false;
} /**
* 语音合成的参数设置
*
* @param param
* @return
*/
private void setParam() {
mTts.setParameter(SpeechConstant.ENGINE_TYPE,
sp.getString("engine_preference", "local")); if (sp.getString("engine_preference", "local")
.equalsIgnoreCase("local")) {
mTts.setParameter(SpeechSynthesizer.VOICE_NAME,
sp.getString("role_cn_preference", "xiaoyan"));
} else {
mTts.setParameter(SpeechSynthesizer.VOICE_NAME,
sp.getString("role_cn_preference", "xiaoyan"));
}
mTts.setParameter(SpeechSynthesizer.SPEED,
sp.getString("speed_preference", "50")); mTts.setParameter(SpeechSynthesizer.PITCH,
sp.getString("pitch_preference", "50")); mTts.setParameter(SpeechSynthesizer.VOLUME,
sp.getString("volume_preference", "50"));
}
(3)初期化监听,我在ErrorCode.SUCCESS初始化成功后显示语音引擎可用的状态,否则红叉显示不可以状态。合成回调监听,这里为了避免异步方式调用,听不清楚,使用了局部变量记录当前的语音播报状态isPlaySound。引擎支持异步调用,如果不控制会出现,一句话没说完,其他调用又在发起请求的情况,使用了队列来控制播报的顺序。
/**
* 初期化监听。
*/
private InitListener mTtsInitListener = new InitListener() { @Override
public void onInit(ISpeechModule arg0, int code) {
if (code == ErrorCode.SUCCESS) {
btn_voiceDemo
.setBackgroundResource(R.drawable.voice_enable_style);
} else {
btn_voiceDemo
.setBackgroundResource(R.drawable.voice_disable_style);
}
}
}; /**
* 合成回调监听。
*/
private SynthesizerListener mTtsListener = new SynthesizerListener.Stub() {
@Override
public void onBufferProgress(int progress) throws RemoteException { } @Override
public void onCompleted(int code) throws RemoteException {
activity_main.this.runOnUiThread(new Runnable() {
@Override
public void run() {
int pos = voiceQueueList.indexOf(getCurrentVoiceEntity());
if (pos != -1) {
currentVoiceEntity.setVoicePlayNum(currentVoiceEntity
.getVoicePlayNum() + 1);
voiceQueueList.remove(pos);
if (currentVoiceEntity.getVoicePlayNum() > Integer
.parseInt(sp
.getString("voice_play_timers", "0"))) {
currentVoiceEntity.setIsVoicePlayed(true);
new ExecVoiceStatusChangeBiz().execute(String
.valueOf(getCurrentVoiceEntity().getKeyId()));
}
voiceQueueList.add(currentVoiceEntity);
}
loadVoiceTaskList();
}
});
isPlaySound = false;
} @Override
public void onSpeakBegin() throws RemoteException {
isPlaySound = true;
} @Override
public void onSpeakPaused() throws RemoteException { } @Override
public void onSpeakProgress(int progress) throws RemoteException { } @Override
public void onSpeakResumed() throws RemoteException { }
}; /**
* 窗体销毁时释放语音服务资源
*/
@Override
protected void onDestroy() {
super.onDestroy();
mTts.stopSpeaking(mTtsListener);
mTts.destory();
}
3、完成。截图纪念一下:
安卓TTS语音合成经验分享(科大讯飞语音+)集成的更多相关文章
- UI进阶 科大讯飞(2) 语音合成(文字转换成语音)
科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...
- AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能
在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...
- 解读 Android TTS 语音合成播报
随着从事 Android 开发年限增加,负责的工作项目也从应用层开发逐步过渡到 Android Framework 层开发.虽然一开始就知道 Android 知识体系的庞大,但是当你逐渐从 Appli ...
- 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)
简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...
- Kaggle 数据挖掘比赛经验分享(转)
原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...
- <交流贴>android语音识别之科大讯飞语音API的使用
因为最近在研究语音识别,所以借鉴了一下CreAmazing网友的帖子 Android系统本身其实提供有语音识别模块,在它的APIDemo里也有关于语音识别的sample,不过经过大多开发者的真机测 ...
- Kaggle 数据挖掘比赛经验分享
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 腾讯广告算法大赛 作者 | 陈成龙 Kaggle 于 2010 年创立,专注数据科学,机器学 ...
- (转)CMOS Sensor的调试经验分享
CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一些调试经验. 首先,要认识CMOS摄像头的结构.我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头.感应器和图像信号处 ...
- CMOS Sensor的调试经验分享
转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一 ...
随机推荐
- PC-PC-单片机(Arduino)通信实例
请仔细理解相关参数,如端口设置.IP设置.COM口设置......等等.....不要盲目COPY.....这涉及2台电脑和一个单片机,其中一台电脑作为服务器并与单片机相连,负责通过网络与客户端通信(s ...
- sublime text 3 or sublime text 2 安装install package control
步骤 ctrl+` or View > Show Console sublime text 3 import urllib.request,os,hashlib; h = '7183a2d3e ...
- Django实现一个相片管理系统01
有些日子没写笔记,O(∩_∩)O哈哈~实在是肚子没有墨水啦!今天不写数据结构啦!多怀念研究数据结构的日子啊! 可是呢!最近有个项目要搞图像管理方面的,具体内容就不说啦!我们今天来实现一个简单的相册管理 ...
- Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o
Atitit.Hibernate中Criteria 使用总结and 关联查询 and 按照子对象查询 o9o 1. Criteria,,Criterion ,, 1 <2. 主要的对象黑头配置磊 ...
- paip.前端加载时间分析之道优化最佳实践
paip.前端加载时间分析之道优化最佳实践 1.另存为 ,查看文件尺寸..和图片. 2.view the 另存为的htm静态的文件单个的加载,看时间...可以排除编程语言的问题and 数据库.. ## ...
- FIR.im Weekly - 技术是练出来的
本期 Weekly 主要精选了上周一些不错的 GitHub 资源.开发工具和技术实践教程类文章分享给大家. JSPatch – 动态更新 iOS APP JSPatch 是 @Bang 最近业余做的小 ...
- Codeforces Round #379 (Div. 2) 总结分享
前言 初入acm的新手,打算在cf混.这几天没有比赛,就做了个最新的Virtual participation.虽然说div2比较简单,但还是被虐得体无完肤...Orz.两个小时,共6道题.最后只AC ...
- Oracle数据库恢复
建用户 wf2014 赋权限 grant dba to wf2014; 数据恢复 imp wf2014/wf2014 file=D:\wf2014.dmp full=y 参数设置: datasourc ...
- 关于iphone6安装了727个应用后,更新app 导致一些app无法更新,无法删除,重启后消失,但是却还是占用空间的解决办法
我的iphone6 苹果手机,64GB的,存储空间最近一直很吃紧,很捉急,昨天,终于下定决心 解决下这个问题. 由于 空间大,我又随便安装许多APP,现在有727个app,常用的其实就是那个几十个而已 ...
- 【转】iOS超全开源框架、项目和学习资料汇总
iOS超全开源框架.项目和学习资料汇总(1)UI篇iOS超全开源框架.项目和学习资料汇总(2)动画篇iOS超全开源框架.项目和学习资料汇总(3)网络和Model篇iOS超全开源框架.项目和学习资料汇总 ...