金額數字語音播報


最近在做一個語音播報功能,開始是用Speech做的。感覺效果還不錯,直接可以文字轉語音,然后播報出來。但是后面再測試機器上,發現播放的是英語,搜索過后發現需要語音支持。還有可能有些系統整個語音功能都可能被閹割了,所以只能另外想辦法了。

另起思路:其實只有數字變化的,其他語音文字一般是固定的。那么我們可以把0-9單獨錄制為10個wav文件,然后把金額數字拆分為char,播放對應的文件不就OK了嗎!說干就干:

 先把需要的文件錄制出來,具體實現代碼如下:

Task.Run(() =>
            {
                decimal payAmt = 123.56M;
                string payString = payAmt.ToString("F2");
                //播放固定的前綴語音“龍支付收款”
                using (SoundPlayer simpleSound = new SoundPlayer($"{Application.StartupPath}\\auido\\ccb.wav"))
                {
                    simpleSound.Play();
                    //這里需要等待,具體時間為語音文件的長度
                    System.Threading.Thread.Sleep(1450);
                    foreach (var item in payString.ToArray())
                    {
                        //播放具體數字
                        simpleSound.SoundLocation = $"{Application.StartupPath}\\auido\\{item}.wav";
                        simpleSound.Play();
                        System.Threading.Thread.Sleep(400);
                    }
                    //播放元
                    simpleSound.SoundLocation = $"{Application.StartupPath}\\auido\\yuan.wav";
                    simpleSound.Play();
                }
            });

看起來功能已經實現了,只是聽起來感覺有點遲鈍的樣紙,但是先這樣吧。提交給測試了,后面測試過來說這個聲音怎么沒有單位啊,能不能加上單位呢。嗯!!!可以。

於是開始實現數字播報加單位,先去找了段數字轉大字文字的功能代碼參考了下,其實邏輯差不多,然后稍微改造下就OK了,思路還是一樣的,先錄制語音文件,需要增加單位語音文件:十百千萬

 然后把需要轉換的數字Tostring("F2"),這里不要轉N2,不然會有逗號分隔的,我這里設計只支持到小於一億元的播報。

直接上代碼

public void PayAuido(decimal payMoney)
        { 
            if (payMoney >= 100000000 || payMoney == 0)
            {
                return;
            }
            Task.Run(() =>
            {
                List<string> payAuidoUrls = new List<string>();
                string payString = payMoney.ToString("F2");
                //如果小於11位,則補零
                if (payString.Length < 11)
                {
                    payString = payString.PadLeft(11, '0');
                }
                string payWan = payString.Substring(0, 4);//取得'萬'單元
                string payYuan = payString.Substring(4, 4);//取得'元'單元
                string payNum = payString.Substring(9, 2);//取得小數部分

                //處理萬
                List<string> payAuidoUrlsWan = Convert(payWan);
                if (payAuidoUrlsWan.Count > 0)
                { 
                    payAuidoUrlsWan.Add($"{Application.StartupPath}\\auido\\wan.wav");
                }

                //處理元
                List<string> payAuidoUrlsYuan = Convert(payYuan);

                //元第一個字符是否為‘零’
                if (payAuidoUrlsWan.Count > 0 && payAuidoUrlsYuan.Count > 0 && payString[4] == '0')
                {
                    payAuidoUrlsWan.Add($"{Application.StartupPath}\\auido\\0.wav");
                }
                payAuidoUrls.AddRange(payAuidoUrlsWan);
                payAuidoUrls.AddRange(payAuidoUrlsYuan);

                //處理小數位
                if (payNum != "00")
                {
                    //如果只有小數,則添加‘零’
                    if (payAuidoUrls.Count == 0)
                    {
                        payAuidoUrls.Add($"{Application.StartupPath}\\auido\\0.wav");
                    }
                    payAuidoUrls.Add($"{Application.StartupPath}\\auido\\..wav");
                    payAuidoUrls.Add($"{Application.StartupPath}\\auido\\{payNum[0]}.wav");
                    //如果最后一位為‘零’,則不需要播報
                    if (payNum[1] != '0')
                    {
                        payAuidoUrls.Add($"{Application.StartupPath}\\auido\\{payNum[1]}.wav");
                    }
                }

                //添加元
                payAuidoUrls.Add($"{Application.StartupPath}\\auido\\yuan.wav");
                //播放“龍支付收款”
                using (SoundPlayer simpleSound = new SoundPlayer($"{Application.StartupPath}\\auido\\ccb.wav"))
                { 
                    simpleSound.Play();
                    System.Threading.Thread.Sleep(1450); 
                    foreach (string payAuidoUrl in payAuidoUrls)
                    {
                        //播放每個數字
                        simpleSound.SoundLocation = payAuidoUrl; 
                        simpleSound.Play();
                        System.Threading.Thread.Sleep(400); 
                    }
                }
            });
        }

        /// <summary>
        /// 每四位數轉換一次
        /// </summary>
        /// <param name="payValue">當前轉換的金額</param>
        /// <returns></returns>
        public List<string> Convert(string payValue)
        {
            List<string> payAuidos = new List<string>();
            //如果為四個零,則不需要播報
            if (payValue == "0000")
            {
                return payAuidos;
            }

            char tmp0 = payValue[0];
            char tmp1 = payValue[1];
            char tmp2 = payValue[2];
            char tmp3 = payValue[3];
            //千位
            if (tmp0 != '0')
            {
                payAuidos.Add($"{Application.StartupPath}\\auido\\{tmp0}.wav");
                payAuidos.Add($"{Application.StartupPath}\\auido\\qian.wav");
            }
            else
            {
                payAuidos.Add($"{Application.StartupPath}\\auido\\0.wav");
            }
            //百位
            if (tmp1 != '0')
            {
                payAuidos.Add($"{Application.StartupPath}\\auido\\{tmp1}.wav");
                payAuidos.Add($"{Application.StartupPath}\\auido\\bai.wav");
            }
            else
            {
                //只添加一個零
                if (tmp0 != '0')
                {
                    payAuidos.Add($"{Application.StartupPath}\\auido\\0.wav");
                }
            }
            //十位
            if (tmp2 != '0')
            {
                payAuidos.Add($"{Application.StartupPath}\\auido\\{tmp2}.wav");
                payAuidos.Add($"{Application.StartupPath}\\auido\\shi.wav");
            }
            else
            {
                //只添加一個零
                if (tmp1 != '0')
                {
                    payAuidos.Add($"{Application.StartupPath}\\auido\\0.wav");
                }
            }
            //個位
            if (tmp3 != '0')
            {
                payAuidos.Add($"{Application.StartupPath}\\auido\\{tmp3}.wav");
            }
            //如果第一個音頻為零,則去掉
            if (payAuidos[0].Contains("0.wav"))
            {
                payAuidos.RemoveAt(0);
            }
            //如果最后一個音頻為零,則去掉
            if (payAuidos[payAuidos.Count - 1].Contains("0.wav"))
            {
                payAuidos.RemoveAt(payAuidos.Count - 1);
            }
            return payAuidos; 
        }

輸入數字,既可轉換為語音播報,其實思路很簡單,就是把每個數字及單位對應的語音文件連續播放出來即可。DEMO下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM