前端处理语音播报

113 阅读2分钟

代码写得可能一般般,但是主要是记录处理一下收银系统中的语音播放问题

这里贴出一段工具代码,这里区分了三种状态,所以用了3个if来表达,其实switch更好,当然这不是重点

一种是直接读的文字,读直接现成的MP3文件 一种是读多少钱的,会加上 元 一种就是合成的读法了

export async function speakEx(options: ISpeakItem[]) {

    for (let option of options) {
        if (option.type == 'txt') {
        
            let player = new Audio(`./assets/voice/${option.content}.mp3`);
            await player.play();
            option.ts || (option.ts = 1000);
            await wait(option.ts);
            
        } else if (option.type == 'money') {
        
            let moneyStr = numberParseChina(option.content);
            moneyStr += '元';
            for (let moneyStrItem of moneyStr) {
                let player = new Audio(`./assets/voice/${moneyStrItem}.mp3`);
                await player.play();
                option.ts || (option.ts = 300);
                await wait(option.ts);
            }
        } else if (option.type == 'serialNo') {
        
            let moneyStr = numberParseChina(option.content);
            moneyStr += '号';
            for (let moneyStrItem of moneyStr) {
                let player = new Audio(`./assets/voice/${moneyStrItem}.mp3`);
                await player.play();
                option.ts || (option.ts = 300);
                await wait(option.ts);
            }
        }
        
    }
}

这里附上 数字转汉字的方法

function numberParseChina(money) {
    //汉字的数字
    var cnNums = new Array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
    //基本单位
    var cnIntRadice = new Array('', '十', '百', '千');
    //对应整数部分扩展单位
    var cnIntUnits = new Array('', '万', '亿', '兆');
    //对应小数部分单位
    var cnDecUnits = new Array('', '', '毫', '厘');
    //整数金额时后面跟的字符
    // var cnInteger = '整';
    //整型完以后的单位
    var cnIntLast = '';
    //最大处理的数字
    var maxNum = 999999999999999.9999;
    //金额整数部分
    var integerNum;
    //金额小数部分
    var decimalNum;
    //输出的中文金额字符串
    var chineseStr = '';
    //分离金额后用的数组,预定义
    var parts;
    if (money == '') { return ''; }
    money = parseFloat(money);
    if (money >= maxNum) {
        //超出最大处理数字
        return '';
    }
    if (money == 0) {
        chineseStr = cnNums[0] + cnIntLast;
        return chineseStr;
    }
    //转换为字符串
    money = money.toString();
    if (money.indexOf('.') == -1) {
        integerNum = money;
        decimalNum = '';
    } else {
        parts = money.split('.');
        integerNum = parts[0];
        decimalNum = parts[1].substr(0, 4);
        cnIntLast = '点';
    }
    //获取整型部分转换
    if (parseInt(integerNum, 10) == 0) {
        chineseStr = cnNums[0] + cnIntLast;
    }
    if (parseInt(integerNum, 10) > 0) {
        var zeroCount = 0;
        var IntLen = integerNum.length;
        for (var i = 0; i < IntLen; i++) {
            var n = integerNum.substr(i, 1);
            var p = IntLen - i - 1;
            var q = p / 4;
            var m = p % 4;
            if (n == '0') {
                zeroCount++;
            } else {
                if (zeroCount > 0) {
                    chineseStr += cnNums[0];
                }
                //归零
                zeroCount = 0;
                chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
            }
            if (m == 0 && zeroCount < 4) {
                chineseStr += cnIntUnits[q];
            }
        }
        chineseStr += cnIntLast;
    }
    //小数部分
    if (decimalNum != '') {
        let decLen = decimalNum.length;
        for (let i = 0; i < decLen; i++) {
            let n = decimalNum.substr(i, 1);
            chineseStr += cnNums[Number(n)] + cnDecUnits[i];
        }
    }
    if (chineseStr == '') {
        chineseStr += cnNums[0] + cnIntLast;
    } else if (decimalNum == '') {
        chineseStr;
    }
    console.log(chineseStr);
    return chineseStr;
}

这里准备了一些mp3字段,都是一个个独立的语音片段,然后就可以用了

1708936136654.jpg

下面是调用方法

await this.speakEx([
    { type: 'txt', content: '请', ts: 300 },
    { type: 'serialNo', content: this.serialNo, ts: 300 },
    { type: 'txt', content: '取餐', ts: 1000 },
]);