安卓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摄像头的一 ...
随机推荐
- centos6.4 64位下安装nfs文件共享系统
不知道谁装的服务器,默认自带,以下内容摘自互联网,配置部分按教程执行成功 一.环境介绍: 服务器:centos 192.168.1.225 客户端:centos 192.168.1.226 二.安装: ...
- CentOS Minimal版最小化安装后VMware联网详解
最近想搞个mailman邮件列表,又不想在我常用的CentOS 6.4上做实验,怕破坏了环境,于是就想装个试验机,又嫌它占空间太大,于是找了半天发现CentOS 6.0的minimal版本最适合了,装 ...
- paip.spring3 mvc servlet的配置以及使用最佳实践
paip.spring3 mvc servlet的配置以及使用最佳实践 1. Web.xml 1 2. springMVC.xml 2 1. mvcAction .mvcAction 2 2. Res ...
- android eclipse关联源码,以及源码(代码)以及jar查看软件
1.eclipse关联源码 步骤一:自已百度下载相应版本的源码,我这里是4.2也就是API=17的版本. 步骤二:找到你安装sdk的目录, G:\Program Files\adt-bundle-wi ...
- 使用Maven编译项目遇到——“maven编码gbk的不可映射字符”解决办法 ——转载
一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误
- 题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? //一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米 doub ...
- iframe父子页面调用小结
子页面调用父页面 $('#Id', window.parent.document); //调用父页面元素 window.parent.func1(); //调用父页面方法 (子页面同理,需将js方 ...
- [推荐]T- SQL性能优化详解
[推荐]T- SQL性能优化详解 博客园上一篇好文,T-sql性能优化的 http://www.cnblogs.com/Shaina/archive/2012/04/22/2464576.html
- Mac OS 中设置VPN(pptp连接方式)
第一步:点击系统设置(如图) 第二步:点击网络,进入网络设置(如图) 第三步:点击+号-创建新服务,创建新的VPN网络连接(如图) 第四步:接口-中选-VPN, VPN类型-中选-PPTP,服务名称- ...
- pgpgin|pgpgout|pswpin|pswpout意义与差异
引用来自: http://ssms.cs2c.com.cn/otrs/pc.pl?Action=PublicFAQZoom;ItemID=11741 文章主要意思是: 1. page in/out操作 ...