註:筆者居住於韓國,部分內容包含韓國特有的背景。
這是 hayakoe 系列的第一篇正文。前言性質的文章可以在 hayakoe — 打造好用又快的 TTS 函式庫 — 序論 查看。
序論中簡單提到的一個話題是「重新選擇了模型」。Part 1 我想把這個過程講得更詳細一些。
大致可以分成三個階段:
- 瀏覽其他函式庫候選,最終又回到 SBV2 的過程
- 資料集建構(這兩年環境改善了不少)
- 訓練設定與檢查點評估
1. 也看看其他函式庫
2年前寫 用 Bert-VITS2 製作自己的 TTS 時,日語 TTS 函式庫的選擇基本只有 Bert-VITS2 一個候選。但2年過去,語音合成領域已經發展了不少。
反正都要花時間動手,那就把其他候選也看一下比較合理,於是我評估了兩個號稱韓語支援不錯的候選。
GPT-SoVITS
最先看的是 GPT-SoVITS。它支援韓語 / 英語 / 日語,而且只需要往預訓練模型裡輸入幾秒鐘的短音訊樣本,就能用那個音色生成發話——零樣本推理這一點很有吸引力。
我先在沒有訓練的情況下用零樣本試了試,結果在兩個方面都不太滿意:
- 發話自然度不夠。 合成出來的音色比較平淡,情感 / 語調的銜接不夠流暢。
- 韓語發話不自然。 把日語說話人的樣本拿來發韓語,結果是「勉強能說」,但很難說自然。感覺像是日本人勉強讀著韓文..?
零樣本時已經不滿意的音質,再訓練一次也不太可能有質的飛躍。反正我想做的本來就是日語而不是韓語發話,所以判斷再多看幾個候選更划算,沒有繼續訓練就轉向了下一個。
Qwen-TTS / 自迴歸系列
序論裡也簡單提過,自迴歸系列的 Qwen-TTS 也是候選之一。不過這個在音質驗證之前,單是計算量本身就太大、難以即時使用,這是它一次性出局的原因(詳情請參考 序論 )。
音質方面也不算特別滿意。可能因為是零樣本,想要的細節出不來。大致是宅宅的話就懂吧?
最終還是 Style-Bert-VITS2
把候選都看了一圈之後,最終還是回到了音質和速度平衡最好的 Style-Bert-VITS2 (JP-Extra v2.7.0)。SBV2 是 Bert-VITS2 的後繼版本,2年前我已經走過一遍類似的訓練 / 使用流程,這一點也很重要。
2. 資料集建構 — 這兩年環境改善了不少
資料集方面,我手頭有自己之前累積的語音資料集,直接拿來用了。2年前寫過類似工作的文章,所以大致流程比較熟悉。經過資料整理和品質驗證,最終收集到約 1,500 個樣本。
不過這兩年語音處理工具的環境進化了不少。最讓我印象深刻的是,像人聲分離(UVR — Ultimate Vocal Remover)這類工具,已經不需要再單獨安裝一個 GUI 程式了。
2年前這件事還挺麻煩的。UVR 是 Windows 應用程式,所以得直接安裝它,然後還要在應用程式裡點「下載模型」按鈕單獨取得模型檔案,之後才能跑資料夾級別的批次處理。現在用 audio-separator 這類函式庫,就能從 HuggingFace 拿模型,用一行 Python 程式碼跑起來。
from audio_separator.separator import Separator
separator = Separator()
separator.load_model("model_bs_roformer_ep_317_sdr_12.9755.ckpt")
separator.separate("input.wav")這看起來可能是個小差別,但當你要處理 1,500 個樣本時,省掉 GUI 點擊 / 資料夾管理 / 進度確認這些雜活,差距會非常明顯。更重要的是,可以把這一步直接整合進訓練流水線,往後加入新資料時再跑一次同樣的程式碼就行了。
3. Style-Bert-VITS2 的訓練
訓練本身就直接用了 SBV2 自帶的 webui。
- 取樣率: 44.1 kHz
- batch_size: 2 (RTX 3080 / 10GB VRAM 基準)
- learning rate: 1e-4
- eval_interval: 5,000 step
- 目標 epoch: 500(實際跑到約 88 epoch 時就停了)
- 訓練資料: 約 1,500 個樣本
其實沒必要全部跑滿 500 epoch。過了一定 step 之後,音質就不再提升,或者反而開始出現過擬合跡象,所以在合適的時候停下來,進入了評估階段。
4. 檢查點評估 — 我直接全都聽了一遍
要最準確地判斷每個檢查點的音質變化,最終方法就是直接聽。SBV2 在訓練中也會把 mel reconstruction loss、KL divergence、duration loss、generator / discriminator loss、WavLM adversarial loss 這些 loss 輸出到 tensorboard。但這些數值變低,跟音色聽起來自然是另一回事。最終最重要的還是我自己耳朵聽起來自然不自然。
反正是自己用的模型,評估方法就走簡單路線。
- 從 5,000 step 到 50,000 step,每 5,000 step 抽一個,共抽 10 個檢查點
- 準備 短 / 中 / 長 三段文字,每個檢查點都合成一遍
- 把得到的 30 個樣本整理成 HTML matrix,在一頁上對比試聽
short medium long
ckpt 5k ▶ wav ▶ wav ▶ wav
ckpt 10k ▶ wav ▶ wav ▶ wav
ckpt 15k ▶ wav ▶ wav ▶ wav
ckpt 20k ▶ wav ▶ wav ▶ wav
...
ckpt 50k ▶ wav ▶ wav ▶ wav每個儲存格裡是合成的 wav 檔案,可以橫向比較同一段文字,縱向比較不同 step 的音色。合成花了一些時間,但評估本身就是戴著耳機依次聽完,是個機械的工作。
直接全部聽完之後,15,000 step(約 epoch 34) 的音質最自然。再往後的 step 音色會出現微妙變化,或者發話音調變得單調,所以這一步就是 sweet spot。
這只是我個人耳朵的判斷。其他人來評估可能更喜歡另一個 step,文字不同結果也會有些差異。但反正是自己一個人用的模型,這樣就夠了。
Part 1 總結
Part 1 整理了在看完其他模型候選之後,最終又回到 Style-Bert-VITS2 (JP-Extra v2.7.0) 的理由,以及在此基礎上資料集 / 訓練 / 檢查點評估是怎麼進行的。
簡而言之 — 其他候選(GPT-SoVITS、Qwen-TTS 等)要麼零樣本音質上達不到想要的細節,要麼計算量太大無法即時,最終落到了 音質 / 速度 / 熟悉度的平衡 最好的 SBV2。
不過,直接用訓練好的 SBV2 模型,仍然有 RAM 5GB、CPU 推論 1.09× 這些限制。下一篇會講我是怎麼把這部分壓下來的。

Comments