安卓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摄像头的一 ...
随机推荐
- YUI Compressor for Sublime text2
YUI Compressor 是一个用来压缩 JS 和 CSS 文件的工具,采用Java开发. 最近压缩文件,常使用在线压缩的方式来压缩文件,一来多有不便,二来如果没有网络,只能搁置了.本文来描述如何 ...
- [BTS] BizTalk With EF
System.TypeInitializationException: The type initializer for 'System.Data.Entity.Internal.AppConfig' ...
- [读书笔记]C#学习笔记六: C#3.0Lambda表达式及Linq解析
前言 最早使用到Lambda表达式是因为一个需求:如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22};例如只想要这个数组中小于15的元素然后重新组装成一个数组或 ...
- 使用轻量级ORM Dapper进行增删改查
项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET.微软的EF.NH等.再跟经理讨论后,经理强调不要用Ef,NH做ORM,后期的sql优化不好做,公司 ...
- .net使用cefsharp开源库开发chrome浏览器(一)
一.背景 公司现在使用.NET技术,有web组.有winfrom桌面组.而这两组团队业务部分有分多相似的地方,使用的数据源也是相同的,以此造成两组团队之间做了很多彼此都已经做过的工作. 有什么办法使得 ...
- atitit js 开发工具 ide的代码结构显示(func list) outline总结
atitit js 开发工具 ide的代码结构显示(func list) outline总结 eclips环境::4.3.1 #-------需要一个js开发工具,可以显示outline或者代码结构显 ...
- Leetcode 6 ZigZag Conversion 字符串处理
题意:将字符串排成Z字形. PAHNAPLSIIGYIR 如果是5的话,是这样排的 P I AP YR H L G N SI A I 于是,少年少女们,自己去找规律吧 提示:每个Z ...
- 如何在安装程序中判断操作系统是否是64位 inno
[Setup]; 开启64位模式ArchitecturesInstallIn64BitMode=x64 [Run] ;根据是否是64位进行不同的操作Filename: "..."; ...
- Linux内核--异常和中断的区别
相信大家都知道非常著名的两个名词:异常和中断,不过,你真的理解这两个名词在说什么吗?它们之间有什么区别呢? 1.中断 大家都知道,当我们在敲击键盘的同时就会产生中断 ...
- Cluster群集
Cluster群集一般来讲有四个功能1. 冗余功能,就是说在这个群集中的任何一台机器出现本机或网络故障时,整个网络仍不中断,对外的服务也不中断,网络有多个路线可以走,服务器也可以相互代替.2.负载均衡 ...