2023年4月14日

NVDA老是讀錯?改一下就好了

2023/10/31 更新
當 NVDA 語音朗讀文字的時候,有沒有發現到某些字詞讀起來怪怪的甚至是不正確的?由於語音朗讀文字的讀音並不全然正確或符合聽讀上的認知,NVDA 提供的讀音字典功能可以讓我們對字詞的讀音進行修改以滿足聽讀上的需要,尤其對視障者而言,在看不到文字作為對照的情況下,語音朗讀是否正確或標準更顯得重要,會影響對朗讀內容的理解與認知。

讀音字典使用上並不困難,舉例來說,使用 Windows OneCore 合成器的 Microsoft Yating 中文語音作為朗讀的語音,語音朗讀「收斂、內斂」的「斂」讀音不是ㄌㄧㄢˋ,我們便可以在讀音字典中新增字典項目來修正讀音,規則如下。

原來文字:斂
替代文字:練

替代文字欄位內容只是改變原來文字欄位內容的讀音而已,並不會改變實際的文字內容,利用中文同音不同字的方式將「斂」替換為「練」,如此這個字的讀音聽起來就正確了,當然在選擇替代用的中文字時也儘可能不使用具有一字多音的中文字以避免產生新的讀音問題。

上述例子是單字的情況,有時讀音問題是形成詞之後才有讀音問題,例如「打折」這個詞分開讀音都正常,但放在一起後「折」的讀音卻異常,因此建立修正讀音的規則要包含造成讀音異常的字,規則如下。

原來文字:打折
替代文字:打哲

同樣也是利用同音不同字的方式將「折」替換為「哲」。有些詞在前後文不同的情況下會發生有時讀音正確有時不正確的奇怪現象,這類讀音修正也是以詞的方式建立規則。

再舉個英文的例子,使用 Microsoft Yating 中文語音朗讀「network」這個單字會產生爆音,在讀音字典新增字典項目的規則如下。

原來文字:network
替代文字:net work

在 net 與 work 之間加上空格,語音朗讀聽起來沒有什麼改變並且爆音的現象消失了。

利用空格來區隔的方法還可用在英文縮寫的朗讀上,例如 Standard Operation Procedure 的縮寫是耳熟能祥的 SOP,Microsoft Yating 中文語音將 SOP 當作一個英文單字朗讀而不是分開的三個字母,所以新增字典項目來修正。

原來文字:SOP
替代文字:s o p

在字母和字母之間加上空格語音就會分開朗讀,這理要注意「大小寫須相符」核取方塊需要勾選,因為原來文字欄位的三個字母都是大寫,也就是必須大寫才符合修正讀音的條件,若為小寫則維持原本語音對該字串的讀音方式,至於替代文字欄位中的三個字母使用小寫或大寫的語音朗讀效果都一樣,所以用小寫字母也可以。

NVDA 朗讀的內容並非都是螢幕上可見的文字,包括 NVDA 的提示、應用程式的內部資訊等都不會出現在螢幕上,如果建立規則時需要將這些無法從螢幕上選取的文字作為原來文字欄位的內容,可以先開啟 NVDA 功能表 >工具 > 語音檢視器,接著執行需要獲取文字內容的操作,然後再切換到「語音檢視器」視窗,便可從語音朗讀過的記錄中尋找並複製所需的文字。

建立規則時就竟是要選擇讀音字典的預設字典還是語音字典來建立規則呢?這要看建立的規則而定,每種語音都有它自己處理字詞的規則,對同一字詞建立在 A 語音的規則未必可用在 B 語音,如果建立的規則切換到不同語音朗讀都正常便可將規則放在預設字典,否則就要放在針對特定語音建立規則的語音字典。
選擇語音字典建立規則時語音字典對話方塊的標題列會顯示目前正在使用的語音其字典檔的路徑位置,最後面的 xxxxx.dic 檔案的名稱即為語音名稱,不同的語音會顯示對憗的字典檔路徑,方便確認是作用在哪一個語音的讀音字典。

NVDA 讀音字典建立的規則會作用在所有地方,但有時我們建立的規則只是針對特定程式中發生的情況而已,若作用在程式以外的地方反而造成不必要的問題。安裝 Application dictionary 這個附加元件後 NVDA 功能表 > 偏好 > 讀音字典的子功能表將會多出 [Application Dictionary...] 項目,當在特定程式中有需要建立針對該程式的讀音字典時即可選擇讀音字典的 Application Dictionary 來建立規則,對話方塊的標題列會顯示目前程式的執行檔名稱,例如「Dictionary for winword」的 winword 即為 Microsoft Word 的執行檔名稱,不同的程式會顯示對應的執行檔名稱,方便確認是作用在哪一個程式的讀音字典。

讀音字典可以怎麼用呢?以下列出可以使用的場景。

  1. 修正讀音
    有些字本身的讀音就怪怪的或不正確,有些字的單字讀音正確,但形成詞的讀音卻與單字不同,不少中文字都有一字多音的情況,與其它文字形成的詞不同導致同一個字卻有不同讀音的結果,例如「重灌電腦」的「重」語音可能會讀成ㄓㄨㄥˋ而不是ㄔㄨㄥˊ,英文像是縮寫字或特殊單字如 Wi-Fi 等的讀音與預期不同,這些異常讀音都能加以修正。
  2. 改變讀法
    例如 CM2 語音直接按字元讀出聽起來很怪,可以改為「平方公分」,鍵盤上的「PgDn」這個鍵可以讓語音讀成「page down」,或是將檔案的副檔名改為聽得懂的讀法等。
  3. 賦予讀音
    語音合成器並非所有的文字都能讀出,以中文字來說,Windows 系統中的語音合成器能夠讀出的中文字只有兩萬字出頭而已,但中文字的數量遠不只無此,此外新興的表情符號或顏文字也不是每個都能讀出來,這時就可以像倉頡造字一樣新增文字並賦予讀音來解決有字鷡音的問題。
  4. 消音
    有時 NVDA 朗讀的內容不一定對我們來說是有用或有意義的,反而是個累贅造成不必要的干擾,讓這些多餘的內容不要讀出來使我們可以獲取真正有用的資訊。

NVDA 語音字典雖然提供了方便操作使用的視窗介面,不過並沒有提供搜尋字典項目的功能,一但建立的字典項目多了,要尋找編輯列表中的項目就顯得不便,這些建立的字典項目其實都會儲存在以下路徑的資料夾中。

  • 安裝的版本
    「開始」功能表 > NVDA > 開啟 NVDA 使用者組態目錄 > speechDicts
  • 可攜式版
    NVDA 資料夾 > userConfig > speechDicts

speechDicts 資料夾中的 default.dic 是預設字典檔,而語音字典檔在 voiceDicts.v1 資料夾裡所屬合成器的資料夾,如有安裝 Application dictionary 附加元件則字典檔在 appDicts 資料夾。
字典檔副檔名雖是 dic 但其實是個文字檔案可用記事本開啟,檔案內資料的呈現是一行一個字典項目,每個字典項目由左往右依序是原來文字、替代文字,大小寫、類型,中間用 tab 區隔開來,大小寫與類型以數字表示。
  • 大小寫:0 為沒勾選,1 為勾選
  • 類型: 0 為任何地方,1 為正規表達式,2 為整個單字
如果註解欄位有輸入內容的話會在該字典項目的上一行以 # 符號開頭呈現註解內容。

了解字典檔資料的組成方式後我們就可以直接對內容進行查詢、編輯及新增資料,字典檔的內容如有變更則 NVDA 需要重新啟動才會套用新的變更。這些字典檔的資料若很重要的話建議備份字典檔或備份整個 speechDicts 資料夾,當新安裝 NVDA 或使用可攜式版時便可以將備份的檔案或資料夾取代相應路徑位置的資料,不需再重新建立字典項目。

讀音字典的替代原理不難理解,然而實際使用會發現有些情況卻不是將 A 替換為 B 就能搞定,請見延伸閱讀的〈NVDA神祕的正規表達式應用〉一文。

[題外話] 是字庫還是字典?
在使用 NVDA 讀音字庫時是否對「字庫」一詞感到困惑呢?對照原文是 dictionary 而中文被譯為「字庫」。什麼是字庫?字庫通常指的是相關文字字元與字體的彙整集合,有 library 的含意,以「CNS11643 中文標準交換碼全字庫 (簡稱全字庫)」網站為例,建置目的即為收集整理中文字的字型、字音、字碼等資訊以利於中文字在電腦世界的交換流通,這也是為何會稱為「庫」的原因,即有 library 之意,另外程式開發常見的「函式庫」英文為 library,是在電腦科學中用於開發軟體的子程式集合。而 dictionary 一般的翻譯是「字典」,電腦軟體中的字典其角色可以是一個文字的集合以用於提供文字比對與取代的功能,NVDA 的讀音字庫正是如此,所以原文用的是 dictionary,顯然中文翻譯與原文表達有所出入。
(註:NVDA 2023.2 之前的版本使用「字庫」一詞,NVDA 2023.3 已修正為「字典」)

延伸閱讀