SpeechLib 應用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM