主要思路: 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. 黑客用上机器学习你慌不慌?这 7 种窃取数据的新手段快来认识一下!
  2. 你应该知道的青否小程序第三方平台
  3. java rt maven_java – Maven无法使用rt.jar进行编译
  4. CentOS安装crontab及使用方法
  5. Metasploit渗透某高校域服务器
  6. php调用另一个php文件里的变量的值,thinkphp中一个方法调用另一个步骤的变量
  7. CCF202012-1 期末预测之安全指数
  8. annotatedClasses和component-scan冲突吗
  9. Eigen教程(4)之Array类和元素级操作
  10. python用什么编译器-python应选什么编译工具
  11. 双显示器设置鼠标上下移动
  12. 人体反应测试仪 c语言,FD.12-FD-HRT-A
  13. 2019秋期第二次机考总结
  14. 国民技术计划1.4亿入股华夏芯
  15. 计算机文字录入标准,计算机文字录入员考试大纲标准.doc
  16. 微信小程序入门开发教程
  17. python模拟登录淘宝直通车_Python实现的淘宝直通车数据抓取(2)
  18. pythonista_Pythonista的假期愿望清单
  19. Vue props用法详解
  20. Linux 中Mysql出现‘> 如何退出?

热门文章

  1. hive求解中位数的几种方法
  2. C语言的常量与变量详细解读
  3. 图文传授win10系统设置临时环境变量的方法
  4. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java绘本馆管理系统n5wn5
  5. 女程序员用10年青春换来的工资条,值吗?
  6. POJ_1423(Stirling公式)
  7. 计算机专业读研三年,到底值不值!
  8. 触发dblclick事件时,避免触发click事件-实例
  9. 用计算机制作微课教学教案,如何运用微课进行计算机教学
  10. 蒸汽部落游戏盒子下载