应用场景:足浴软件,技师钟房安排调派和队列排序查看,语音播报提醒。老程序是使用双屏显卡,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语音合成经验分享(科大讯飞语音+)集成的更多相关文章

  1. UI进阶 科大讯飞(2) 语音合成(文字转换成语音)

    科大讯飞开放平台.SDK下载.添加静态库.初始化见UI进阶 科大讯飞(1) 语音听写(语音转换成文字) 实现语音合成 功能实现步骤: 导入头文件 创建文字识别对象 指定文字识别后的回调代理对象 开启文 ...

  2. AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能

    在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...

  3. 解读 Android TTS 语音合成播报

    随着从事 Android 开发年限增加,负责的工作项目也从应用层开发逐步过渡到 Android Framework 层开发.虽然一开始就知道 Android 知识体系的庞大,但是当你逐渐从 Appli ...

  4. 【干货】Kaggle 数据挖掘比赛经验分享(mark 专业的数据建模过程)

    简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比赛,相继获得了 C ...

  5. Kaggle 数据挖掘比赛经验分享(转)

     原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...

  6. <交流贴>android语音识别之科大讯飞语音API的使用

      因为最近在研究语音识别,所以借鉴了一下CreAmazing网友的帖子 Android系统本身其实提供有语音识别模块,在它的APIDemo里也有关于语音识别的sample,不过经过大多开发者的真机测 ...

  7. Kaggle 数据挖掘比赛经验分享

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 腾讯广告算法大赛 作者 | 陈成龙 Kaggle 于 2010 年创立,专注数据科学,机器学 ...

  8. (转)CMOS Sensor的调试经验分享

    CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一些调试经验. 首先,要认识CMOS摄像头的结构.我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头.感应器和图像信号处 ...

  9. CMOS Sensor的调试经验分享

    转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一 ...

随机推荐

  1. [游戏学习26] MFC 时间函数 画图形

    >_<:这里第一次介绍MFC的时间函数,功能和Win32里的计时器类似. >_<:这里还介绍了MFC的图形绘制函数,和Win32有一点区别 >_<:ABC.h #d ...

  2. 图解AngularJS Wijmo5和LightSwitch

    Visual Studio 2013 中的 LightSwitch 有新增功能,包括更好的团队开发支持以及在构建 HTML 客户端桌面和 Office 365 应用程序方面的改进.本文结合最新发布的W ...

  3. 解决TCP网络传输粘包问题

    很久之前就想写一写关于TCP粘包处理的文章了,无奈一直做WEB开发 没时间研究那个,拖了很久,最近要为一个客户做winform 服务器端,要用到SOCKET就发现了这个问题,这才想起来要解决. 下面用 ...

  4. jquery时间倒计时

    代码: js: function countDown(time, id) {  //time的格式yyyy/MM/dd hh:mm:ss    var day_elem = $(id).find('. ...

  5. LeakCanary 中文使用说明

    http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ LeakCanary 中文使用说明 分享到:新浪微博微信 10 May 2015 Leak ...

  6. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  7. 分布式Hadoop安装(二)

    二.集群环境安装Zookeeper 1.         hadoop0,namenode机器下,配置zookeeper,先解压安装包. 使用命令:tar -zxvf zookeeper-3.4.4. ...

  8. Java 中的instanceof简单讲解

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...

  9. Understanding mysql max_connect_errors

    来自:http://mysqlblog.fivefarmers.com/2013/08/08/understanding-max_connect_errors/ Perhaps like many u ...

  10. Mysql自动备份工具1.0(2013年11月15日更新)

    Mysql自动备份工具1.0 下载地址 2013-11-15 1.解决日历控件在Windows7/8/8.1环境下遮挡按钮问题:2.解决按月备份当月没有该日期问题: 2013-11-13 1.Mysq ...