一、Text To Speech

來源:互聯網
上載者:User

站在巨人的肩膀上,這裡我將做一下整理,也是對自己所學的總結。

 

本節介紹 文字 to 語音 包含兩部分:
  1、微軟是實現TTS
  2、微軟將聲音儲存為語音檔案
  3、利用Google翻譯實現TTS

 

微軟TTS

微軟的SAPI(Speech Application Programming Interface)提供了強大的Text To Speech介面,而且支援自動化。

通過微軟的SAPI,可以實現TTS(Text to Speech),即“從文本到語音”,是人機對話的一部分,讓機器能夠說話。

使用方式:
  使用COM組件技術實現TTS---注意:Xp需要安裝Microsoft Speech SDK Version 5.1,先安裝SDK再安裝語言套件。

 

下面我們就來用幾句代碼來實現TTS的功能

COM組件技術
添加引用:在COM選項卡裡面,添加Microsoft Speech  object  library的引用
       在代碼區添加 Using SpeechLib
 

 private void btnRead_Click(object sender, EventArgs e)        {            string strContent = txtContent.Text.Trim();            SpeechVoiceSpeakFlags Speak = SpeechVoiceSpeakFlags.SVSFlagsAsync ;            SpVoice voice = new SpVoice();            voice.Speak(strContent, Speak);        }

如此簡單就可以實現了TTS。但是,這種方式只能利用預設的聲音。即:控制台--語音辨識--文字轉換語音(我Win7是Lili Chinese的聲音)
  實現多語音的畫,網上查閱如此即可。但是在我Win7本機上用vs2010米有作用,我覺得應該是沒有安裝其他語音包的緣故,稍後再試

            SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync;            SpVoice voice = new SpVoice();            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3);            //Item(0)單詞男聲Sam            //Item(1)單詞男聲Mike            //Item(2)單詞女聲Mary            //Item(3)中文發音,如果是英文,就依單詞字母一個一個發音            voice.Speak(textBox1.Text, flag);

既然曉得了如何簡單的用,再稍稍去瞭解下其如何?的呢?
1、SpeechVoiceSpeakFlags是一個枚舉類型

    //這裡的枚舉都是什麼意思呢?      public enum SpeechVoiceSpeakFlags    {        SVSFUnusedFlags = -512,        SVSFDefault = 0,        SVSFParseAutodetect = 0,        SVSFlagsAsync = 1,        SVSFPurgeBeforeSpeak = 2,        SVSFIsFilename = 4,        SVSFIsXML = 8,        SVSFIsNotXML = 16,        SVSFPersistXML = 32,        SVSFNLPMask = 64,        SVSFNLPSpeakPunc = 64,        SVSFParseSapi = 128,        SVSFParseSsml = 256,        SVSFParseMask = 384,        SVSFVoiceMask = 511,    }

 

2、SpVoice是一個介面,但是....

namespace SpeechLib{    [CoClass(typeof(SpVoiceClass))]  //CoClass是組件類    [Guid("269316D8-57BD-11D2-9EEE-00C04F797396")]    public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event    {    }}

如果上例子中對SpVoiceClass執行個體化時,就會報錯無法嵌入互操作類型“SpeechLib.SpVoiceClass”。請改用適用的介面。這是為什麼呢?

[CoClass(typeof(SpVoiceClass))]  應該是讓SpVoice和SpVoiceClass建立了某種關係吧,因為上面調用的voice.Voice和voice.GetVoice以及voice.Speak都是SpVoiceClass的成員,暫且先介個樣子理解,學習CoClass之後再做更正吧!!!!
--COM coclass 在 C# 中表示為具有無參數建構函式的類。
--MSDN解釋:http://msdn.microsoft.com/zh-cn/library/aa288455(v=vs.71).aspx

 

SpVoiceClass類

namespace SpeechLib{    [ComSourceInterfaces("SpeechLib._ISpeechVoiceEvents")]    [TypeLibType(2)]    [ClassInterface(0)]    [Guid("96749377-3391-11D2-9EE3-00C04F797396")]    public class SpVoiceClass : ISpeechVoice, SpVoice, _ISpeechVoiceEvents_Event, ISpVoice, ISpPhoneticAlphabetSelection    {        //這裡只列舉了部分的成員  
public SpVoiceClass(); [DispId(5)] public virtual int Rate { get; set; } [DispId(6)] public virtual int Volume { get; set; } [DispId(18)]public virtual void GetRate(out int pRateAdjust);public virtual void GetVoice(out ISpObjectToken ppToken); [DispId(14)] public virtual void Pause(); [DispId(15)] public virtual void Resume();public virtual void SetVolume(ushort usVolume); [DispId(12)] public virtual int Speak(string Text, SpeechVoiceSpeakFlags Flags = SpeechVoiceSpeakFlags.SVSFDefault); public virtual void Speak(string pwcs, uint dwFlags, out uint pulStreamNumber); }}

此處只是列舉出了部分成員,簡單介紹下其中某些成員的作用!
pause/Resume      暫停/繼續
SetVoice/GetVoice    設定聲音
SetRate          設定讀取速度
SetVolume/GetVolume  聲音大小
...
...

-------遺留問題:DispId和ComSourceInterfaces等都是什麼意思?

 

將聲音儲存為語音檔案

            SpeechVoiceSpeakFlags flag = SpeechVoiceSpeakFlags.SVSFlagsAsync;            SpVoice voice = new SpVoice();            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3);            SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;             SpFileStream SpFileStream = new SpFileStream();            SpFileStream.Open(@"C:\test.wav", SpFileMode, false);            voice.AudioOutputStream = SpFileStream;//設定voice的輸出為Stream            voice.Speak(textBox1.Text.Trim(), flag);            voice.WaitUntilDone(Timeout.Infinite);//Using System.Threading;             SpFileStream.Close();

 利用Google翻譯來實現TTS
Google翻譯有朗讀的功能

根據朗讀時瀏覽器的請求,得到其請求URL

中文發音:
http://translate.google.cn/translate_tts?ie=UTF-8&q=%E6%B2%B3%E5%8C%97%E5%A4%A7%E5%AD%A6&tl=zh-CN&total=1&idx=0&textlen=4&prev=input
英文發音:
http://translate.google.cn/translate_tts?ie=UTF-8&q=Hebei%20University&tl=en&total=1&idx=0&textlen=16

分析請求的URL:
ie  編碼方式 
q  要朗讀的關鍵字
&tl  語言
total  ???
idex  ???
textlen  應該關鍵字長度
prev  ???

 

 

 

 

 

還有其他方式和可以實現C#播放聲音
1、利用DirectX
2、MS的COM組件
3、引用SoundPlayer
4、利用Windows Media Player

 詳細見:http://www.soaspx.com/dotnet/csharp/csharp_20090922_407.html

 

補充:今天在C#Coner看見一篇文章(含執行個體),也是有關TTS的,寫得非常好,個人非常喜歡!
     http://www.c-sharpcorner.com/uploadfile/mahesh/programming-speech-in-wpf-speech-synthesis/

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.