AI APPLICATION · LITAS

現成工具應用

我在本機訓練自己的聲音:聲音克隆真正難的是台灣腔、資料與驗收

從台灣腔、錄音資料、LoRA 訓練到推理驗收,說清楚聲音克隆真正困難與不能公開的部分。

作者:Litas

個人本機研究與實作|本人錄音、模型權重與 reference audio 不公開|無贊助、無聯盟連結

聲音克隆最容易讓人產生的想像,是錄一小段聲音,之後所有旁白都能自動變成自己。

我真正想做的事情比較具體:影片、Podcast,甚至未來想留給家人的故事,如果每次都要重新找安靜環境錄音,製作很容易停在「等有空再說」。我希望建立一個本機可使用的 Litas 聲音,能先把內容做成可聽版本,也能進入影片的配音流程。

但「像我」不是唯一標準。如果模型說的是字正腔圓、卻不像我平常會用的台灣國語,那支聲音再清楚也不是我要的結果。

先看目的、成果與證據邊界

項目目前結論
目的建立能用於影片、Podcast 與家庭內容的本地 Litas 語音,降低反覆錄音的製作摩擦,同時把原始錄音、模型與推理留在自己控制的環境。
已驗證成果dots.tts LoRA 使用 62 段訓練與 20 段驗證資料,在 RTX 4060 上完成 500 steps;loss 由 1.2 降到 0.87。套用 LoRA 後,我確認輸出具有可接受的台灣腔。既有 VoxCPM 聲音也已實際用在影片旁白流程。
證據邊界「台灣腔 OK」是我的人工聽感,不是正式聲學評測;它也不表示每一段文字都自然、能完全取代本人錄音。規劃中的 audio.cpp 統一服務層尚未安裝或驗收。

一開始不是模型問題,而是要先留下可用的聲音資料

VoiceClone 專案最初只有很簡單的東西:文稿、本人錄音與一個方向。

真正開始訓練後,我才更清楚資料不是「錄得越長越好」。一段連續錄音需要切成可管理的片段,文字要能和聲音對上,背景噪音、停頓、音量與錯字都會進到模型裡。錄音是素材,整理過的片段才是訓練資料。

本機後來保留了 GPT-SoVITS 的清理資料與已訓練權重,也嘗試 VoxCPM、dots.tts 與 XTTS 等不同路線。這看起來有些分散,但我沒有因為新模型出現,就直接刪掉舊成果。聲音訓練不只花運算時間,還包含很難重新取得的人工錄音與整理成本。

對我來說,模型可以重裝,自己的乾淨聲音資料才是最需要保護的資產。

我要的不是「會中文」,而是不要一開口就失去自己

中文 TTS 的選擇很多,但台灣使用者很快就會聽出語氣差異。某些模型吐字很清楚,節奏與語調卻偏標準普通話;拿來唸產品名稱也許沒問題,放進一篇第一人稱文章,就會產生一種內容是我寫的、說話的人卻不是我的距離感。

dots.tts 的這次 LoRA 實驗,就是針對這個問題。使用的資料來自既有 GPT-SoVITS Litas v5 資料集:

  • 62 段 training。
  • 20 段 validation。
  • 2B SOAR checkpoint。
  • LoRA rank 8,放在 q/k/v/o。
  • RTX 4060,500 steps,約 10 分鐘。

訓練 loss 從 1.2 降到 0.87。這個數字只能說明優化過程有收斂,不能自己證明聲音好聽;最關鍵的比較仍然是實際輸出。

沒有 LoRA 的 Base SOAR,聽起來更像標準普通話。套用 LoRA 後,我確認它有比較接近台灣腔,結果是 OK 的。

我刻意把這句話寫成「我確認 OK」,而不是「模型已完美複製 Litas」。前者是實際發生的人工驗收,後者需要更完整的測試才有資格成立。

訓練成功,不代表推理會自動成功

這次實驗也踩到兩個很具體的坑。

第一個是參考音檔長度。當參考音檔超過約 3 秒,某些推理嘗試只生成一個約 0.16 秒的 patch。把參考音檔縮短之後,流程才回到可用狀態。

第二個是 LoRA 權重載入。一般 PEFT 的載入方法會多加一層 .default 後綴,checkpoint 的 key 又帶有 llm. prefix,和 fresh model 的命名不一致。最後需要手動對應並 assignment,才能真的讓訓練好的權重進入模型。

這兩個問題都提醒我,看到「訓練完成」的 checkpoint 還不是成果。必須真的用固定文字與固定參考聲音跑一次,才知道權重有沒有載入、聲音有沒有生成,以及生成的內容是不是完整的。

VoxCPM 讓聲音不只停在試聽檔

另一條主力路線是 VoxCPM。本機保留 VoxCPM2 的 Litas LoRA 與固定 reference audio;它後來不只用來做一段 demo,而是進入「兩分鐘法則」的影片製作。

旁白被拆成 10 段,生成後重新合併,再依每段真實長度調整 HTML 場景。這個過程讓我第一次把聲音克隆視為製作工具,而不是一個聲音很像的實驗。

當模型真的進入內容流程後,問題也會改變:

  • 專有名詞能不能唸對?
  • 每段語速是否一致?
  • 分段後的音色與音量會不會跳動?
  • 重生某一句時,能否只替換那一段?
  • 最後合併的音檔長度,能不能可靠地驅動畫面?

這些問題不如「像不像本人」吸睛,卻更決定它能不能被長期使用。

為什麼要同時留著幾套模型?

本機盤點時,語音工作區包含 VoxCPM2、GPT-SoVITS、dots.tts 與 XTTS。理想上,我也希望只維護一套環境與一個 API,但現階段直接清掉其他模型,風險比看起來更大。

不同路線現在有不同角色:

路線目前定位
VoxCPM2已進入影片旁白流程的主力聲音路線。
GPT-SoVITS已驗證權重、既有資料集與重新訓練來源。
dots.tts已完成台灣腔 LoRA 實驗,保留為可比較候選。
XTTS實驗候選,尚無足夠證據取代主力。

曾經研究過用 audio.cpp 建立統一的本地 WebUI 與 OpenAI 相容 API,減少多套 Python/CUDA 環境互相干擾。但那份工作目前仍是評估提案:沒有安裝、沒有遷移,也沒有取得刪除既有模型的授權。

這個邊界很重要。盤點完成不等於整合完成;有新的候選方案,也不等於舊模型可以安全刪除。

如何判斷一個聲音真的可以用?

如果只聽一句「大家好」,很多問題都不會出現。我認為後續驗收至少要分成四層:

1. 內容正確

用固定繁中測試稿,檢查漏字、錯字、專有名詞與標點停頓;可以用語音辨識回轉文字協助比對,但不能只看一個分數。

2. 聲音像我

不是只比較音色,也要聽口音、節奏與句尾。這一層最後仍需要我本人判斷。

3. 長內容穩定

短句自然不代表一整篇旁白都穩定。需要檢查分段前後的音量、速度、情緒與呼吸感。

4. 能進入流程

模型必須能被重複呼叫、保留輸出、替換單一片段,並提供真實音檔長度給影片時間軸。否則它仍是 demo,不是工具。

聲音克隆同時也是一個隱私問題

聲音和一般文字素材不同。文字被看見,通常還需要本人帳號或身分才能產生影響;一個可用的聲音模型若被拿走,可以直接製造看似由本人說出的內容。

因此這個專案從一開始就應該遵守幾條界線:

  • 原始錄音、切片資料與模型留在自己控制的環境。
  • 公開文章只分享方法與結果,不提供可冒用本人聲音的模型下載。
  • 外部服務若要上傳 reference audio,必須另外評估用途、保存與刪除方式。
  • 對外作品需要清楚標示 AI 合成聲音,尤其不能用來冒充真實即時發言。

本地執行不會自動消除所有風險,但至少讓資料流向與刪除權仍掌握在自己手裡。

目前的成果,不是「我再也不用錄音」

聲音克隆已經完成幾個重要跨越:從本人錄音變成整理資料,從資料變成模型,再從模型進入實際影片旁白;dots.tts 的 LoRA 也證明,台灣腔不是只能接受模型預設,而是可以透過自己的資料往前調整。

但我現在不會說它已經完全取代本人錄音。

真正重要的內容、需要細緻情緒或公開代表本人立場的段落,真人錄音仍然有不可取代的價值。AI 聲音比較像是把製作門檻降下來:先讓內容能被聽見、能進入剪輯,也讓需要修改的段落不必整篇重錄。

這個差異,讓聲音克隆從「很像我的技術展示」,變成一個比較誠實、也比較可能長期留下的工具。


官方資料與延伸閱讀

倫理與授權說明:本文只討論以本人聲音進行的本地實驗。克隆他人聲音前,應先取得明確同意,並遵守內容平台、隱私、著作權與人格權相關規範。