小時候練鋼琴,老師會叫我錄下來自己聽。我很討厭這件事,因為彈的時候覺得很好聽,錄下來聽全是錯音。老師說:「彈的時候你在忙,聽不到自己。」
語音合成也一樣。模型在忙著生成,它聽不到自己唸錯了什麼。所以流程裡需要另一個不忙的東西,專門負責聽。Qwen 團隊除了語音合成模型,還釋出了兩個各六億參數的小模型:Qwen3-ForcedAligner 和 Qwen3-ASR。前者拿一段音訊和它的逐字稿,輸出每個字的起訖時間;後者是語音辨識。兩個都能在 8 GB 的顯卡上用 fp16 跑,對齊器載入約二十秒、顯存 1.7 GB 左右。它們不製造內容,它們製造證據。
對齊器:時間軸的來源
字幕要知道每個字什麼時候出現,口型動畫要知道每個音節落在哪一毫秒,這些都靠強制對齊。給它音訊和正確的文字,它回傳逐字的時間戳。「強制」的意思是你已經知道內容是什麼,它只負責找出時間,不用猜字,所以又快又準。
注意力核心可以選 eager 或 SDPA,後者在 Turing 顯卡上快約一成,但兩者的數值不同,輸出不會逐位元組相同。如果你有「同樣輸入就重用舊結果」的機制,這個選擇要算進去。我一開始沒算,結果同一段音訊在兩天內對出兩組差幾毫秒的時間戳,字幕看起來像在微微抖動。
辨識器的兩個用途
第一個是替參考錄音打逐字稿。音色複製需要一段參考音和它的逐字稿,拿到錄音時通常沒有稿,只有一段某人講話的聲音。用 ASR 先出一份草稿,人逐字核對後才算數。ASR 的輸出只當草稿,這個順序不能反過來。它會把「嗯」聽成「恩」,把停頓聽成句號,這些都要人來決定。
第二個是反過來聽合成的聲音,也就是鋼琴老師那招。每句合成完,用 ASR 轉回文字,跟送進引擎的文字比。唸錯字、漏字、失控多唸的版本在這裡被擋下來,而且這一步從不改寫原文,它只回報「聽起來像什麼」。比較兩個引擎、兩組參數時也靠它:同樣的句子各生成一次,轉回文字一比,差異客觀可讀,而人耳在聽第四十遍同一句話時並不可靠。相信我,第四十遍的時候你會覺得每一版都一樣,也都一樣奇怪。
簡體輸出,繁體原文
Qwen3-ASR 輸出簡體中文。如果你的原文是繁體,字元錯誤率的絕對值幾乎全是字體差異造成的,那個數字本身沒有意義。你會看到一個 0.26 的錯誤率然後嚇一跳,以為模型唸錯了四分之一,其實它只是把「臺」寫成「台」、把「後」寫成「后」。
有意義的只有相對比較:文字相同、辨識器相同,轉換的懲罰兩邊一樣,差異就是真的差異。或者先做一次繁簡轉換再比。我一開始把平均值當結論,把真問題藏在了雜訊底下,後來改成逐句攤開對照,才看到哪一句錯在哪個字。這件事我學到的不只是技術,是「平均值會說謊,而且說得很有說服力」。
Windows 上的編碼
模型的輸出是 UTF-8。在 Windows 上透過子程序讀它的標準輸出,如果沒有明寫編碼,Python 會用系統的 cp950 碼頁解碼,直接在讀取執行緒裡炸掉。炸的位置很陰險,不在你的程式碼裡,在一個你看不到的執行緒裡,錯誤訊息長得跟你的邏輯完全無關。凡是會輸出中文的模型,子程序的 encoding="utf-8" 一定要寫。這一行我現在會在建子程序的時候反射性地打出來,像繫安全帶。
小劇場:這樣不會很慢嗎
「每一句都要再跑一次辨識?那不是要多一倍時間?」
「辨識比合成快很多,六億參數的模型跑一句大概一兩秒。」
「那也是時間啊。」
「你寧可多花一秒確認它唸對了,還是等影片上線之後被留言說第三分鐘有一句唸錯?」
「後者聽起來比較丟臉。」
「而且你會不知道是哪一句,要整支重聽。」
「好,多花一秒。」
為什麼值得多跑兩個模型
一批幾百句的配音,你不會每句都聽,但每句都可以有一份「機器聽到了什麼」的紀錄,任何一句不對都能追回去。在沒有人盯著的流程裡,這比合成速度再快一成重要得多。
鋼琴老師後來還說過一句話:「錄音不會讓你彈得更好,但它會讓你知道哪裡要練。」這兩個小模型就是那台錄音機。它們不會讓語音合成變好聽,但它們會告訴你哪一句要重來。
強制對齊是一門老手藝
強制對齊在語音研究裡存在幾十年了,遠早於這波深度學習。早期的做法是隱藏馬可夫模型,語音學家拿它來標音素的邊界,做語言學研究。Kaldi 這個工具包在 2011 年之後成了學術界的標準,後來又有 Montreal Forced Aligner 把它包得比較好用。這些工具的使用者主要是研究者,介面很學術,設定很多。
新一代用神經網路的對齊器,像 Qwen3-ForcedAligner,把這件事變成一個模型呼叫:給音、給字、拿時間。準確度在乾淨的合成語音上很高,因為合成語音沒有背景噪音、沒有口吃、沒有兩個人搶話,那些正是老方法最頭痛的情況。對我的用途來說剛好,因為我對齊的全部都是合成語音。
語音辨識的評估指標有兩個:WER 是詞錯誤率,英文用;CER 是字元錯誤率,中文用,因為中文沒有空格分詞。這就是為什麼前面說 CER 而不是 WER,也是為什麼繁簡差異會直接灌進 CER 裡,每一個「臺」對「台」都算一個字元錯誤。
常見的三個誤會
第一個誤會是「辨識器可以拿來校對原文」。不行,方向反了。辨識器把聲音變文字,它的輸出是「聽到了什麼」,原文是「該說什麼」。兩者不同時,該懷疑的是聲音,不是原文。讓辨識器改原文,等於讓錄音機改你的樂譜。
第二個誤會是「對齊器能處理任何音訊」。它需要正確的逐字稿。逐字稿跟音訊對不上,例如音訊多唸了一句,對齊器會硬把時間分配下去,結果是一堆看起來合理但全部錯位的時間戳。垃圾進、垃圾出,只是這次垃圾長得很整齊。
第三個誤會是「簡體輸出是 bug」。它的訓練資料以簡體為主,輸出簡體是預期行為。要繁體就自己轉,OpenCC 這類開源工具一行就能轉,而且很準。抱怨模型不如自己加一行。
一個週末可以試的小練習
用手機錄十秒鐘自己唸一段話,存成 WAV。裝 Qwen3-ASR 的套件或任何一個能跑的辨識模型,轉成文字,跟你原本唸的那段比。數一數錯幾個字,然後看那些錯的字是「聽錯」還是「繁簡」。
接著做第二件事:把同一段音訊和你的原文丟給對齊器,拿到每個字的時間戳。挑一個字,用任何一個音訊軟體跳到那個時間點聽一下,看它是不是真的在那裡。這個「跳過去聽一下」的動作,會讓你對「毫秒級的對齊」從一個抽象的詞變成一個具體的體驗。整個練習半小時,不需要顯卡,CPU 慢一點但跑得完。
後記
鋼琴老師的那台錄音機是卡帶的,很舊,按鍵按下去會喀一聲。我小時候很怕那個聲音,因為它代表接下來要面對自己的錯音。現在寫這篇,我發現我對辨識器的感覺跟對那台錄音機一樣:不喜歡它告訴我的事,但很感謝它會說。願意聽自己的錯音,大概是所有練習的起點,不管練的是鋼琴還是語音合成。
模型頁面:huggingface.co/Qwen/Qwen3-ASR-0.6B、huggingface.co/Qwen/Qwen3-ForcedAligner-0.6B
留言(0)
還沒有留言。讀完有想法,歡迎留下第一則。