APP收款语音播报功能讲解

简介: 比起主动扫码能确定收款多少与是否到账,扫二维码支付场景不能直接确认,需要核对客户付款截屏,目前微信、支付宝在扫二维码支付后,均支持收款方自动播报收款到账信息,为了秦丝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

目录
相关文章
|
11天前
|
移动开发 小程序 Android开发
基于 uni-app 开发的废品回收类多端应用功能与界面说明
本文将对一款基于 uni-app 开发的废品回收类多端应用,从多端支持范围、核心功能模块及部分界面展示进行客观说明,相关资源信息也将一并呈现。
40 0
|
2月前
|
存储 Java PHP
轻量化短视频电商直播带货APP源码全解析:核心功能与设计流程​
在电商直播热潮下,开发专属直播带货APP成为抢占市场关键。本文详解原生开发轻量化APP的核心功能与全流程设计,涵盖用户登录、商品浏览、直播互动、购物车、订单及售后功能,并介绍安卓端Java、苹果端Object-C、后台PHP的技术实现,助力打造高效优质的直播电商平台。
|
4月前
|
数据库
《仿盒马》app开发技术分享-- 回收订单页功能完善(45)
上一节我们实现了订单的待取件、已取消状态展示,并且成功实现了修改订单状态后的列表刷新,实现了云端数据的修改,这一节我们来实现订单页剩下的两个板块的业务逻辑,分别是运输中、已完成状态下的列表展示以及订单状态的修改
92 1
|
7月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
307 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
3月前
|
存储 移动开发 监控
App Trace功能实战:一键拉起、快速安装与免提写邀请码的应用实践
App Trace系统通过一键拉起、快速安装和免提写邀请码三大功能,显著提升用户转化率、安装成功率和邀请注册率。结合深度技术实现与优化,助力公司用户增长,成为移动端核心基础设施。
|
4月前
|
UED
《仿盒马》app开发技术分享-- 扫一扫功能(35)
随着app的逐渐完善,我们现在需要在细节处做更多的打磨,在首页我们添加了很多静态的按钮和组件,现在我们开始对这些组件进行功能的添加,这次首先实现的是首页头部的扫一扫功能,扫一扫我们实现扫码后跳转商品详情页
97 0
|
4月前
|
存储 数据库
《仿盒马》app开发技术分享-- 购物车功能完善(14)
上一节我们实现了购物车商品列表的状态切换,已添加商品数量的增减,已添加商品滑动删除,已添加商品在选中情况下的价格计算。这一节我们在这些功能的基础上实现云端记录,因为我们现在只有数据的查询是从云端获取的,其他的操作虽然都实现了相对应的功能,但是当我们操作完,关闭app,再打开不会有对应的记录,有的同学可能会说,那我们把数据用首选项或者数据库的形式存储就可以了吧? 那如果我更换了另一个设备那这些添加的数据是不是就又不能使用了?所以我们的每个操作,最好都是提交到云端,这样我们在其他设备,在退出应用,切换账号这些情况下都能很好的保存我们操作后的购物车状态。
92 0
|
4月前
|
前端开发
《仿盒马》app开发技术分享-- 购物车基础功能实现(13)
上一节我们实现了加入购物车和购物车列表的简单展示。对一个电商类的应用来说,这很显然是不够的,我们的购物车内容应该更加的丰富,他需要用户能自主的去选择想要结算的商品,删除一些不需要的商品,或者取消掉一些本次不结算的商品,同时根据选择的不同,我们需要把相对应的价格和选择的数量等信息传递给用户,帮助用户节省更多的时间。
82 0
|
7月前
|
Web App开发 编解码 算法
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
在当今移动社交领域,一对一视频和语音通话功能已成为用户期待的基础配置。从熟人社交到陌生人交友,从专业咨询到情感陪伴,实时音视频互动能力直接决定了社交App的用户留存和市场竞争力。山东布谷科技将深入探讨一对一直播源码开发高质量一对一视频和语音通话功能的关键要素和技术实现方案。
布谷一对一直播源码开发:阿里云视频语音通话社交交友App的必备功能
|
6月前
|
移动开发 开发工具 数据库
App内“邀请好友“功能:如何准确追踪邀请关系并自动发放奖励
探讨如何准确追踪APP“邀请好友”功能中的邀请关系并自动发放奖励
220 2

热门文章

最新文章