如何本地部署轻量级TTS新选择Kokoro-82M?
摘要:对于个人开发者和小型团队来说,一个理想的TTS方案应该满足三个条件:轻量到能在CPU上跑、免费可商用、效果足够自然。
一、前言
你是否遇到过这样的场景:想给项目添加语音合成功能,却被各种问题困扰——要么模型太大动辄几GB,要么必须依赖GPU云端API,要么商用授权一团糟。
对于个人开发者和小型团队来说,一个理想的TTS方案应该满足三个条件:轻量到能在CPU上跑、免费可商用、效果足够自然。
今天要介绍的 Kokoro-82M,就是这样一款满足所有条件的神器。它只有82M参数,却能输出相当自然的中文语音;体积小巧到只需几百MB,却支持8种不同音色。更重要的是——它完全开源,Apache 2.0许可,零成本商用。
二、方案介绍
概念
定义
Kokoro-82M
由 hexgrad 开发的轻量级TTS模型,仅82M参数,支持8种中文音色
ONNX优化
模型经过ONNX优化,可在CPU上高效推理,无需GPU
语音管道(Pipeline)
Kokoro 的核心API,负责分词、音素转换、语音合成全流程
音色(Voice)
预训练的音色模型,不同音色适合不同场景
为什么选择 Kokoro?
指标
数值
参数规模
82M
模型大小
~165MB
输出采样率
24kHz
支持语言
中文、英语、日语、韩语等8种
中文音色数
8种(4女4男)
推理设备
CPU / GPU
许可协议
Apache 2.0
对比同级别模型,Kokoro 在中文场景下表现尤为突出——不仅音色自然,而且对中文多音字的处理也相当不错。对于没有GPU的个人开发者来说,这可能是目前最优的中文TTS本地方案。
先实际听一下用kokoro合成的音频
我用kokoro生成了一下奥德元的口号:关注我的公众号:奥德元,一起学习 A I,一起追赶时代。,一个男声,一个女声,大家可以实际听下、感受一下合成的语音的效果。
男声: zm_yunyang: kokoro_zm_yunyang.wav
女声: zf_xiaoxiao:kokoro_zf_xiaoxiao.wav
如果这个声音的效果满意的话,请继续往下看,如果觉得声音不行,就没必要再往下看了。
三、安装与使用
环境要求
Python 3.9 - 3.12
至少 2GB 可用磁盘空间(模型下载)
推荐 4GB+ 内存
安装步骤
第一步:安装 Kokoro 主包
pip install kokoro
第二步:安装中文语音库
pip install misaki[zh]
misaki 是 Kokoro 的中文分词器和音素转换器,必须安装才能处理中文文本。
第三步:下载中文模型权重
首次使用需要从 HuggingFace 下载模型:
# 安装 huggingface-cli(如未安装)
pip install huggingface-hub
# 下载中文模型(约165MB)
huggingface-cli download hexgrad/Kokoro-82M-v1.1-zh --local-dir ./kokoro-zh
或者直接在Python代码中自动下载:
from kokoro import KPipeline
# 首次运行时会自动下载模型
pipeline = KPipeline(lang_code='zh')
完整使用示例
from kokoro import KPipeline
import soundfile as sf
import numpy as np
import torch
def test():
# 初始化中文管线
pipeline = KPipeline(lang_code='z')
# 生成语音
text = "关注我的公众号:奥德元,一起学习 A I,一起追赶时代。"
generator = pipeline(text, voice='zm_yunyang')
# 获取生成结果 (这是一个 KPipeline.Result 对象)
result = next(generator)
# --- 核心修改:正确提取音频数据 ---
# 1. 访问 result.output.audio 获取 tensor
# 根据日志: result.output 是 KModel.Output 对象,里面有个 audio 属性是 tensor
audio_tensor = result.output.audio
# 2. 将 PyTorch Tensor 转换为 NumPy 数组
# .detach() 移除梯度追踪,.cpu() 确保在CPU内存中,.numpy() 转为 numpy
audio_numpy = audio_tensor.detach().cpu().numpy()
# 3. 处理维度
# soundfile 需要 (样本数, 通道数) 的二维数组。
# Kokoro 输出的通常是 (样本数,) 的一维数组,我们需要变成 (样本数, 1)
if audio_numpy.ndim == 1:
audio_numpy = audio_numpy.reshape(-1, 1)
# 4. 获取采样率
# Kokoro 的标准采样率通常是 24000,也可以检查是否有属性直接提供
sample_rate = 24000
# 5. 写入文件
sf.write('output.wav', audio_numpy, sample_rate)
print(f"音频保存成功!")
print(f"音频形状: {audio_numpy.shape}")
print(f"采样率: {sample_rate}")
print(f"文本内容: {result.graphemes}")
if __name__ == '__main__':
test()
八种音色一览
音色 ID
性别
风格
推荐场景
zf_xiaobei
女声
温柔甜美
有声书、客服
zf_xiaoni
女声
清亮活泼
短视频配音
zf_xiaoxiao
女声
成熟稳重
新闻播报
zf_xiaoyi
女声
专业正式
教程讲解
zm_yunjian
男声
青春活力
游戏角色
zm_yunxi
男声
温柔细腻
有声小说
zm_yunxia
男声
成熟稳重
企业宣传
zm_yunyang
男声
浑厚有力
纪录片旁白
四、使用场景与案例
场景一:自动化语音播报
需求:树莓派上运行语音助手,需要本地TTS,不依赖网络
方案:Kokoro-82M + Python + 定时任务
# 定时天气播报示例
from kokoro import KPipeline
import soundfile as sf
pipeline = KPipeline(lang_code='zh')
def speak_weather():
text = "今天天气晴转多云,最高温度25度,最低温度18度。"
generator = pipeline(text, voice='zf_xiaoyi')
for i, (audio, _) in enumerate(generator):
sf.write("weather.wav", audio, 24000)
# 播放音频(使用 pygame 或其他播放器)
# ...
speak_weather()
场景二:批量有声书生成
需求:将小说TXT文件批量转换为语音章节
方案:分章节处理 + 多音色可选
from kokoro import KPipeline
import soundfile as sf
import os
pipeline = KPipeline(lang_code='zh')
def generate_audiobook(text_file, output_dir, voice='zf_xiaoxiao'):
os.makedirs(output_dir, exist_ok=True)
with open(text_file, 'r', encoding='utf-8') as f:
text = f.read()
# 按段落分批处理,避免单次输入过长
paragraphs = text.split('\n')
for i, para in enumerate(paragraphs):
if not para.strip():
continue
generator = pipeline(para, voice=voice)
for j, (audio, _) in enumerate(generator):
sf.write(f"{output_dir}/chapter_{i:03d}_{j}.wav", audio, 24000)
print(f"已处理段落 {i+1}/{len(paragraphs)}")
# 使用
generate_audiobook('novel.txt', 'audiobook_output', voice='zf_xiaoxiao')
场景三:多语言应用集成
Kokoro 支持多种语言,一个模型满足多语言需求:
# 中文
pipeline_zh = KPipeline(lang_code='zh')
generator_zh = pipeline_zh("你好世界", voice='zf_xiaoxiao')
# 日语
pipeline_ja = KPipeline(lang_code='ja')
generator_ja = pipeline_ja("こんにちは世界", voice='af_sarah')
# 英语
pipeline_en = KPipeline(lang_code='en')
generator_en = pipeline_en("Hello world", voice='af_sarah')
五、拿走即用
一行命令安装
pip install kokoro misaki[zh]
快速开始
from kokoro import KPipeline
import soundfile as sf
pipeline = KPipeline(lang_code='zh')
generator = pipeline("你好,我是Kokoro!", voice='zf_xiaoxiao')
for i, (audio, _) in enumerate(generator):
sf.write(f"hello_{i}.wav", audio, 24000)
相关资源
资源
链接
GitHub 仓库
https://github.com/hexgrad/kokoro
中文模型
https://huggingface.co/hexgrad/Kokoro-82M-v1.1-zh
在线体验
https://kokoroweb.app
Python 包
https://pypi.org/project/kokoro
六、注意事项
首次下载:模型权重约165MB,确保网络稳定。如果下载慢,可以尝试使用国内镜像源。
内存占用:虽然可以在CPU上运行,但建议至少有4GB可用内存。处理长文本时分批处理可以避免内存溢出。
音频后处理:Kokoro 输出24kHz WAV格式,如需其他格式(如16kHz用于语音识别),可用 ffmpeg 转换:
ffmpeg -i input.wav -ar 16000 output_16k.wav
多音字处理:中文多音字处理依赖 misaki 库,对于一些专业术语可能出现发音错误,可用拼音标注修正:
# 使用 phonemes 参数手动指定发音
generator = pipeline(text, voice='zf_xiaoxiao', phonemes=None)
批量生产建议:正式项目中使用时,建议:
预处理文本(去除特殊字符、统一标点)
分章节保存音频
添加音量归一化处理
七、预告:下一期
下一期我们将介绍另一款热门TTS模型——MeloTTS。
MeloTTS 是由 MIT 和 MyShell.ai 联合开发的高质量多语言TTS库,支持英语、中文、日语、韩语等多种语言,最大的特点是CPU实时推理能力强,且支持中英混合文本。
敬请期待!
八、广而告之
关注我的公众号:奥德元
一起学习AI,一起追赶时代!
新建了一个AI技术交流群,欢迎大家一起加入讨论。
扫码加入AI技术交流群(微信)
若需联系作者,请加微信:oddmeta
