最近 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 LTS24.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 + OEnter 存檔,然後 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 伺服器,現在就可以動手試試看了!

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