APP收款语音播报功能讲解

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 比起主动扫码能确定收款多少与是否到账,扫二维码支付场景不能直接确认,需要核对客户付款截屏,目前微信、支付宝在扫二维码支付后,均支持收款方自动播报收款到账信息,为了秦丝APP有更好体验,也需要加入该功能。

一、背景

比起主动扫码能确定收款多少与是否到账,扫二维码支付场景不能直接确认,需要核对客户付款截屏,目前微信、支付宝在扫二维码支付后,均支持收款方自动播报收款到账信息,为了秦丝APP有更好体验,也需要加入该功能。

二、方案

目前实现的收款语音播报功能采用片段组合读音的方案,简单的解释就是根据收款的金额,提取相应数值语音播报,分别包括0-9,十-亿及一些单位或者标注发音等19个语音文件。
比起传统语音合成方案,无需幅度增加app的大小,灵活控制语速。

三、实现

1、触发:在收到收款单号推送后,请求收款金额

2、解析:根据收款金额,解析成一个语音文件对象的数组
以999999.99为例,拆解小数点左右两边部分后分开解析,小数点左边部分又以万为单位拆分,先解析万以内数字,然后再讲万以上的部分又当成万以内的解析加万语音片段,亿、兆类似。小数点后面的部分则从不加单位解析。

// 获取数字转语音文件的队列
function getArrayByNumber(num) {
    num = num + "";
    if (/^(0|[1-9]\d*)(.\d*[1-9])?$/.test(num)) {
        var nums = num.split("."), pointAfter = nums[1], flag = 0;
        num = Number(nums[0]);
        num = dealNum(num);
        num.unshift(unitsOther.get);
        if(pointAfter) {
            nums = pointAfter.split('');
            num.push(unitsOther.point);
            nums.map(function (val) {
                num.push(units[Number(val)]);
            });
            num.push(unitsOther.yuan);
        } else {
            num.push(unitsOther.yuan);
            num.push(unitsOther.it);
        }
        return num;
    } else {
        return [audios.zero];
    }
}

// 获取万以上的解析数组
function dealNum(num) {
    var currNum, level = 0;
    var arr = [],arrTemp, addZero;
    if(num === 0){
        return [units[0]];
    }
    while (num > 0) {
        currNum = num % WAN;
        if (currNum) {
            if (addZero) {
                arr.unshift(units[0]);
            }
            if (level === 2) {
                arr = [unitsUpWan[2]].concat(arr);
            } else if (level) {
                arr = [unitsUpWan[1]].concat(arr);
            }
            arrTemp = dealNumInWan(currNum);
            addZero = arrTemp[0];
            arr = arrTemp[1].concat(arr);
        }
        level++;
        num = Math.floor(num / WAN);
    }
    return arr;
}

// 获取万以内的解析数组
function dealNumInWan(num) {
    var zero, firstIsZero = num / QIAN < 1 && num > 0;
    var arr = [], currNum, unit = 0;
    while (num > 0) {
        currNum = num % SHI;
        if (currNum) {
            zero === undefined && (zero = false);
            if (unit) {
                if (zero) {
                    arr.unshift(units[0]);
                    zero = false;
                }
                arr.unshift(unitsInWan[unit]);
            }
            arr.unshift(units[currNum]);
        } else {
            zero === false && (zero = true);
        }
        unit++;
        num = Math.floor(num / SHI);
    }
    return [firstIsZero, arr];
}

Audio 对象是一个语音文件对象,每个语音对应有个对象,里面有文件的路径与播放时长,时长是自己设置的每个语音对应有个对象,里面有文件的路径与播放时长,时长是自己设置,时间极短的语音如果有了延时就不会连续播放,时间duration这里需要稍微根据实际情况进行调整

// 语音文件路径与语音文件需用时间的钩子
var audios = {
    zero: {
        src: "media/0.wav",
        duration: 800
    },
    one: {
        src: "media/1.wav",
        duration: 800
    },
    two: {
        src: "media/2.wav",
        duration: 800
    },
    three: {
        src: "media/3.wav",
        duration: 800
    }
……
    nine: {
        src: "media/9.wav",
        duration: 800
    },
    point: {
        src: "media/point.wav",
        duration: 800
    },
    ten: {
        src: "media/ten.wav",
        duration: 700
    },
    hd: {
        src: "media/hd.wav",
        duration: 700
    },
    td: {
        src: "media/td.wav",
        duration: 700
    },
    ttd: {
        src: "media/ttd.wav",
        duration: 700
    },
    hm: {
        src: "media/hm.wav",
        duration: 700
    },
    yuan: {
        src: "media/yuan.wav",
        duration: 700
    },
    it: {
        src: "media/it.wav",
        duration: 700
    },
    get: {
        src: "media/get.wav",
        duration: 1800
    }
};

// 数字转换成语音文件的数组方案
var unitsInWan = ["", audios.ten, audios.hd, audios.td];
var unitsUpWan = ["", audios.ttd, audios.hm, audios.ttd];
var units = [audios.zero, audios.one, audios.two, audios.three, audios.four, audios.five, audios.six, audios.seven, audios.eight, audios.nine];
var unitsOther = {
    "point": audios.point,
    "yuan": audios.yuan,
    "it": audios.it,
    "get": audios.get
};

3、播报:递归方式逐个播放片段

function startAAudio(number, index, audiosArr) {
    audiosArr || (audiosArr = getArrayByNumber(number));
    realMedia = new Media(extUrl + audiosArr[index].src);
    setTimeout(function () {
        realMedia.stop();
        realMedia.release();
        index++;
        if (audiosArr[index]) {
            startAAudio(number, index, audiosArr);
        } else {
            realMedia = undefined;
            if(number = audioList.shift()) { // 如果有队列中有新的语音则播放下一则语音
                setTimeout(function () { // 连续收款加点时间间隔
                    startAAudio(number, 0);
                },2000);
            }
        }
    }, audiosArr[index].duration);
    realMedia.play();
}

注意

需要用到媒体播放插件cordova-plugin-media

目录
相关文章
|
20天前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
119 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
14天前
|
搜索推荐 数据挖掘
直播App程序源码开发前期功能调研:运营角度思考如何有利于推广运营获利
在直播App程序源码开发的前期,功能调研至关重要。除了技术实现的可行性,更需要从运营角度出发,思考哪些功能能够助力推广运营,最终实现获利。山东布谷科技从运营角度,对直播App功能进行调研分析
|
1月前
|
小程序 搜索推荐
2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
线下陪玩约玩APP旨在满足现代人的社交、兴趣分享、专业指导及休闲娱乐需求。用户可通过平台结识新朋友、找到志同道合的伙伴,并享受高质量的陪玩服务。平台提供用户注册登录、陪玩师筛选与预约、实时沟通等功能,支持个性化游戏体验和高效匹配。
63 0
2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
|
1月前
|
开发框架 缓存 搜索推荐
PiliPala:开源项目真香,B站用户狂喜!这个开源APP竟能自定义主题+去广告?PiliPala隐藏功能大揭秘
嗨,大家好,我是小华同学。PiliPala 是一个基于 Flutter 开发的 BiliBili 第三方客户端,提供流畅、个性化的使用体验。核心功能包括视频浏览与推荐、用户互动、丰富的播放设置、多维度搜索和个性化主题等。相比官方客户端,PiliPala 功能更丰富、性能更优、界面更美观。
122 14
|
1月前
|
前端开发 Java 测试技术
语音app系统软件源码开发搭建新手启蒙篇
在移动互联网时代,语音App已成为生活和工作的重要工具。本文为新手开发者提供语音App系统软件源码开发的启蒙指南,涵盖需求分析、技术选型、界面设计、编码实现、测试部署等关键环节。通过明确需求、选择合适的技术框架、优化用户体验、严格测试及持续维护更新,帮助开发者掌握开发流程,快速搭建功能完善的语音App。
|
1月前
|
Web App开发 前端开发 安全
语音交友app系统源码功能及技术研发流程剖析
语音交友App核心功能包括语音聊天(一对一、群聊、语音消息)、语音房间(直播、主题房、管理)、社交互动(好友、关注、打赏)、内容发现、音效美化、通知提醒及安全隐私等。开发流程涵盖需求分析、技术选型(前端、后端、数据库、实时通信)、UI/UX设计、前后端开发、实时通信集成、音效处理、测试优化、部署上线及运营维护,确保稳定高效运行并持续优化用户体验。
|
3月前
|
PHP
全新uniapp小说漫画APP小说源码/会员阅读/月票功能
价值980的uniapp小说漫画APP小说源码/会员阅读/月票功能
181 20
|
3月前
|
移动开发 小程序 前端开发
使用php开发圈子系统特点,如何获取圈子系统源码,社交圈子运营以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP 小程序 H5
开发一个圈子系统(也称为社交网络或社群系统)可以是一个复杂但非常有趣的项目。以下是一些关键特点和步骤,帮助你理解如何开发、获取源码以及运营一个圈子系统。
215 4
|
4月前
|
监控 安全 开发者
山东布谷科技:关于直播源码|语音源码|一对一直播源码提交App Store的流程及重构经验
分享提交直播源码,一对一直播源码,语音源码到Appstore的重构经验!
|
4月前
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码服务器环境配置及app功能
一对一直播源码阿里云服务器环境配置及要求

热门文章

最新文章