//引用組件: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標記,這樣可使朗讀更接近人性化。
