#E6E6E6 【VB】實現螢幕朗讀的新版 ExtraSpeaker 作者:吳文成

  沒想到,兩天前完成「 實現嵌入網頁的語音朗讀 」的 ieSpeaker ,現在就要跟它說再見 ,因為新版的 ExtraSpeaker 2.2 版取代了它 , 並不是說 ExtraSpeaker 納入了 ieSpeaker , 而是 ExtraSpeaker 大幅超越了 ieSpeaker 。ieSpeaker 只是實現網頁文字的語音朗讀, 然而 ExtraSpeaker 卻可以做到針對任何應用程式的選取文字的語音朗讀。這樣的功能,我稱呼為「全域朗讀」或是「螢幕朗讀」,我認為,實現此功能最好的軟體是「讀霸」,它是可以朗讀中文的大陸軟件,另外,台灣網友比較熟悉的類似軟體便是「
Dr. eye 譯典通 」, 它具備有中英日文朗讀的即時語音功能, 但是詭異的是, 譯典通有時候捕捉不到某些—— 以 Java 為核心的 ——跨平台軟體的選取文字,例如 Encyclopædia Britannica Deluxe Edition 2004 , 對於整合型瀏覽器 Maxthon 也是出現這樣的問題。去年,我就想寫一個程式,它的任務是解決上述的問題。一年後的今天,它終於面世了。

  在「捕捉任意應用程式裡的選取文字」方面,我相信讀霸、譯典通與我的作法是一樣的,因為只有這種做法──要先將目標應用程式給置於前[[img src=computer/ExtraSpeaker2.gif height=339 width=378 align=left]]景,然後傳入虛擬按鍵 Ctrl-C 給它,以複製選取的文字──這個原理說起來簡單易懂,但是當中一些小技巧,卻會造成效率與準確度上的差別。這便是為什麼:很多進階的程式設計者明明知道這個原理
,卻無法如預期地實現它的原因。

  整個設計流程包括有前段、中段與後段。前段要處理的問題是:讓使用者自訂快捷鍵( Hotkey )( 利用 SubClassing 或者
Keyboard Hook 技巧)
攔截全域性的組合鍵的鍵盤訊息( 實際上這難度算是滿高的)。中段程序便是最重要的:在使用者按下快捷鍵的情況下,執行「捕捉任意應用程式的選取文字」功能(等等,讓我先喝一杯咖啡)
這裡的難度在於如何「有效的」傳入虛擬按鍵給目標應用程式,並且得到「有效的」回應。在你得到選取文字之後,後段的任務就是把它朗讀出來
,也就是把它交給 Microsoft Text-to-Speech Package 指令(你需要熟悉這組微軟內建的語音物件的相關用法),在朗讀過程中,你需要持續攔截全域性的鍵盤訊息,以預備其它快捷鍵的插入,來執行包括開始朗讀/停止/暫停/繼續的功能。

[[img src=computer/ExtraSpeaker3.gif height=159 width=202 align=left]]  顯然,有一些事情是貫穿前段、中段與後段程序的,例如鍵盤訊息的攔截(另外,其實我們也可以設計為:是滑鼠事件來啟動「螢幕朗讀」功能,這樣就會變成是全域性的滑鼠訊息的攔截。對於 ExtraSpeaker 而言,由於我希望「螢幕朗讀」功能做的像是背景模式那樣 ,所以 ExtraSpeaker 可以最小化/隱藏執行 ,這時候, ExtraSpeaker 便需要在工具列上顯示圖示,並且以圖示的改變來表示「螢幕朗讀」的狀態——顯然,這件事情也是貫穿前段、中段與後段程序的 。 ExtraSpeaker 的背景模式,使得它像是常駐程式那樣,讓使用者感覺它輕巧、不佔空間,只要使用者按下快捷鍵,它又突然被使用者喚醒,做它該做的事情。

  在功能表徵的組合性方面( 這一點我在〈 ExtraSpeaker: 英文語音朗讀精靈〉一文裡特別地強調過),我在「螢幕朗讀的快捷鍵設定」裡(參看第一張圖例 ),「允許執行 ExtraSpeaker 的螢幕朗讀功能」的核選項目之外,我另外提供了(A)「把選取的文字,同時複製到系統剪貼簿」與(B)「如果捕捉不到選取文字,則朗讀剪貼簿」兩個核選項目。A與B的組合會出現很有趣的新功能類型。例如,A加B的意思就是:(C)當你按下朗讀快捷鍵,如果捕捉不到選取文字,就再唸一遍上次的螢幕朗讀
;它的意思也是,如果你沒有選取文字,那麼就再唸一遍上次的螢幕朗讀
。而非A加B的意思是指:(D)當你按下朗讀快捷鍵,如果捕捉不到選取文字,就唸出系統剪貼簿的文字內容;它的意思也是,如果你沒有選取文字,那麼就唸出系統剪貼簿的文字內容。很有意思吧,有時候,功能表徵的組合所出現的新功能類型是「非線性」(非加和性)的,換句話說,單元的組合可能會出現比預期還多的意涵,以系統科學的行話來說,就是「整體會大於部分的總和」。對於程式設計者來說,這件事情同時也突顯了「功能表徵如何單元化」的問題──我的意思是,如果你想做出C與D的話,你要如何單元化出A與B,而它們可以組合出C、D呢?

  咕嚕,咕嚕,我又寫了一長串 。 ExtraSpeaker 是個小而美、實用且輕巧的軟體 ,早上的時候,我才與朋友談到 ExtraSpeaker 在我眼裡,就像是個嫵媚嬌柔的女孩子,體態優美,輕聲細語。在這幾天改版的過程裡,她給我的感覺,與 ExtraPlayer 大大不相同,呵呵,不知道,以後當我「真的
」完成 ExtraMidi 的時候,那又是什麼感覺 。 看來能夠給我誘惑的事物還真多,希望在我的計劃裡,我能夠把事情一件一件做完。

可執行檔下載

瀏覽發行頁面
2005/09/03