在ASP.NET程序中實現語音合成
你可能已經注意到,如今語音合成越來越普遍。成百上午的電動玩具和小器具都能夠以機器的聲音向它們的主人講話。不管它是一個講話的嬰兒玩偶,一個會談話的計步器或是一新的自動電話系統,現在幾乎每天都會有一種使用文本來發音的產品發行。
文本-到-語音(TTS)技術,也稱為語音合成,是把輸入的文本轉換成音頻語音的過程。這種方式會優于預先錄制好的文本-它必須對要說的內容提前了解。而使用TTS,卻有可能加入動態的信息,該動態的信息可以來自于一個數據庫;或是用戶不斷重復的話。
一、 TTS試驗
如果你看到或聽說過實際的TTS,那么你可能想下載一個免費版本的ReadPlease 2003。該產品能夠讀取Windows剪貼板中的文本。要使用它,你只需要簡單地把一些文本粘貼到ReadPlease編輯器中(見圖1)-并且假定你的PC揚聲器打開了,那么你會聽到文本的播放。當前,該產品僅能工作在所有的Windows桌面OS版本中,但是他們還計劃發行針對Mac,Unix,Palm和Windows CE系統的版本。
ReadPlease令人感興趣的地方在于,你可以使用ReadPlease編輯器來試驗你的TTS參數選擇。例如,你可以通過上下移動如圖1所示的Speed滑動塊控件來調整發音速度。你還可以通過點擊在小臉圖標下方的箭頭按鈕來改變所用的語音。
你需要什么呢?Visual Studio.NET 2003,微軟語音應用程序SDK 1.1
點擊"Tools"菜單,然后選擇"Options"允許你進一步用該TTS編輯器進行試驗,例如,你可以調整在段落之間的語音引擎的暫停時間長度。升級到ReadPlease Plus版本將可以使你存取另外的一個發音編輯器選項,它讓你指定怎樣讀一個特別的詞。ReadPlease Plus還包括一個你可以停靠在你的Windows桌面頂部的任務條。因此,你可以快速地從任何基于文件的應用程序拖動文本到任務欄上并讓它讀給你聽。
缺省狀態下,該ReadPlease應用程序使用內置的微軟語音(Mark,Mike,Sam或Marilyn)。但是,你可以選擇性地購買更高質量的AT&T Natural Voices,例如在AT&T Natural Voices Starter Pack中提供的語音。該Starter包包括8K版本的"Mike"和"Crystal",它們二者聽起來都優于缺省的微軟聲音。
作者注: 術語8K意味著,該抽樣頻率用于創建發生在每秒8000位的WAV文件。另外一種格式是16k,它可以產生一種更清晰和更為自然的聽覺效果。基本上,樣本率越高,聲音質量好越。
二、 微軟語音應用程序開發包SDK 1.1
在2004年,微軟發行了 Microsoft Speech Server,還有一個免費的SDK允許你開發基于Web的運行于Speech Server上的語音程序。可以使用SDK來構建電話或只發聲的應用程序-其中的計算機對用戶的交互是使用電話來實現的。同時你還可以構建多模態應用程序,其中由用戶選擇使用語音還是傳統型Web控件作為輸入。
微軟TTS引擎通過把單詞拆分成音素來合成文本。音素是人類語言的基本單位。它們代表一組"音",正是由它們構成單詞的聲音。然后由該TTS引擎分析提取的音素并且把它們轉換成符號用來生成數字音頻語音。
你可以使用隨同本文的可下載的示例應用程序(ExploringTextToSpeech.csproj)來試驗微軟TTS引擎可配置的方面。該多模態應用程序包含一個Web頁面(見圖2),你可以在其中輸入一些文本。然后,可以點擊一個按鈕來以下面方式聽取文本。
作者注:在要被播放的文本無法提前知道的情況下,使用一TTS引擎是不可避免的;然而,你可以由錄制音頻來得到更好的音質。當音頻質量是關鍵的時,你可以使用微軟語音應用程序軟件開發工具箱(SASDK)來錄制音頻。例如,你可能想使用錄制的音頻來提示用戶信息。被記錄的音頻可以被分解成一系列的提示,它們在運行時刻再被連接起來。
· Speak Text Normally-提供一種測試基準
· Say as an Acronym-文本"ASP"被發作"A.S.P."
· Say as Name-Mr.John Doe被發作"Mister John Doe"
· Say As Date-在這種情況中,日期格式化為:月,日,年
· Say as Web Address-在這種情況中,文本格式化為一個統一資源標識符(URI)
· Say as Digits-作為文本輸入的數字被發作一系列的位
· High Pitch/Slow Rate-文本以高音調慢速發出。
· Rate Fast/Volume Loud-文本以快速高音發出。
· Low Pitch/Volume Soft-文本以低音調適中音量發出。
該多模態應用程序使用一提示控件來指定將被播放給用戶的音頻。該提示控件包含InlineContent屬性——它可以包含一個或者是Content型或者是Value型的基本Speech控件。該Content控件指定一特定的包含存儲的音頻記錄的提示文件。該Value控件指定一個HTML Web頁面中的元素。該示例應用程序使用一Value控件——它參考一個名為txtText的輸入元素(在圖2中的"Type some text here:"域)。下面是描述了用于一個提示的標注的HTML:
三、 語音合成標注語言
該TTS引擎在怎樣播放由屬性InlineContent參考的文本時作出某些缺省的假設,但是開發者能通過使用語音合成標注語言(SSML)元素來控制該TTS引擎生成音頻的方式。根據W3C協會的推薦,SSML是一基于XML的標注語言。表1列舉出由SASDK所支持的SSML元素。
表1.被支持的SSML元素:表中列出由SASDK所支持的SSML元素并且用于控制TTS引擎生成文本的方式。
該示例應用程序說明了say-as和prosodySSML元素的使用。在該Default.aspx頁面上的每個按鈕都相應于一個提示控件。這些提示控件在InlineContent元素中包括一ssml:say-as或一個ssml:prosody元素。下面示例顯示了針對這些元素之一的HTML標注:
當用戶點擊這些按鈕之一,它執行如下所示的JavaScript:
在上面的示例中,名為prmSayAsAcronym的提示包括了ssml:say-as元素,它指定任何包含在txtText輸入元素中的文本都應該被以每個單詞的第一個字母方式發出。因此,如果你輸入"ASP"到文本元素中并且點擊"Say As Acronym",那么該TTS引擎將讀每個字母。
為了用該示例應用程序進行試驗,你可以輸入一些文本片斷,然后點擊每一個按鈕來看一下該TTS引擎是怎樣解釋文本的。我主張你改變元素值并且用每一個控件生成的方式進行試驗。SASDK提供給開發者關于該TTS引擎怎樣生成文本的良好控件,因此試驗可能會導致出現一種更為自然的基于語音的應用程序。
文本-到-語音(TTS)技術,也稱為語音合成,是把輸入的文本轉換成音頻語音的過程。這種方式會優于預先錄制好的文本-它必須對要說的內容提前了解。而使用TTS,卻有可能加入動態的信息,該動態的信息可以來自于一個數據庫;或是用戶不斷重復的話。
一、 TTS試驗
如果你看到或聽說過實際的TTS,那么你可能想下載一個免費版本的ReadPlease 2003。該產品能夠讀取Windows剪貼板中的文本。要使用它,你只需要簡單地把一些文本粘貼到ReadPlease編輯器中(見圖1)-并且假定你的PC揚聲器打開了,那么你會聽到文本的播放。當前,該產品僅能工作在所有的Windows桌面OS版本中,但是他們還計劃發行針對Mac,Unix,Palm和Windows CE系統的版本。
ReadPlease令人感興趣的地方在于,你可以使用ReadPlease編輯器來試驗你的TTS參數選擇。例如,你可以通過上下移動如圖1所示的Speed滑動塊控件來調整發音速度。你還可以通過點擊在小臉圖標下方的箭頭按鈕來改變所用的語音。
![]() 圖1.ReadPlease 2003應用程序:這個Windows應用程序可能讀任何從剪貼板中粘貼到編輯字段中的文本。 |
你需要什么呢?Visual Studio.NET 2003,微軟語音應用程序SDK 1.1
點擊"Tools"菜單,然后選擇"Options"允許你進一步用該TTS編輯器進行試驗,例如,你可以調整在段落之間的語音引擎的暫停時間長度。升級到ReadPlease Plus版本將可以使你存取另外的一個發音編輯器選項,它讓你指定怎樣讀一個特別的詞。ReadPlease Plus還包括一個你可以停靠在你的Windows桌面頂部的任務條。因此,你可以快速地從任何基于文件的應用程序拖動文本到任務欄上并讓它讀給你聽。
缺省狀態下,該ReadPlease應用程序使用內置的微軟語音(Mark,Mike,Sam或Marilyn)。但是,你可以選擇性地購買更高質量的AT&T Natural Voices,例如在AT&T Natural Voices Starter Pack中提供的語音。該Starter包包括8K版本的"Mike"和"Crystal",它們二者聽起來都優于缺省的微軟聲音。
作者注: 術語8K意味著,該抽樣頻率用于創建發生在每秒8000位的WAV文件。另外一種格式是16k,它可以產生一種更清晰和更為自然的聽覺效果。基本上,樣本率越高,聲音質量好越。
二、 微軟語音應用程序開發包SDK 1.1
在2004年,微軟發行了 Microsoft Speech Server,還有一個免費的SDK允許你開發基于Web的運行于Speech Server上的語音程序。可以使用SDK來構建電話或只發聲的應用程序-其中的計算機對用戶的交互是使用電話來實現的。同時你還可以構建多模態應用程序,其中由用戶選擇使用語音還是傳統型Web控件作為輸入。
微軟TTS引擎通過把單詞拆分成音素來合成文本。音素是人類語言的基本單位。它們代表一組"音",正是由它們構成單詞的聲音。然后由該TTS引擎分析提取的音素并且把它們轉換成符號用來生成數字音頻語音。
你可以使用隨同本文的可下載的示例應用程序(ExploringTextToSpeech.csproj)來試驗微軟TTS引擎可配置的方面。該多模態應用程序包含一個Web頁面(見圖2),你可以在其中輸入一些文本。然后,可以點擊一個按鈕來以下面方式聽取文本。
作者注:在要被播放的文本無法提前知道的情況下,使用一TTS引擎是不可避免的;然而,你可以由錄制音頻來得到更好的音質。當音頻質量是關鍵的時,你可以使用微軟語音應用程序軟件開發工具箱(SASDK)來錄制音頻。例如,你可能想使用錄制的音頻來提示用戶信息。被記錄的音頻可以被分解成一系列的提示,它們在運行時刻再被連接起來。
· Speak Text Normally-提供一種測試基準
· Say as an Acronym-文本"ASP"被發作"A.S.P."
· Say as Name-Mr.John Doe被發作"Mister John Doe"
· Say As Date-在這種情況中,日期格式化為:月,日,年
· Say as Web Address-在這種情況中,文本格式化為一個統一資源標識符(URI)
· Say as Digits-作為文本輸入的數字被發作一系列的位
· High Pitch/Slow Rate-文本以高音調慢速發出。
· Rate Fast/Volume Loud-文本以快速高音發出。
· Low Pitch/Volume Soft-文本以低音調適中音量發出。
![]() 圖2.示例應用程序-你可以使用這個程序來聽一下以多種方式說出的文本。 |
該多模態應用程序使用一提示控件來指定將被播放給用戶的音頻。該提示控件包含InlineContent屬性——它可以包含一個或者是Content型或者是Value型的基本Speech控件。該Content控件指定一特定的包含存儲的音頻記錄的提示文件。該Value控件指定一個HTML Web頁面中的元素。該示例應用程序使用一Value控件——它參考一個名為txtText的輸入元素(在圖2中的"Type some text here:"域)。下面是描述了用于一個提示的標注的HTML:
<speech:prompt id="prmText" runat="server"> <InlineContent> <speech:Value runat="server" TargetElement="txtText" TargetAttribute="value"> </speech:Value> </InlineContent> </speech:prompt> |
三、 語音合成標注語言
該TTS引擎在怎樣播放由屬性InlineContent參考的文本時作出某些缺省的假設,但是開發者能通過使用語音合成標注語言(SSML)元素來控制該TTS引擎生成音頻的方式。根據W3C協會的推薦,SSML是一基于XML的標注語言。表1列舉出由SASDK所支持的SSML元素。
表1.被支持的SSML元素:表中列出由SASDK所支持的SSML元素并且用于控制TTS引擎生成文本的方式。
SSML元素 | 描述 |
ssml:paragraph/ssml:sentence | 用于把文本分解成語句或段落。 |
ssml:say-as | 用于指定播放文本的方式。它能夠接受若干不同的屬性來指定文本的類型。 |
ssml:phoneme | 用于控制一個單詞的發音方式。 |
ssml:sub | 用于指定一個替代單詞或詞組來代替指定的文本。 |
ssml:emphasis | 用于提高放到一單詞或詞組中的重音。 |
ssml:break | 用于在文本的某些單詞間插入一些暫停。 |
ssml:prosody | 用于控制音調,速率和音量。 |
ssml:audio | 用于插入被錄制的音頻文件。 |
ssml:mark | 用于在文本的某個位置插入一個標記。然后可以使用這個標記來表示一事件或觸發一個行為。 |
該示例應用程序說明了say-as和prosodySSML元素的使用。在該Default.aspx頁面上的每個按鈕都相應于一個提示控件。這些提示控件在InlineContent元素中包括一ssml:say-as或一個ssml:prosody元素。下面示例顯示了針對這些元素之一的HTML標注:
<speech:prompt id="prmSayAsAcronym" runat="server"> <InlineContent> <ssml:say-as type="acronym"> <speech:Value runat="server" TargetElement="txtText" TargetAttribute="value"></speech:Value> </ssml:say-as> </InlineContent> </speech:prompt> |
當用戶點擊這些按鈕之一,它執行如下所示的JavaScript:
function SayAsAcronym() { prmSayAsAcronym.Start(); } |
在上面的示例中,名為prmSayAsAcronym的提示包括了ssml:say-as元素,它指定任何包含在txtText輸入元素中的文本都應該被以每個單詞的第一個字母方式發出。因此,如果你輸入"ASP"到文本元素中并且點擊"Say As Acronym",那么該TTS引擎將讀每個字母。
為了用該示例應用程序進行試驗,你可以輸入一些文本片斷,然后點擊每一個按鈕來看一下該TTS引擎是怎樣解釋文本的。我主張你改變元素值并且用每一個控件生成的方式進行試驗。SASDK提供給開發者關于該TTS引擎怎樣生成文本的良好控件,因此試驗可能會導致出現一種更為自然的基于語音的應用程序。