釋出到 TikTok、Reels、YouTube Shorts 和電商平台商品頁的短影片都需要配音,而每條文案都自己錄音非常耗時。線上文字轉語音服務按字元收費,還需要把文案上傳到對方平台。Kokoro 是一款開放權重的語音合成模型,音色自然,體積小巧,普通的 CPU 伺服器就能執行。本文介紹如何安裝 Kokoro、挑選音色、把文案檔案轉換成 WAV 配音和時間軸一致的 SRT 字幕、處理中文配音中夾雜的英文單詞,以及把音訊處理成適合上傳的格式。
# Debian 12 / Ubuntu 22.04 or 24.04 (Kokoro needs Python 3.10 to 3.12)
apt install -y python3-venv espeak-ng ffmpeg
python3 -m venv /opt/tts
/opt/tts/bin/pip install --upgrade pip
/opt/tts/bin/pip install torch --index-url https://download.pytorch.org/whl/cpu # CPU-only build, much smaller
/opt/tts/bin/pip install kokoro soundfile "misaki[zh]"
# Japanese voices additionally need:
/opt/tts/bin/pip install "misaki[ja]"
/opt/tts/bin/python -m unidic download # Japanese dictionary, about 500 MB
如果系統自帶的 Python 是 3.13 或更高版本(例如 Debian 13),請改用 uv 建立 Python 3.12 的虛擬環境;--seed 引數會同時裝好 pip,因此後續命令都無需改動:
curl -LsSf https://astral.sh/uv/install.sh | sh
~/.local/bin/uv venv --seed -p 3.12 /opt/tts
/opt/tts/bin/pip install torch --index-url https://download.pytorch.org/whl/cpu
/opt/tts/bin/pip install kokoro soundfile "misaki[zh]"
模型(約 330 MB)和各個音色會在首次使用時從 Hugging Face 自動下載。
| 程式碼 | 語言 | 音色示例 |
|---|---|---|
| a | 美式英語 | af_heart, af_bella, am_michael, am_adam |
| b | 英式英語 | bf_emma, bf_isabella, bm_george, bm_daniel |
| z | 中文普通話 | zf_xiaobei, zf_xiaoni, zm_yunxi, zm_yunjian |
| j | 日語 | jf_alpha, jf_nezumi, jm_kumo |
| e | 西班牙語 | ef_dora, em_alex |
| f | 法語 | ff_siwis |
| i | 義大利語 | if_sara, im_nicola |
| p | 巴西葡萄牙語 | pf_dora, pm_alex |
| h | 印地語 | hf_alpha, hm_omega |
音色名稱的第一個字母代表語言,第二個字母代表女聲(f)或男聲(m)。Kokoro 不支援韓語、俄語、泰語、越南語和馬來語;面向這些市場時,請使用字幕或其他語音合成引擎。
cat > /opt/tts/tts.py <<'EOF2'
import os, sys
import numpy as np
import soundfile as sf
from kokoro import KPipeline
LANG = os.environ.get("TTS_LANG", "a") # a = US English, z = Mandarin Chinese, j = Japanese ...
VOICE = os.environ.get("TTS_VOICE", "af_heart")
SPEED = float(os.environ.get("TTS_SPEED", "1.0"))
PAUSE = float(os.environ.get("TTS_PAUSE", "0.3")) # seconds of silence after each line
RATE = 24000
def ts(t):
ms = int(round(t * 1000))
h, ms = divmod(ms, 3600000)
m, ms = divmod(ms, 60000)
s, ms = divmod(ms, 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
pipeline = KPipeline(lang_code=LANG, repo_id="hexgrad/Kokoro-82M")
for path in sys.argv[1:]:
lines = [l.strip() for l in open(path, encoding="utf-8") if l.strip()]
parts, srt, pos = [], [], 0
for i, line in enumerate(lines, 1):
show, _, say = line.partition("|") # "subtitle text|text to speak" (optional)
chunks = [np.asarray(a, dtype=np.float32) for _, _, a in pipeline(say or show, voice=VOICE, speed=SPEED)]
audio = np.concatenate(chunks) if chunks else np.zeros(RATE // 2, dtype=np.float32)
srt.append(f"{i}\n{ts(pos / RATE)} --> {ts((pos + len(audio)) / RATE)}\n{show.strip()}\n")
silence = np.zeros(int(PAUSE * RATE), dtype=np.float32)
parts += [audio, silence]
pos += len(audio) + len(silence)
base = os.path.splitext(path)[0]
sf.write(base + ".wav", np.concatenate(parts), RATE)
with open(base + ".srt", "w", encoding="utf-8") as f:
f.write("\n".join(srt))
print(f"{path}: {len(lines)} lines, {pos / RATE:.1f}s -> {base}.wav, {base}.srt", flush=True)
EOF2
文本檔案中的每一行對應一句配音和一條字幕。指令碼會在文本檔案旁邊生成一個 WAV 檔案和一個時間軸完全對應的 SRT 檔案。語言、音色、語速以及每行之間的停頓時長都通過環境變數設定。
mkdir -p /data/voice && cd /data/voice
cat > demo.txt <<'EOF2'
這款竹製筆記本支架有六檔高度可調。
支援 USB-C 介面和 iPhone。|支援 優艾斯比西 介面和愛瘋。
摺疊後可以放進背包,重量只有一點一公斤。
EOF2
TTS_LANG=z TTS_VOICE=zf_xiaobei /opt/tts/bin/python /opt/tts/tts.py demo.txt
# English: TTS_LANG=a TTS_VOICE=af_heart Japanese: TTS_LANG=j TTS_VOICE=jf_alpha
在我們的測試中,中文音色能正確朗讀 39.9、2026 這樣的數字,但遇到 USB-C、iPhone 等拉丁字母單詞時會跳過或讀錯。對於這類句子,先寫字幕文字,再寫 | 和要朗讀的文字,如上面第二行所示:字幕顯示正確的產品名稱,配音則按諧音讀出。日語中的品牌名稱也可以用同樣的方法處理(在 | 後面用片假名書寫)。
# Render the same text with several voices to compare them
for v in zf_xiaobei zf_xiaoni zm_yunxi zm_yunjian; do
cp demo.txt "try-$v.txt"
TTS_LANG=z TTS_VOICE=$v /opt/tts/bin/python /opt/tts/tts.py "try-$v.txt"
done
# Slightly faster speech and shorter pauses, typical for short videos
TTS_LANG=z TTS_VOICE=zm_yunxi TTS_SPEED=1.1 TTS_PAUSE=0.2 /opt/tts/bin/python /opt/tts/tts.py demo.txt
把 WAV 檔案下載下來,用手機試聽,因為大多數觀眾都是用手機收聽的。在自然停頓處加逗號的短句,聽起來遠比冗長複雜的句子自然。
# Normalise loudness to about -14 LUFS (common for short-video platforms) and make an MP3
ffmpeg -i demo.wav -af loudnorm=I=-14:TP=-1.5 -ar 48000 -ac 2 demo-final.wav
ffmpeg -i demo-final.wav -c:a libmp3lame -q:a 2 demo.mp3
把音訊和 demo.srt 匯入影片剪輯軟體,或者按照自動生成商品短影片一文的方法,用指令碼把圖片、配音和字幕直接合成完整影片。如果要把現有影片轉換成其他語言,請參閱用 AI 將影片翻譯配音成其他語言。
Kokoro 是一個小模型。在現代多核伺服器上,它生成語音的速度通常快於即時播放,因此模型載入完成後,一分鐘的配音用不了一分鐘就能生成。具體速度取決於 CPU 和文本長度。
Kokoro 只提供內建音色。聲音克隆需要使用其他模型,通常還需要 GPU。只有在說話人明確同意的情況下才能克隆其聲音,並請遵守各平台關於合成內容的規定。
截至本文撰寫時,Kokoro 的程式碼和模型均以 Apache 2.0 許可證釋出,允許商業使用。正式使用前請到專案頁面確認最新的許可證,並遵守各平台關於 AI 生成內容的規定。
英語和其他幾種語言會用 espeak-ng 處理詞典中沒有的單詞。請確認已安裝步驟 1 中的 espeak-ng 軟體包,然後重新執行指令碼。
如果按以上步驟操作後問題仍未解決,請提交工單聯絡 IMIDC 7×24 技術支援,並附上伺服器 IP、系統版本和 Python 版本、執行過的命令以及完整報錯資訊,方便工程師快速定位。