主要思路: 1.处理需要播报的金额 2.合成语音文件,对金额播报

其实很简单,两行代码直接搞定

List<String> list = new VoiceTemplate().prefix("success").numString(money).suffix("yuan").gen();
VoiceSpeaker.getInstance().speak(list);

步骤1.对播报的金额通过小数点判断,拆解为整数和小数部分

import android.text.TextUtils;import java.util.ArrayList;
import java.util.List;public class VoiceTemplate {private static final String DOT = ".";private String numString;private String prefix;private String suffix;private static final char[] NUM = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};private static final char[] CHINESE_UNIT = {'元', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'};public VoiceTemplate() {}public VoiceTemplate prefix(String prefix) {this.prefix = prefix;return this;}public VoiceTemplate suffix(String suffix) {this.suffix = suffix;return this;}/*** 处理执行的金额,目前只支持亿级别,想支持更大数据,自己改** @param numString* @return*/public VoiceTemplate numString(String numString) {this.numString = numString;return this;}public List<String> gen() {return genVoiceList();}private List<String> genVoiceList() {List<String> result = new ArrayList<>();if (!TextUtils.isEmpty(prefix)) {result.add(prefix);}if (!TextUtils.isEmpty(numString)) {result.addAll(genReadableMoney(numString));}if (!TextUtils.isEmpty(suffix)) {result.add(suffix);}return result;}/*** 处理小数点之前和之后的数据** @param numString* @return*/private List<String> genReadableMoney(String numString) {List<String> result = new ArrayList<>();if (!TextUtils.isEmpty(numString)) {if (numString.contains(DOT)) {String integerPart = numString.split("\\.")[0];String decimalPart = numString.split("\\.")[1];List<String> intList = readIntPart(integerPart);List<String> decimalList = readDecimalPart(decimalPart);result.addAll(intList);if (!decimalList.isEmpty()) {result.add("dot");result.addAll(decimalList);}} else {result.addAll(readIntPart(numString));}}return result;}private List<String> readDecimalPart(String decimalPart) {List<String> result = new ArrayList<>();if (!"00".equals(decimalPart)) {char[] chars = decimalPart.toCharArray();for (char ch : chars) {result.add(String.valueOf(ch));}}return result;}private List<String> readIntPart(String integerPart) {List<String> result = new ArrayList<>();String intString = readInt(Integer.parseInt(integerPart));int len = intString.length();for (int i = 0; i < len; i++) {char current = intString.charAt(i);if (current == '拾') {result.add("ten");} else if (current == '佰') {result.add("hundred");} else if (current == '仟') {result.add("thousand");} else if (current == '万') {result.add("ten_thousand");} else if (current == '亿') {result.add("billion");} else {result.add(String.valueOf(current));}}return result;}/*** 返回关于钱的中文式大写数字,支仅持到亿*/public static String readInt(int moneyNum) {String res = "";int i = 0;if (moneyNum == 0) {return "0";}if (moneyNum == 10) {return "拾";}if (moneyNum > 10 && moneyNum < 20) {return "拾" + moneyNum % 10;}while (moneyNum > 0) {res = CHINESE_UNIT[i++] + res;res = NUM[moneyNum % 10] + res;moneyNum /= 10;}return res.replaceAll("0[拾佰仟]", "0").replaceAll("0+亿", "亿").replaceAll("0+万", "万").replaceAll("0+元", "元").replaceAll("0+", "0").replace("元", "");}
}

步骤2.播报金额及相关TTS文件合成


import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.MediaPlayer;import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class VoiceSpeaker {private static VoiceSpeaker sInstance;private ExecutorService service;private VoiceSpeaker() {service = Executors.newCachedThreadPool();}public static synchronized VoiceSpeaker getInstance() {if (sInstance == null) {sInstance = new VoiceSpeaker();}return sInstance;}public void speak(final List<String> list) {if (service != null) {service.execute(new Runnable() {@Overridepublic void run() {start(list);}});}}/*** android自带MediaPlayer进行语音播报,简单方便* @param list*/private void start(final List<String> list) {synchronized (this) {//防止混合播报final CountDownLatch latch = new CountDownLatch(1);MediaPlayer player = new MediaPlayer();if (list != null && list.size() > 0) {final int[] counter = {0};String path = String.format("sound/tts_%s.mp3", list.get(counter[0]));AssetFileDescriptor fd = null;try {//加载合成好的本地TTS语音文件fd = getAssetFileDescription(path);player.setDataSource(fd.getFileDescriptor(), fd.getStartOffset(), fd.getLength());player.prepareAsync();player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {mp.start();}});player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {mp.reset();counter[0]++;if (counter[0] < list.size()) {try {AssetFileDescriptor fileDescriptor =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();}}});} catch (IOException e) {e.printStackTrace();latch.countDown();} finally {if (fd != null) {try {fd.close();} catch (IOException e) {e.printStackTrace();}}}}try {latch.await();this.notifyAll();} catch (InterruptedException e) {e.printStackTrace();}}}/*** 资源管理器加载对应语音文件* @param filename* @return* @throws IOException*/public static AssetFileDescriptor getAssetFileDescription(String filename) throws IOException {AssetManager manager = BaseApp.getContext().getAssets();return manager.openFd(filename);}
}

getContext全局均可使用

public class BaseApp extends MultiDexApplication {private static Application instance;@Overridepublic void onCreate() {super.onCreate();instance = this;}public static Application getContext() {return instance;}
}

步骤3.来 来 来,注意了,敲黑板了,上面是代码部分,下面进行语音合成,不过也是很easy的啦

百度合成TT文件:http://ai.baidu.com/tech/speech/tts 语速 音色等相关因素自己根据喜好和需求来自定义,你看多简单,将合成好的tts文件放在项目中,如下所示

如何合成所需要的语音文件

Android语音播报商家收款及相关TTS语音文件合成相关推荐

  1. uni-app 语音播报-前台后台离线推送语音播报、到账xx元、收款播报、自定义推送铃(ios)

    uni-app 语音播报-前台后台离线推送语音播报.到账xx元.收款播报.自定义推送铃(ios):https://ext.dcloud.net.cn/plugin?id=8452

  2. html进行语音播报,JQuery插件制作:[2]语音播报jspeech

    在手机网站或者PC网站的资讯页面,想要有一个对文字进行语音播报功能.在网上找了很多资料,大部分都是正对于手机APP的,比如百度语音.这些都是给手机app(android.ios)提供sdk包,然后在调 ...

  3. java语音播报天气_Home Assistant系列 -- 自动语音播报天气

    在树莓派上要让 Home Assistant  发声朗读 ,从硬件上我们需要 3.5mm插口音箱(耳机)或usb口音箱(耳机).软件方面 我们需要一个媒体播放器以及 tts ( 将文字转化为语音的服务 ...

  4. wpf语音播报暂停_使用BabySmash学习WPF-语音合成

    wpf语音播报暂停 NOTE: If you haven't read the first post in this series, I would encourage you do to that ...

  5. python语音播报-Python实现有道翻译+语音播报

    有道翻译 调用有道翻译的接口(用谷歌浏览器打开有道翻译-开发者-开发者工具-查找接口)话不多说上代码 def main(): word = input('请输入翻译的内容:') url = 'http ...

  6. 高德导航语音播报服务区服务器,把地图导航语音播报设置成自己的声音!

    原标题:把地图导航语音播报设置成自己的声音! 点" 来源:群玩助手wshdaqu 相信很多小伙伴都有在用高德地图吧,常听地图中播报员的声音腻了,大家可以改成明星的声音,要是没有喜欢的明星,那 ...

  7. python语音播报天气预报_树莓派之天气预报语音播报

    目录 树莓派之天气预报语音播报 方案选定 项目基调 需求分析 解决方案 具体实施 step1天气信息 安装ilang软件 json解析和文字组合 定时任务 树莓派之天气预报语音播报 前几天跟同事在聊家 ...

  8. php加入语音播报功能_PHP如何实现智能语音播报

    PHP实现智能语音播报的方法:首先获取时间信息,并获取天气状况:然后语音合成:最后播放合成之后的语音文件,代码为[exec('sudo /usr/bin/play /tmp/audio.mp3')]. ...

  9. 【PLC语音播报】用Modbus刷微博新闻热搜-语音朗读案例演示-声光报警灯|语音播报器|Modbus报警灯|网口语音播报|网络语音播报器

    背景 每天上班太忙碌,没有时间刷微博,新闻发展的太快,生怕错过微博热搜,看着支持Modbus的博灵语音通知终端,决定自己写一个脚本,让它给我读新闻! 少废话,先看东西 实现了以下效果 每90分钟刷新一 ...

最新文章

  1. dogdoggo搜索引擎_Giphy:专搜GIF动态图的搜索引擎
  2. 浅谈CruiseControl的部署
  3. [转]如何用VS2005制作Web安装程序
  4. php去除空格函数,php如何清除空格
  5. js将 0,1,2,3...转成一,二,三....(数字转换大写)
  6. 升级鸿蒙谷歌框架下载,网友Mate 40 Pro+升级鸿蒙2.0:谷歌服务不受影响
  7. VC 获取汉字拼音首字母(unicode编码)上
  8. 【人工大猩猩部队优化算法】基于人工大猩猩部队优化算法求解单目标优化问题(GTO)含Matlab源码
  9. 威漫哨兵机器人_漫威:哨兵机器人能不能打过复仇者联盟?
  10. 基于PHP+Html+mysql的客户关系管理CRM系统 文档+项目源码及数据库文件
  11. mysql 计算成功率_mysql数据统计技巧备忘录
  12. [MySQL]-主从同步实战-主从搭建
  13. Linux 压缩软件的使用
  14. WIN10电脑桌面整理及其壁纸应用推荐
  15. windows获取文件列表及文件夹结构
  16. 如何利用MATLAB对多项式进行计算?
  17. 贪吃蛇html网页小游戏,网页贪吃蛇HTML5小游戏制作
  18. 【FPGA】vivado Error:‘launch_simulation‘failed due to earlier errors.
  19. Json数据结构比对
  20. 微信拍一拍怎么设置文字?微信拍一拍加后缀仅需要这样…

热门文章

  1. python面向对象1
  2. php大整数怎么保存,自上而下,逐步揭开PHP解析大整数的面纱
  3. 传统供水与智慧供水模式对比
  4. excel中如何对筛选后的单元格进行复制粘贴
  5. JAVA面试灵魂108问(十七)---数据库4
  6. SAP MBLB、MB5B、MB58、MI24事务码ALV输出配置。
  7. 基于vue的水墨新闻项目(移动端)
  8. 比“永恒之蓝”更厉害的“永恒之石”来了 网络战争一触即发
  9. 新媒体打工人教你如何零经验应聘文案岗
  10. TextView渲染机制与优化(StaticLayout),TextView上的文字分散对齐,TextView用处