最近在作一個語音播報功能,開始是用Speech作的。感受效果還不錯,直接能夠文字轉語音,而後播報出來。可是後面再測試機器上,發現播放的是英語,搜索事後發現須要語音支持。還有可能有些系統整個語音功能均可能被閹割了,因此只能另外想辦法了。測試
另起思路:其實只有數字變化的,其餘語音文字通常是固定的。那麼咱們能夠把0-9單獨錄製爲10個wav文件,而後把金額數字拆分爲char,播放對應的文件不就OK了嗎!說幹就幹:ui
先把須要的文件錄製出來,具體實現代碼以下:spa
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了,思路仍是同樣的,先錄製語音文件,須要增長單位語音文件:十百千萬code
而後把須要轉換的數字Tostring("F2"),這裏不要轉N2,否則會有逗號分隔的,我這裏設計只支持到小於一億元的播報。blog
直接上代碼
ci
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下載get