android 语音播报方案,Android 语音播报实现方案(无SDK)
作者:姜康
链接:https://www.jianshu.com/p/df2022b3937d
声明:本文是 姜康 原创。转载请联系作者获得授权。
功能描述
类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到“支付宝到账12.55元”的语音播报。
要解决的问题
1.播放单个语音文件
2.播放完单个语音文件之后立即播放下一条,这样才能连续
3.当多个完整的语音序列都需要播报时的处理(比如支付宝短时间内收到多条收款推送)
实现思路
播放单个文件选择MediaPlayer
首先创建一个MediaPlayer实例
MediaPlayer player = new MediaPlayer();
然后设置数据源,这里数据源从assets中获取,当然也可以将语音文件放在raw文件夹里
fd = FileUtils.getAssetFileDescription(path);
player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(),fd.getLength());
然后调用 prepareAsync() 方法,异步加载,并设置监听,加载完毕之后开始播放(与 prepare 方法区别开来)
player.prepareAsync();
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp){
mp.start();
}
});
由于播放的语音文件不止一个,因此需要监听播放完成的状态,在播放完成之后播放下一条语音
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
counter[0]++;
if (counter[0] < list.size()) {
try {
AssetFileDescriptor fileDescriptor = FileUtils.getAssetFileDescription(String.format("sound/tts_%s.mp3", list.get(counter[0])));
mp.setDataSource(fileDescriptor.getFileDescriptor(), fileDescriptor.getStartOffset(), fileDescriptor.getLength());
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
latch.countDown();
}
} else {
mp.release();
latch.countDown();
}
}
});
短时间多次播报请求,开采用同步方式进行,一条播完播放下一条,这里采用
synchronized + notifyAll() 实现,当然也可以用别的方法。
代码封装
功能代码分为两部分,一部分是语音序列组成的 List,这里是 VoiceTemplate;
一部分是播放的功能封装,接收 List,然后播放语音,这里叫做 VoiceSpeaker;
详细代码见文末。
代码使用
比如要播放“支付宝到账十二点一三元”,代码如下
final List list = new VoiceTemplate()
.prefix("success")
.numString("12.13")
.suffix("yuan")
.gen();
VoiceSpeaker.getInstance().speak(list);
源码
KTools:
https://link.jianshu.com/?t=https://github.com/jiangkang/KTools
https://github.com/jiangkang/KTools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/VoiceSpeaker.java
https://github.com/jiangkang/KTools/blob/master/app/src/main/java/com/jiangkang/ktools/audio/VoiceTemplate.java
android 语音播报方案,Android 语音播报实现方案(无SDK)相关推荐
- java语音播报源代码_详解Android 语音播报实现方案(无SDK)
本文介绍了详解Android 语音播报实现方案(无SDK),分享给大家,具体如下: 功能描述 类似支付宝收款时候的语音播报功能:当别人扫描你的收款码,你收到钱之后,就会听到"支付宝到账12. ...
- Android端离线推送语音播报原理实现
碰到的问题差不多两个: 首先是离线推送的问题,如果离线推送需要语音播报的话,需要APP运行一个前台服务,这个服务运行才行,否则自己的代码都没有,怎么实现语音播报呢? 第二就是怎么用服务去获取到离线推送 ...
- android电话语音播放,使用Android自带的TTS实现语音播报(电话号码)功能
事先声明:该文章参考以下几篇文章,如果大家想看,可直接点击进入: https://github.com/SolveBugs/Utils/blob/master/SpeechUtils.java htt ...
- Android TextToSpeech实现文字转语音,进行播报
1. 下载讯飞语音引擎 2.初始化 TextToSpeech. 使用下面的构造函数进行初始化 TextToSpeech(android.content.Context context, android ...
- 来电语音播报软件下载apk_来电播报app下载 来电姓名播报 for Android v1.2.6 安卓版 下载-脚本之家...
来电播报APP是一款提供来电信息提醒的软件,汇聚多种提醒模式供用户选择使用,如照片提示.音乐提示.来电号码提示等等,让用户可以在电话接通的一瞬间就能知道和自己打电话是谁,避免出现不知道对方是谁的尴尬场 ...
- android 语音播报中文,android 语音播报(通过手说tts 实现中文语音播报)
手说TTS介绍: 手说TTS,是Android平台下的中文语音引擎,提供了中文文本到语音的转换. 使用手说TTS进行中文文本的朗读,包括中文简繁体.阿拉伯数字.英文字母及一些符号的混读.并且处理了中文 ...
- android离线语音开发,Android应用开发之Android 云之声离线语音合成
本文将带你了解Android应用开发之Android 云之声离线语音合成,希望本文对大家学Android有所帮助. 离线语音解析 public class SpeechUtilOffline impl ...
- python语音播报库-python 语音库
广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 我需要自动分离两位发言者的声音. 我刚开始学习语音识别,我看了python的wav ...
- python 语音播报库_python 语音库
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我需要自动分离两位发言者的声音. 我刚开始学习语音识别,我看了python的wa ...
- Android 讯飞语音开发(Android Studio)
前段时间火了一个很牛的讯飞语音,去看官方文档,瞬间蒙逼,官方是用的eclipse,我用的Android Studio.好了,能上代码尽量不BB. 先来看看gradle里面要配置的东西. module里 ...
最新文章
- 深度学习助力网络科学:基于深度学习的社区发现最新综述
- Python Day34
- svn的备份还原(一)
- 【好文翻译】二十年来我得到的20条编程经验
- 获取指定文件目录路径下的所有文件
- Delphi 2009 安装序列号
- 视频教程-Windows程序设计应用开发-C/C++
- C语言——是否为闰年的判断
- react-router-dom文档
- 自我思考:世界观与方法论——关于做事方法,情商,智商,爱商的深入思索
- maven报错cannot reconnect
- 4G工业路由器大气环境监测方案
- linux c open flush,ctrl+c以及写操作失败和flush
- java图形界面编程视频,mysql数据库引擎面试
- TreeMap、二叉树
- Access FileDialog 用户定义类型未定义(User-defined type not defined)的解决方法
- directory index of “/data/“ is forbidden
- 要跑步,选对鞋!给新手的跑步鞋指南
- orleans remote call error
- C++Qt中qmake的详解