//引用組件:Interop.SpeechLib.dll
//導入空間:SpeechLib
//引用組件:Interop.SpeechLib.dll
//導入空間:SpeechLib
//1.SpVoice voice = new SpVoice();
//2.voice.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFDefault); //同步朗讀
//3.voice.Speak(txt.Text, SpeechVoiceSpeakFlags.SVSFlagsAsync); //異步朗讀
//voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0);//設置中文語音
//voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(1);設置英文語音
//錯誤修改:VS2010中 錯誤無法嵌入互操作類型“SpeechLib.SpVoiceClass”。請改用適用的接口
//解決方案:選中項目中引入的dll,鼠標右鍵,選擇屬性,把“嵌入互操作類型”設置為False。
//異常來自 HRESULT:0x8004503異常信息。一般是由Windows Audio服務沒有開啟造成的,尤其是win2003默認不開Windows Audio服務。
//1)請確認Windows Audio(AudioSrv)服務啟動。
//進入cmd 輸入net start AudioSrv
//2)聲卡驅動安裝成功。"
功能強大之處在於TTS能識別XML標記,通過給文本加上XML標記,我們讓TTS朗讀出更加符合語言閱讀習慣的句子。例如: <volume level="60"></volume> 用於設置文本朗讀的音量; <rate absspeed="1"/>、<rate speed="5"/> 分別用於設置文本朗讀的絕對速度和相對速度; <pitch absmiddle="2"/>、<pitch middle="5"/> 分別用於設置文本朗讀的絕對語調和相對語調; <emph></emph> 在他們之間的句子被視為強調; <spell></spell> 可以將單詞逐個字母的拼寫出來; <silence msec="500"/> 表示停止發聲,並保持500微秒; <context id="date_mdy">02/03/07</context> 可以按要求朗讀出日期 <voice required="Language=409"></voice> 用於設置朗讀所用的語言,其中409表示使用英語,804表示使用漢語,而411表示日語。
實例:
protected void speak_Click(object sender, EventArgs e) { if (!string.IsNullOrWhiteSpace(txt.Text)) { SpVoice voice = new SpVoice(); StreamReader objReader = new StreamReader(HttpContext.Current.Server.MapPath("~/upload/test.xml")); string sLine =string.Empty ; string sPreview = string.Empty; while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null) { // 這里需要添加Environment.NewLine表示換行 sPreview += sLine + Environment.NewLine; } } SpeakXml(sPreview); // 關閉文件讀取器 objReader.Close(); } }
/// <summary> /// 讀出Xml文件內容 /// </summary> /// <param name="xml">Xml文件內容</param> public void SpeakXml(string xml) { new SpVoice().Speak(xml, SpeechVoiceSpeakFlags.SVSFIsXML | SpeechVoiceSpeakFlags.SVSFlagsAsync); } /// <summary> /// 保存音頻到文件 /// </summary> /// <param name="xml">要讀的Xml格式的內容</param> /// <param name="fileName">要保存的文件名</param> public void Save(string xml, string fileName) { SpVoice voice = new SpVoice(); SpFileStream stream = new SpFileStream(); stream.Open(HttpContext.Current.Server.MapPath(fileName), SpeechStreamFileMode.SSFMCreateForWrite, false); voice.AudioOutputStream = stream; voice.Speak(xml, SpeechVoiceSpeakFlags.SVSFlagsAsync | SpeechVoiceSpeakFlags.SVSFIsXML); voice.WaitUntilDone(3); stream.Close(); } // <summary> /// 設置中文語音 /// </summary> public void SetChinaVoice() { SpVoice voice = new SpVoice(); voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0); } /// <summary> /// 設置英文語音 /// </summary> public void SetEnglishVoice() { SpVoice voice = new SpVoice(); voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(1); }
界面的實現
在打開文件時,可以選擇打開文本文件(*.Txt)和XML文件(*.Xml),如果打開的是XML文件,將不對內容作任何修改,並且也不允許調節音量、語速、語調,因為這些都應該在XML文件中寫好;如果打開的是文本文件,則在朗讀前,會調用AddXmlLangTag方法給文本加上語言標記,調用AddXmlPitchTag方法給文本加上語調標記,同時也允許調節音量、語速、語調。
總結
通過為普通文本內容設置語音XML標記,並調用SpVoice接口的Speak方法,可以實現中英文文本的混合朗讀。如果要使朗讀的效果更佳,就必須手工為每一個句子設置相應的XML標記,這樣可使朗讀更接近人性化。