欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C#實現(xiàn)文字轉(zhuǎn)語音功能

 更新時間:2025年02月07日 11:03:07   作者:Strawberry_ahh  
這篇文章將在C#中集成一個語音對象SpeechSynthesizer,可以根據(jù)填入的文字內(nèi)容自動解析成語音并使用系統(tǒng)揚聲器進行語音播報,感興趣的小伙伴可以了解下

好多年前自己研究的了,今天突然翻出來了,記錄下

簡單說明

在C#中,集成了一個語音對象SpeechSynthesizer。

SpeechSynthesizer可以根據(jù)填入的文字內(nèi)容自動解析成語音并使用系統(tǒng)揚聲器進行語音播報。

程序說明

支持手動輸入文字,轉(zhuǎn)換為語音。

可以調(diào)整語速。

對kv、sf6、.等關(guān)鍵詞進行轉(zhuǎn)義(kv-千伏;sf6-六氟化硫;.-點)

支持生成語音文件(這個沒有對關(guān)鍵字進行轉(zhuǎn)義)

效果圖

語音試聽實現(xiàn)

        /// <summary>
        /// 試聽
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnListen_Click(object sender, EventArgs e)
        {
            string text = textBox1.Text;
            rate = this.cbxRate.SelectedIndex;

            if (text.Trim().Length == 0)
            {
                MessageBox.Show("不能閱讀空內(nèi)容!", "錯誤提示");
                return;
            }

            if (btnListen.Text == "語音試聽")
            {
                speech = new SpeechSynthesizer();
                new Thread(Speak).Start();
                btnListen.Text = "停止試聽";
            }
            else if (btnListen.Text == "停止試聽")
            {
                speech.SpeakAsyncCancelAll();//停止閱讀
                btnListen.Text = "語音試聽";
            }
        }

        private void Speak()
        {
            PromptBuilder builder = GetBuiltPrompt(this.textBox1.Text.ToString().Trim());
            speech.Rate = rate;
            speech.SelectVoice("Microsoft Huihui Desktop");//設(shè)置播音員(中文)
            speech.Volume = value;
            speech.SpeakAsync(builder);//語音閱讀方法
            speech.SpeakCompleted += speech_SpeakCompleted;//綁定事件
        }
        
        private PromptBuilder GetBuiltPrompt(string keywords)
        {
            //from http://msdn.microsoft.com/msdnmag/issues/06/01/speechinWindowsVista/ 
            //This prompt is quite complicated
            //So I'm going to build it first, and then render it.
            PromptBuilder myPrompt = new PromptBuilder();

            //Start the main speaking style
            PromptStyle mainStyle = new PromptStyle();
            mainStyle.Rate = PromptRate.NotSet;
            mainStyle.Volume = PromptVolume.Medium;
            // mainStyle.Emphasis=PromptEmphasis.Reduced;
            myPrompt.StartStyle(mainStyle);
            convert(myPrompt, keywords);
            myPrompt.EndStyle();
            return myPrompt;
        }

 		/// <summary>
        /// 轉(zhuǎn)義關(guān)鍵字
        /// </summary>
        private void convert(PromptBuilder myPrompt, string keywords)
        {
            //判斷是否存在要轉(zhuǎn)換的關(guān)鍵字
            Dictionary<int, string> convertCharacter = new Dictionary<int, string>();
            var kv_Index = keywords.IndexOf("kV");
            var sf6_Index = keywords.IndexOf("SF6");
            var point_index = keywords.IndexOf(".");
            if (kv_Index > -1)
            {
                convertCharacter.Add(kv_Index, "kv");
            }
            if (sf6_Index > -1)
            {
                convertCharacter.Add(sf6_Index, "sf6");
            }
            if (point_index > -1)
            {
                convertCharacter.Add(point_index, ".");
            }
            convertArray(convertCharacter, myPrompt, keywords);
        }
        
		/// <summary>
        /// 轉(zhuǎn)義關(guān)鍵字
        /// </summary>
        private void convertArray(Dictionary<int, string> convertCharacter, PromptBuilder myPrompt, string deviceName)
        { 
            string r = @"[0-9]+";
            Regex reg = new Regex(r, RegexOptions.IgnoreCase | RegexOptions.Singleline);//2秒后超時
            MatchCollection mc = reg.Matches(deviceName);//設(shè)定要查找的字符串 

            //按關(guān)鍵字升序排列
            convertCharacter = convertCharacter.OrderBy(t => t.Key).ToDictionary(p => p.Key, o => o.Value);
            int hasLen = 0;//記錄已經(jīng)截取的長度
            int splitNum = convertCharacter.Count;//要拆分的段數(shù)

            //針對有需要轉(zhuǎn)換的地方做特殊處理
            if (splitNum > 0)
            {
                for (var i = 0; i < splitNum; i++)
                {
                    var startIndex = convertCharacter.ElementAt(i).Key;//關(guān)鍵字開始的索引
                    var keyValue = convertCharacter.ElementAt(i).Value.ToLower();//關(guān)鍵字
                    var keyLen = keyValue.Length;//關(guān)鍵字對應(yīng)的長度 

                    //先把關(guān)鍵字前面的追加到標題
                    myPrompt.AppendText(deviceName.Substring(hasLen, startIndex - hasLen)); 
                    hasLen = startIndex + keyLen;//留做截取不是關(guān)鍵字的長度 
                    //判斷關(guān)鍵字的類型,確定轉(zhuǎn)換方式
                    if (keyValue == "kv")
                    {
                        myPrompt.AppendSsmlMarkup("<say-as interpret-as = \"kV\">千伏</say-as>");
                    }
                    else if (keyValue == "sf6")
                    {
                        myPrompt.AppendTextWithAlias("SF6", "六氟化硫");
                    }
                    else if (keyValue == "-")
                    {
                        myPrompt.AppendTextWithHint("-", SayAs.NumberCardinal);
                    }
                    else if (keyValue == ".")
                    {
                        myPrompt.AppendTextWithAlias(".", "點");
                    }  
                    //如果循環(huán)到最后一個關(guān)鍵字,再把最后一個關(guān)鍵字后邊的數(shù)追加上
                    if (i == splitNum - 1)
                    {
                        myPrompt.AppendText(deviceName.Substring(hasLen));
                    }
                } 
            }
            else
            {
                myPrompt.AppendText(deviceName);
            }
        }

  		/// <summary>
        /// 語音閱讀完成觸發(fā)此事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void speech_SpeakCompleted(object sender, SpeakCompletedEventArgs e)
        {
            //改變按鈕文本值
            ChangeBtnText changeBtnText = ChangeText;
            this.btnListen.BeginInvoke(changeBtnText);
        }
        
        /// <summary>
        /// 委托方法,改變按鈕值
        /// </summary>
        public void ChangeText()
        {
            btnListen.Text = "語音試聽";
        }

以上就是基于C#實現(xiàn)文字轉(zhuǎn)語音功能的詳細內(nèi)容,更多關(guān)于C#文字轉(zhuǎn)語音的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#使用List類實現(xiàn)動態(tài)變長數(shù)組的方法

    C#使用List類實現(xiàn)動態(tài)變長數(shù)組的方法

    這篇文章主要介紹了C#使用List類實現(xiàn)動態(tài)變長數(shù)組的方法,涉及C#中List類的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04
  • C#調(diào)用js庫的方法示例代碼

    C#調(diào)用js庫的方法示例代碼

    這篇文章主要介紹了C#調(diào)用js庫的方法,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • C#仿QQ實現(xiàn)簡單的截圖功能

    C#仿QQ實現(xiàn)簡單的截圖功能

    這篇文章主要為大家詳細介紹了如何利用C#語言模擬QQ實現(xiàn)屏幕選擇區(qū)域截圖功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-08-08
  • C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法

    C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法

    這篇文章介紹了C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#實現(xiàn)日期時間的格式化輸出的示例詳解

    C#實現(xiàn)日期時間的格式化輸出的示例詳解

    這篇文章主要為大家詳細介紹了C#實現(xiàn)日期時間的格式化輸出的相關(guān)資料,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以參考一下
    2023-03-03
  • C# 基于NPOI操作Excel

    C# 基于NPOI操作Excel

    最近遇到一個數(shù)據(jù)導(dǎo)入的需求,語言是.net framework 4.7的C#。但是,這次主要探討NPOI的體驗,原則就是向前兼容。所以采用.xls的支持。下面就來看看實現(xiàn)步驟
    2021-06-06
  • c#窗體傳值用法實例詳解

    c#窗體傳值用法實例詳解

    這篇文章主要介紹了c#窗體傳值用法,以實例形式較為詳細的分析了C#窗體傳值的各種常用技巧,需要的朋友可以參考下
    2015-06-06
  • C#完成word文檔打印的方法

    C#完成word文檔打印的方法

    在日常工作中,我們可能常常需要打印各種文件資料,比如word文檔。對于編程員,應(yīng)用程序中文檔的打印是一項非常重要的功能,也一直是一個非常復(fù)雜的工。這篇文章主要介紹了C#完成word文檔打印的方法,需要的朋友可以參考下
    2016-10-10
  • C#中AS和IS關(guān)鍵字的用法

    C#中AS和IS關(guān)鍵字的用法

    這篇文章主要介紹了C#中AS和IS關(guān)鍵字的用法的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • C#中的串口通信SerialPort詳解

    C#中的串口通信SerialPort詳解

    今天這篇文章帶大家學(xué)習下C#中的串口通訊。在日常的開發(fā)工作中,如果工作內(nèi)容是CS方向的同學(xué)應(yīng)該很容易接觸到串口通訊方面的業(yè)務(wù)需求。那么也就很容易想到C#中SerialPort類,它就是專門來處理串口通訊相關(guān)的
    2022-01-01

最新評論