应用场景与解决方案

短视频 AI 配音教程:在自己的服务器上用 Kokoro 文字转语音,生成中文、英语、日语等配音

6 个步骤 12 分钟阅读 12 次阅读 0
本文目录

发布到 TikTok、Reels、YouTube Shorts 和电商平台商品页的短视频都需要配音,而每条文案都自己录音非常耗时。在线文字转语音服务按字符收费,还需要把文案上传到对方平台。Kokoro 是一款开放权重的语音合成模型,音色自然,体积小巧,普通的 CPU 服务器就能运行。本文介绍如何安装 Kokoro、挑选音色、把文案文件转换成 WAV 配音和时间轴一致的 SRT 字幕、处理中文配音中夹杂的英文单词,以及把音频处理成适合上传的格式。

包括 TikTok 和 YouTube 在内的许多平台都要求创作者对逼真的 AI 生成内容或合成内容进行标注,请遵守各平台的最新规定。本文使用的是 Kokoro 自带的音色;未经本人同意,切勿模仿真人的声音。

步骤 1:安装 Kokoro

# 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 自动下载。

步骤 2:选择语言和音色

代码语言音色示例
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 不支持韩语、俄语、泰语、越南语和马来语;面向这些市场时,请使用字幕或其他语音合成引擎。

步骤 3:创建配音脚本

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 文件。语言、音色、语速以及每行之间的停顿时长都通过环境变量设置。

步骤 4:生成第一条配音

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 等拉丁字母单词时会跳过或读错。对于这类句子,先写字幕文字,再写 | 和要朗读的文字,如上面第二行所示:字幕显示正确的产品名称,配音则按谐音读出。日语中的品牌名称也可以用同样的方法处理(在 | 后面用片假名书写)。

步骤 5:找到合适的音色和语速

# 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 文件下载下来,用手机试听,因为大多数观众都是用手机收听的。在自然停顿处加逗号的短句,听起来远比冗长复杂的句子自然。

步骤 6:处理音频以便上传

# 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 将视频翻译配音成其他语言。

常见问题

在 CPU 服务器上速度如何?

Kokoro 是一个小模型。在现代多核服务器上,它生成语音的速度通常快于实时播放,因此模型加载完成后,一分钟的配音用不了一分钟就能生成。具体速度取决于 CPU 和文本长度。

可以克隆自己的声音吗?

Kokoro 只提供内置音色。声音克隆需要使用其他模型,通常还需要 GPU。只有在说话人明确同意的情况下才能克隆其声音,并请遵守各平台关于合成内容的规定。

这些音色可以商用吗?

截至本文撰写时,Kokoro 的代码和模型均以 Apache 2.0 许可证发布,允许商业使用。正式使用前请到项目页面确认最新的许可证,并遵守各平台关于 AI 生成内容的规定。

英文文本报 espeak-ng 错误

英语和其他几种语言会用 espeak-ng 处理词典中没有的单词。请确认已安装步骤 1 中的 espeak-ng 软件包,然后重新运行脚本。

如果按以上步骤操作后问题仍未解决,请提交工单联系 IMIDC 7×24 技术支持,并附上服务器 IP、系统版本和 Python 版本、执行过的命令以及完整报错信息,方便工程师快速定位。

这篇文章有帮助吗?

相关教程