#E6E6E6 【VB】ExtraSpeaker:英文語音朗讀精靈 作者:吳文成

  在南部某所大學電機系任教的好友寫了封信來問我,說想不透這麼小巧的軟體 ExtraSpeaker 到底是利用什麼程序來朗讀文章與發音的? 幾乎任何的英文單字與文句都難不倒 ExtraSpeaker ! 這套軟體是事先錄製音標來發音的嗎?可是這又不可能,因為 ExtraSpeaker 只有不到 70 KB ,這麼小的軟體是不可能塞下所有的音標拼法與語音合成規則的!

 [[img src=computer/ExtraSpeaker.gif height=400 width=489 align=middle]]

  其實 , ExtraSpeaker 這套軟體並沒有什麼玄妙的地方,它只是調用了 Windows-XP 本身就內建的語音套件(Microsoft Speech Package,這是微軟語音軟體開發工具〔Microsoft Speech SDK〕的主要成果之一),這個語音套件包含了語音朗讀(Text-to-Speech,簡稱為 TTS)與語音辨識( Speech Recognition,簡稱 SR)兩大核心功能 , ExtraSpeaker 調用的是其中的 TTS 語音合成(Speech Synthesis)引擎 , 也就是說,ExtraSpeaker 只是一個調用別人已經完成之技術的一個介面罷了,這裡的「介面」一詞是指封裝特定的屬性與方法,使之成為與使用者直接面對面操作的媒介,亦即,介面是程式核心技術與使用者之間的橋樑 ,ExtraSpeaker 扮演的就是 TTS 語音引擎與使用者之間的橋樑 ,在某個意義上,你也可以把 ExtraSpeaker 視為是 TTS 語音引擎的某個 GUI(Graphical User Interface)。 其實,很多人不知道 Windows-XP 內建了語音套件,再加上 Windows 裡並沒有提供類似於ExtraSpeaker 的附屬應用程式(但是目前我們知道類似的語音朗讀功能,有應用與內嵌到最新版的 Microsoft Word 軟體裡),這使得不少人對於(
英文)語音朗讀的軟體還是感到陌生。

  ExtraSpeaker 用在朗讀英文的程式碼只有七、八行而已 , 其它的程式碼幾乎是用在文字編輯功能(包括無限制的文字復原與重做),與撰寫平面按鈕的控制項(包括按鈕上顯示的好幾個圖示), 另外 ExtraSpeaker 還提供了「多文本清單」,與「重複朗讀」、「朗讀從游標處開始」、「跳唸句子」、「追蹤文本單字」、「追蹤文本單句」(後兩個功能便是實現「文章念到哪,單字或單句就反白指示到哪!」,讓你能夠掌握目前的語音朗讀進度 )等等的功能 , 這些都是在 TTS 語音引擎之外的附加功能,也就是說 ExtraSpeaker 的設計理念之關鍵在於,你「 如何發揮創意,在已有的基礎技術上做出更實用與更高階的複合功能」!我們可以這樣說,調用已知的技術並不是最難的,最難的是,你如何構想與組合不同的功能單元,並且以使用者的操作意向為主軸,去設計出友善的與高適應性的軟體介面。例如,只是朗讀英文(程式設計者只是單純地調用 TTS)是不夠的
,最好可以讓使用者反覆地聆聽某段被選取的文字,也可以讓使用者調整英文朗讀的速度與音量,如果使用者比較喜歡聽異性的朗讀口音,那麼,這個軟體還可以讓使用者選擇朗讀對象(男聲或女聲)的類別。

  以 ExtraSpeaker 的軟體設計為例(這並不是一個普適的舉例), 在瞭解了作業系統平台( Windows-XP 或 Windows-2k)與可被調用之核心技術(TTS)的限制條件下,以及在界定問題與釐清需求之後,我們首先要設想與收集可能做出的功能有哪些(例如目前做不到一邊朗讀一邊顯示正在朗讀的子音與母音,但是卻可以做到一邊朗讀一邊標註正在朗讀的字詞)
,然後再去考慮如何將那些需要實現(反之,我決定剔除掉文字「尋找」與「取代」等等功能)的功能給單元化、類別化與序列化(例如「朗讀整個文本」、「朗讀從游標處開始」、「朗讀選取的文字」與「暫停」這些功能單元是同一個序列的),思考不同功能單元的組合是否可以延伸出新的功能表徵(例如「使用單次/反覆朗讀」與剛剛提到的那個功能序列,便可以組合出六種新的功能表徵,接著要決定新的功能表徵是否要獨立為一個個別性的功能實體,或者是保留它們的可組合性)。以上的構想要到了一定的規劃與檢視之後,我們才會真正著手來撰寫開發端介面(封裝特定的屬性與方法),然後再到用戶端介面(使之成為與使用者直接面對面操作的媒介)

  什麼是「撰寫開發端介面,然後再到用戶端介面」?這裡涉及到的是介面的兩個層次,前者是程式設計者所要包裝與協定的層次,後者是使用者所接觸與操作的層次。我在這裡舉一個具體的例子來逆向思考一下,在 ExtraPlayer 裡 ,使用者可以執行「影音分割」的功能,使用者可以直接分割 MPG、WMV、MP3、Midi 等等格式的檔案 , 這就是可操作的用戶端介面之一,可是要實現這個用戶端介面,程式設計者卻必須先包裝與協定好幾個物件模型 , 例如可能需要撰寫 mpgCut、wmvCut、mp3Cut 與 midiCut 等等物件類別(即,封裝特定屬性與方法而成的標準元件),它們可能會有類似的指派或初始化方式,這就是所謂的開發端介面的建立與撰寫。在開發端介面的引用、整合與外觀化之後,這才實現了使用者所接觸到的個別性的功能實體。也就是說,一項用戶端介面的功能,可能是由好幾個開發端介面(物件類別)所構成,也有可能是這種情形,同一個開發端介面(物件類別)貢獻到不同的用戶端介面之功能實體上,這同時涉及到我在上一段所提到的功能序列與可組合性的問題。

  這篇文章原本是要介紹,語音合成技術的發展現況與相關問題,可是篇幅不夠,所以找個機會,我再另外來談一談那個議題 。 ExtraSpeaker 應該是一個很好的例子,讓我與大家分享功能界定與介面設計的相關經驗。在我看來,如何發揮創意,在已有的基礎技術上做出更實用與更高階的複合功能,是相當重要的,我認為這裡的問題處不在於技術的調用,而是在於,有構想去發揮創造力,去撰寫多功能介面的人太少。功能表徵的創意
、構想與評估,以及功能表徵的單元化、類別化、序列化與組合性,這是創造軟體價值,以及在程式設計裡,一個舉足輕重的部分。

可執行檔下載

瀏覽發行頁面
2005/05/08