最近 AI 語音克隆技術越來越熱門,但大多數方案都需要昂貴的 GPU 來跑。如果你跟我一樣,手上只有一台 Proxmox VE(PVE)伺服器,沒有 GPU 直通,該怎麼辦?

這篇文章要帶你在 PVE 的 LXC 容器裡,完全依靠 CPU 跑起來 MOSS-TTS-Nano——一個僅 0.1B 參數的輕量級語音合成模型。不需要 GPU、不需要複雜設定,四核心 CPU 就能流暢運行。

什麼是 MOSS-TTS-Nano?

MOSS-TTS-Nano 是一個開源的語音克隆(Voice Cloning)模型,由 OpenMOSS 團隊開發。它的 ONNX 版本特別適合 CPU 環境,因為:

  • 零 GPU 依賴:移除了 PyTorch,改用 ONNX Runtime 進行推理
  • 體積極小:僅 0.1B 參數,記憶體佔用極低
  • 語音克隆:只需一段參考音檔,就能複製指定人的聲音
  • OpenAI 格式相容:透過 bridge.py 可以偽裝成標準 TTS API,直接給 SillyTavern 用

簡單來說,它讓你用最低的成本,體驗最完整的語音克隆功能。

前置準備

硬體需求

項目最低要求建議值
CPU4 核心4 核心以上
記憶體4 GB8 GB
硬碟20 GB20 GB 以上
GPU不需要不需要

作業系統

建議使用 Ubuntu 22.04 LTS 或 24.04 LTS 作為 LXC 容器的作業系統。

你需要的東西

  1. 一台已安裝好 PVE 的伺服器
  2. SSH 連線工具(如 Terminal、iTerm2、Windows 終端機)
  3. 一段你想複製的聲音音檔(wav / mp3 / flac 皆可,越清晰越好)

第一步:建立 LXC 容器並進入環境

在 PVE 管理介面建立一個新的 LXC 容器,選擇 Ubuntu 22.04 或 24.04 的 template。資源分配參考上面的表格即可。

容器建立完成後,進入 PVE 管理介面的「Console」,準備開始安裝。


第二步:安裝 SSH 與 Samba(方便傳輸檔案)

這一步不是必須的,但強烈建議。有了 SSH 和 Samba,你就可以從自己的電腦直接連線到容器,不用每次都回到 PVE 的 Console 操作。

安裝 SSH

apt update
apt install openssh-server -y

編輯設定檔:

nano /etc/ssh/sshd_config

找到 PermitRootLogin 這一行,把前面的 # 刪除,並把值改成 yes:

PermitRootLoginyes

存檔後重啟 SSH 服務:

systemctl restart ssh
systemctl enable ssh

安裝 Samba(Windows 用戶專用)

如果你常用 Windows,裝 Samba 後可以直接在檔案總管存取容器內的檔案,非常方便。

apt update
apt install samba -y

編輯設定檔:

nano /etc/samba/smb.conf

滾動到檔案最底部,貼上這段設定:

[LXC_Root]
   comment = Warning: Full System Access
   path = /
   browseable = yes
   read only = no
   guest ok = yes
   force user = root

重啟 Samba 服務:

systemctl restart smbd nmbd

之後在 Windows 的檔案總管輸入 \\192.168.88.6\LXC_Root(替換成你的容器 IP),就能愉快地上傳音檔和修改設定檔了。


第三步:修正時區與中文亂碼

設定時區

timedatectl
timedatectl set-timezone Asia/Taipei
date

date 指令應該會顯示類似 Mon May 4 08:21:22 CST 2026 的結果,代表時區設定成功。

安裝中文語系支援

apt install locales -y
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen
sed -i -e 's/# zh_TW.UTF-8 UTF-8/zh_TW.UTF-8 UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=en_US.UTF-8

設定完後需要重新登入才會生效。輸入 exit 離開 SSH 連線,然後重新連線。


第四步:安裝 Miniconda 與 Python 環境

MOSS-TTS-Nano 需要 Python 3.12,我們用 Conda 來管理虛擬環境,這樣不會跟系統其他套件打架。

# 更新系統並安裝必要工具
apt update && apt upgrade -y
apt install -y git curl wget build-essential nano

# 下載並安裝 Miniconda
mkdir -p ~/miniconda3
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
rm -rf ~/miniconda3/miniconda.sh

# 載入 Conda 基礎環境
source ~/miniconda3/bin/activate

執行完後,你的終端機提示字元前面應該會出現 (base),代表 Conda 已經就緒。

接受 Conda 條款並建立虛擬環境

因為 Anaconda 政策更新,需要先同意服務條款:

conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

然後建立虛擬環境:

conda create -n moss-tts-nano python=3.12 -y
conda activate moss-tts-nano

看到提示字元變成 (moss-tts-nano) 就代表環境切換成功了。


第五步:下載專案與安裝相依套件(關鍵步驟)

這一步的順序很重要,尤其是 pynini 這個套件,必須透過 conda-forge 安裝,否則會因為 C++ 編譯報錯。

# 下載官方專案
git clone https://github.com/OpenMOSS/MOSS-TTS-Nano.git
cd MOSS-TTS-Nano

# 【最重要的一步】透過 conda-forge 安裝 pynini
conda install -c conda-forge pynini=2.1.6.post1 -y

# 安裝 WeTextProcessing
pip install git+https://github.com/WhizZest/WeTextProcessing.git

# 安裝剩餘依賴
pip install -r requirements.txt

# 安裝專案本身(注意最後面有一個小數點)
pip install -e .

💡 小提醒:

  • requirements.txt 會自動下載含 NVIDIA CUDA 的 PyTorch,檔案較大是正常的。沒有 GPU 的話會自動切換為 CPU 模式,不影響功能。
  • 出現 Running pip as the 'root' user 的 WARNING 可以直接忽略,因為運行在獨立 LXC 及 Conda 環境中,十分安全。

第六步:修改綁定 IP(讓區網內其他電腦也能用)

預設情況下,MOSS-TTS-Nano 的 Web 介面只允許在本機(127.0.0.1)連線。如果你想從其他電腦的瀏覽器打開它,需要修改綁定 IP。

編輯啟動檔案:

nano app_onnx.py

用方向鍵捲動到檔案最底部,找到類似這行:

uvicorn.run(app, host="127.0.0.1", port=18083)

把 "127.0.0.1" 改成 "0.0.0.0":

uvicorn.run(app, host="0.0.0.0", port=18083)

按 Ctrl + O、Enter 存檔,然後 Ctrl + X 離開。


第七步:啟動服務!

確認目前處於 (moss-tts-nano) 環境下,執行:

python app_onnx.py

初次啟動

第一次啟動時,程式會自動從 Hugging Face 下載 ONNX 模型檔案到 ./models 目錄。終端機會看起來「卡住」一段時間,請耐心等待,這取決於你的網路速度。

啟動成功

當終端機顯示:

INFO:Uvicornrunningonhttp://0.0.0.0:18083(PressCTRL+Ctoquit)

就代表啟動成功了!在區網內的任何電腦打開瀏覽器,輸入 http://你的容器IP:18083,就能看到 Web 介面了。

第八步:上傳語音檔進行語音克隆

要使用語音克隆功能,你需要準備一段參考音檔:

  1. 音檔格式:wav / mp3 / flac / ogg / m4a 皆可
  2. 建議長度:10 秒到 1 分鐘,語音清晰、背景雜音少
  3. 將音檔上傳到 MOSS-TTS-Nano/voices/ 目錄下
  4. 檔名就是你之後在 Web 介面要使用的 voice name

例如你把音檔命名為 myvoice.wav,在 Web 介面的 voice 欄位就輸入 myvoice。


進階:Bridge API(給 SillyTavern 玩家)

如果你是用 SillyTavern(酒館)做角色扮演,MOSS-TTS-Nano 提供了一個 bridge.py,可以把模型偽裝成 OpenAI TTS 的格式,讓酒館直接調用,不需要額外插件。

Bridge API 的內建功能很強大:

  • OpenAI 格式相容:提供 /v1/audio/speech 端點,酒館原生支援
  • RP 文本清洗:自動過濾 <Time:...> 標籤和 *動作描述*,確保只唸出對白
  • 發音字典矯正:讀取 corrections.txt,用同音字替換修正模型唸錯的字音
  • 自動繁轉簡:用 OpenCC 將繁體轉為簡體,獲得更精準的發音
  • 自動卸載:30 分鐘未使用自動卸載模型,釋放記憶體

啟動 Bridge API

python bridge.py

預設監聽 0.0.0.0:8000。在 SillyTavern 的 TTS 設定中,選擇 OpenAI TTS,填入:

  • API Base URL:http://你的容器IP:8000/v1
  • API Key:任意字串即可(如 moss-tts)
  • Model:moss-tts-nano
  • Voice:你的音檔名稱

發音字典矯正

編輯 corrections.txt,格式為 原詞 = 替換詞:

台部灣落格==tabilwoagn

修改後需要重啟服務才會生效。


第九步:用 Systemd 自動化管理(開機自啟)

每次重開機都要手動輸入一堆指令很麻煩?用 systemd 把它變成系統服務,開機自動啟動,日常維護也更方便。

建立服務檔

nano /etc/systemd/system/moss-tts.service

貼上以下內容(請確認路徑正確):

[Unit]
Description=MOSS-TTS-Nano Bridge API Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/MOSS-TTS-Nano
ExecStart=/root/miniconda3/envs/moss-tts-nano/bin/python bridge.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

啟用服務

# 重新載入系統設定
systemctl daemon-reload

# 啟動服務並設定開機自啟
systemctl enable --now moss-tts.service

日常維護指令

需求指令
查看即時 Logjournalctl -u moss-tts.service -f
查看服務狀態systemctl status moss-tts.service
重啟服務systemctl restart moss-tts.service
停止服務systemctl stop moss-tts.service

💡 小提醒:修改 corrections.txt 後,記得執行 systemctl restart moss-tts.service,新規則才會生效!


常見問題

Q:啟動後終端機顯示「卡住」,是當機了嗎?

不一定。初次啟動時模型下載需要時間,這屬於正常現象。如果下載完成後還是卡住,檢查:

  1. 網路是否能連上 Hugging Face
  2. ./models 目錄是否已存在模型檔案

Q:沒有 GPU,語音合成速度會很慢嗎?

4 核心 CPU 的串流速度大約在可接受範圍。如果需要更快的速度,可以考慮提升 CPU 核心數,或者換用 GPU 版本。

Q:Web 介面從其他電腦打不開?

確認你已經修改了 app_onnx.py 中的 host 為 "0.0.0.0",並且防火牆沒有阻擋對應的 port。

Q:模型唸某個字音唸錯了怎麼辦?

使用 corrections.txt 發音字典功能,把發音錯誤的字用同音字替換。例如:

神經質=神經質

Q:記憶體不夠用怎麼辦?

MOSS-TTS-Nano 的 30 分鐘自動卸載機制會幫你釋放記憶體。如果還是覺得不夠,可以減少其他容器的資源分配,或者增加 LXC 容器的記憶體限制。


總結

透過這篇文章,我們完成了:

  1. ✅ 在 PVE LXC 中建立 Ubuntu 環境
  2. ✅ 安裝 SSH 和 Samba 方便管理
  3. ✅ 設定時區和中文語系
  4. ✅ 用 Conda 建立 Python 3.12 虛擬環境
  5. ✅ 安裝 MOSS-TTS-Nano 及其相依套件
  6. ✅ 修改綁定 IP 讓區網內其他電腦可訪問
  7. ✅ 啟動 Web 介面並上傳語音檔
  8. ✅ 設定 Bridge API 給 SillyTavern 使用
  9. ✅ 用 systemd 實現開機自啟和自動化維護

整個流程不需要 GPU,4 核心 CPU + 4GB 記憶體就能跑起來。如果你剛好有一台閒置的 PVE 伺服器,現在就可以動手試試看了!

有任何問題歡迎留言討論。祝語音克隆愉快 🎙️