準備
在.net中使用語音辨識和語音合成技術,需要藉助微軟的Speech SDK,如果是要在Web應用程式中使用,則需要Speech Application SDK。其中Speech SDK可以在http://www.microsoft.com/speech/download/old/sapi5.asp下載,其中有兩個檔案Speech SDK 5.1和5.1 Language Pack,前者是開發包,但是其中只包含對英文的支援,後者是中文和日文的語言套件,裝完就能支援中文了。
SDK組成結構
演練
1. 開啟vs2005,建立一個windows application,在設計表單中加入一個label,一個richtextbox(用於輸入要讀的文本),以及一個button。並分別設定的label與button的Text屬性。如
2. 添加必要的引用,項目->添加引用->COM 選擇Microsoft Speech Object Library點確定退出。
3. 雙擊button,為其添加事件。在字碼頁頂端先添加命名空間,代碼如:
using SpeechLib;
4. button的事件處理常式代碼如下。
private void button1_Click(object sender, EventArgs e)
{
SpVoiceClass voice = new SpVoiceClass();
voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(3); //其中3為中文,024為英文
voice.Speak(richTextBox1.Text,SpeechVoiceSpeakFlags.SVSFDefault);
}
5. 按F5運行,在空白地區輸入文字,點朗讀,試試效果吧。
SpVoiceClass詳解
屬性
描述
AlertBoundary
取得或設定停頓分界線。
AllowAudioOutputFormatChangesOnNextSet
設定是否允許聲音自動調整到合適狀態以適應其音訊輸出。
AudioOutput
.取得或設定當前聲音使用的的音訊輸出對象
AudioOutputStream
取得或設定當前聲音使用的的音訊輸出流對象。
EventInterests
取得或設定當前聲音返回的事件類型。
Priority
取得或設定聲音的優先順序。
Rate
取得或設定閱讀的速度。
Status
返回一個ISpeechVoiceStatus 對象用於顯示當前閱讀和事件的狀態
SynchronousSpeakTimeout
取得或設定一個時間間隔,用於標識多久未獲得一個輸出裝置後,一個同步的Speak 和SpeakStream將終止,以毫秒計算。
Voice
取得或設定發音對象。
Volume
取得或設定聲音的大小 。
方法
描述
DisplayUI
是否在控制台中展示詳細設定。
GetAudioOutputs
返回一個可用的音訊輸出標記。
GetVoices
返回一個可用的發音對象。
IsUISupported
決定是否能通過控制棉板的音頻設定來控制。
Pause
暫停朗讀。.
Resume
恢複暫停,繼續播放。
Skip
在當前輸入的文字資料流中向前或向後跳一定距離再播放。
Speak
閱讀一個字串。
SpeakCompleteEvent
得到一個朗讀完畢的時間控制代碼
SpeakStream
朗讀一個文字資料流或一個音效檔。
WaitUntilDone
阻塞進程,直到聲音播放完畢或者逾時。.
.(本文只是這個系列的第一篇,至於其他內容將在後面的篇幅講到,歡迎感興趣的朋友和我交流.)
.net中語音辨識和語音合成(二)語音合成提高篇
在.net中語音辨識和語音合成(一)入門篇中介紹了關於語音合成的一些基礎知識,就是先j建立一個SpVoiceClass類的對象,然後調用對象的GetVoices方法取的一個發音的對象,但是通過設定該方法的參數只能建立中文發音或是英文發音的對象,而對於中英文混合的文本卻沒有辦法。為解決這個問題,可以對字串中的每的字元的ASC碼進行判斷,進而分辨傳入的字串是中文還是英文。以下是判斷的代碼。
1 public bool Analyse(string strSpeak)
2 {
3 int iCbeg = 0 ;
4 int iEbeg = 0 ;
5 bool IsChina = true ;
6 for(int i=0;i<strSpeak.Length;i++)
7 {
8 char chr = strSpeak[i] ;
9 if (IsChina)
10 {
11 if (chr<=122&&chr>=65)
12 {
13 int iLen = i - iCbeg ;
14 string strValue =
15strSpeak.Substring(iCbeg,iLen) ;
16 SpeakChina(strValue) ;
17 iEbeg = i ;
18 IsChina = false ;
19 }
20 }
21 else
22 {
23 if (chr>122||chr<65)
24 {
25 int iLen = i - iEbeg ;
26 string strValue =
27strSpeak.Substring(iEbeg,iLen) ;
28 this.SpeakEnglishi(strValue) ;
29 iCbeg = i ;
30 IsChina = true ;
31 }
32 }
33 }
34 return IsChina;
35}
對於Speak方法的參數,第一個是一個字串類型,第二個是一個SpeechVoiceSpeakFlags類型的枚舉。當將其設定為SVSFDefault時,則第一個就是要讀的文本,若將其設定為SVSFIsFilename時,第一個參數就是所要讀的文本的檔案名稱,而不是要讀的內容。
下面介紹這個類的SpeakStream方法,這個方法有2個參數,第一個是SpeechBaseStream,第二和Speak一樣,是一個SpeechVoiceSpeakFlags類型的枚舉。SpeechBaseStream是一個介面,繼承它的有3個對象,這3個都很相似,先介紹其中之一SpFileStream。SpFileStream有3個比較常用的方法:Read,Seek,Write。其中Read方法可以建立一個*.wav檔案,以下代碼示範了建立檔案的步驟:
SpFileStreamClass fs1 = new SpFileStreamClass();
SpVoiceClass v = new SpVoiceClass();
fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMCreateForWrite, false);
//textBox1.text是要建立的檔案的路徑。
v.AudioOutputStream = fs1;
string[] ss = new string[4] { "this", "is", "a", "demo" };
foreach (string s in ss)
{
v.Speak(s, SpeechVoiceSpeakFlags.SVSFlagsAsync);
}
fs1.Close();
下面的代碼將用於展示Speak與SpeakStream:
SpFileStreamClass fs1 = new SpFileStreamClass();
SpFileStreamClass fs2 = new SpFileStreamClass();
SpVoiceClass v = new SpVoiceClass();
fs1.Open(textBox1.Text, SpeechStreamFileMode.SSFMOpenForRead, false);
fs2.Open(textBox2.Text, SpeechStreamFileMode.SSFMOpenForRead, false);
v.Speak("This is the first sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.SpeakStream(fs1, SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.Speak("This is the second sound file", SpeechVoiceSpeakFlags.SVSFlagsAsync);
v.SpeakStream(fs2, SpeechVoiceSpeakFlags.SVSFlagsAsync);
fs1.Close();
fs2.Close();