站在巨人的肩膀上,這裡我將做一下整理,也是對自己所學的總結。
本節介紹 文字 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/