基于C#實現(xiàn)文字轉(zhuǎn)語音功能
好多年前自己研究的了,今天突然翻出來了,記錄下
簡單說明
在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類的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法
這篇文章介紹了C#中DataSet、DataTable、DataRow數(shù)據(jù)的復(fù)制方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07