解決C#中結賬時金額數字語音播報

先把需要的文件錄製出來, 可以去百度上錄製一下
可以使用百度語音合成: https://developer.baidu.com/vcast
在這裏插入圖片描述

然後把需要轉換的數字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> payAuidoUrlsFK = Converts(payWan);
        if (this.lblPay.Text == "還應支付")
        {
            payAuidoUrlsFK.Add($"{Application.StartupPath}\\auido\\qf.wav");
        }
        else
        {
            payAuidoUrlsFK.Add($"{Application.StartupPath}\\auido\\zl.wav");
        }
        //處理萬
        List<string> payAuidoUrlsWan = Converts(payWan);
        if (payAuidoUrlsWan.Count > 0)
        {
            payAuidoUrlsWan.Add($"{Application.StartupPath}\\auido\\wan.wav");
        }
        //處理元
        List<string> payAuidoUrlsYuan = Converts(payYuan);

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

        payAuidoUrls.AddRange(payAuidoUrlsFK);
        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\\yuan.wav");
            payAuidoUrls.Add($"{Application.StartupPath}\\auido\\{payNum[0]}.wav");

            //如果最後一位爲‘零’,則不需要播報
            payAuidoUrls.Add($"{Application.StartupPath}\\auido\\jiao.wav");
            if (payNum[1] != '0')
            {
                payAuidoUrls.Add($"{Application.StartupPath}\\auido\\{payNum[1]}.wav");
            }
        }
        else
        {
            payAuidoUrls.Add($"{Application.StartupPath}\\auido\\yuan.wav");
        }

        //播放“龍支付收款”
        using (SoundPlayer simpleSound = new SoundPlayer($"{Application.StartupPath}\\auido\\tc.wav"))
        {
            simpleSound.Play();
            System.Threading.Thread.Sleep(1250);
            int counts = 0;
            foreach (string payAuidoUrl in payAuidoUrls)
            {
                if(counts==0)
                {
                    //播放每個數字
                    simpleSound.SoundLocation = payAuidoUrl;
                    simpleSound.Play();
                    System.Threading.Thread.Sleep(620);
                    counts++;
                }
                else
                {
                    //播放每個數字
                    simpleSound.SoundLocation = payAuidoUrl;
                    simpleSound.Play();
                    System.Threading.Thread.Sleep(400);
                }
            }
        }
    });
}

/// <summary>
/// 每四位數轉換一次
/// </summary>
/// <param name="payValue">當前轉換的金額</param>
/// <returns></returns>
public List<string> Converts(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;
}

需要調用時,直接調用傳值即可

	//語音播報
	PayAuido(Convert.ToDecimal(123.4));

希望可以幫助到大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章