轻量级本地 TTS Kokoro-82M 完整部署教程

2026/7/30·2 views

一、方案简介

Kokoro-82M 是 hexgrad 开源的纯CPU可运行轻量级语音合成模型,完美适配个人开发者、小型团队离线语音需求:

核心优势

  1. 超轻量:仅82M参数,模型文件165MB,普通笔记本/树莓派均可运行,无需GPU
  2. 商用免费:Apache 2.0开源协议,无版权费用,可商用
  3. 中文优化:内置8种中文音色(4男4女),多音字识别准确,24kHz高清采样
  4. 离线本地:全程不依赖云端API,隐私可控
  5. 多语言支持:中、英、日、韩等8种语言一键切换

8种中文音色对照表

音色ID 性别 音色风格 适用场景
zf_xiaobei 温柔甜美 有声书、客服语音
zf_xiaoni 清亮活泼 短视频、短视频配音
zf_xiaoxiao 成熟稳重 新闻播报、旁白
zf_xiaoyi 专业正式 教程、教学讲解
zm_yunjian 青春活力 游戏NPC、年轻解说
zm_yunxi 温柔细腻 有声小说、情感朗读
zm_yunxia 成熟稳重 企业宣传片
zm_yunyang 浑厚有力 纪录片、广播旁白

二、硬件&环境前置要求

硬件最低配置

  • 磁盘:≥2GB空闲空间(模型+依赖库)
  • 内存:推荐4GB以上,2GB可勉强运行(长文本易内存溢出)
  • 处理器:普通x86/ARM(树莓派4B及以上均可)

软件环境

  • Python 3.9 ~ 3.12(不支持3.13+高版本)
  • Windows/Linux/MacOS 全平台兼容

三、分步安装教程

步骤1:创建虚拟环境(推荐,避免依赖冲突)

bash 复制代码
# 创建虚拟环境
python -m venv kokoro-env

# Windows激活环境
kokoro-env\Scripts\activate
# Linux/Mac激活环境
source kokoro-env/bin/activate

步骤2:一键安装核心依赖

bash 复制代码
# 主模型包 + 中文分词音素库(必装)
pip install kokoro misaki[zh] soundfile
  • kokoro:TTS合成核心管线
  • misaki[zh]:中文专用分词、多音字、音素转换引擎(无此库无法处理中文)
  • soundfile:用于导出wav音频文件

步骤3:模型权重下载(两种方式任选其一)

方式A:代码自动下载(最简单,新手推荐)

运行代码初始化管线时,会自动从HuggingFace下载165MB中文模型,无需手动操作。

方式B:命令行手动下载(网络较差时使用)

bash 复制代码
# 安装下载工具
pip install huggingface-hub
# 拉取中文模型到本地文件夹
huggingface-cli download hexgrad/Kokoro-82M-v1.1-zh --local-dir ./kokoro-zh

国内下载慢解决方案:配置hf镜像 export HF_ENDPOINT=https://hf-mirror.com(Linux/Mac)

四、基础运行代码(复制即用)

示例1:最简快速生成音频

python 复制代码
from kokoro import KPipeline
import soundfile as sf

# 初始化中文管线 lang_code='z'=中文
pipeline = KPipeline(lang_code='zh')

# 待合成文本
text = "关注公众号奥德元,一起学习AI,一起追赶时代。"
# 选择音色 zm_yunyang浑厚男声 / zf_xiaoxiao成熟女声
generator = pipeline(text, voice="zm_yunyang")

# 遍历生成分段音频并保存
for idx, (grapheme, phoneme, audio_data) in enumerate(generator):
    sf.write(f"output_{idx}.wav", audio_data, 24000)
print("语音合成完成,文件已保存!")

示例2:完整标准测试代码(适配所有版本,修复张量维度问题)

python 复制代码
from kokoro import KPipeline
import soundfile as sf
import numpy as np
import torch

def tts_test():
    # 初始化中文管道
    pipeline = KPipeline(lang_code='zh')
    text = "今天天气晴转多云,最高25度,最低18度,适合出门。"
    generator = pipeline(text, voice='zf_xiaoyi')
    result = next(generator)
    
    # 提取音频张量并转换格式
    audio_tensor = result.output.audio
    audio_numpy = audio_tensor.detach().cpu().numpy()
    
    # 统一维度适配soundfile
    if audio_numpy.ndim == 1:
        audio_numpy = audio_numpy.reshape(-1, 1)
    
    sample_rate = 24000
    sf.write("weather.wav", audio_numpy, sample_rate)
    
    print(f"音频保存成功!采样率:{sample_rate}Hz")
    print(f"文本:{result.graphemes}")

if __name__ == "__main__":
    tts_test()

五、实战场景完整代码

场景1:树莓派定时本地天气播报(无网络依赖)

python 复制代码
from kokoro import KPipeline
import soundfile as sf
import os

pipeline = KPipeline(lang_code='zh')

def speak_weather():
    text = "今日天气晴转多云,最高温度25度,最低温度18度,微风。"
    gen = pipeline(text, voice='zf_xiaoyi')
    for _, _, audio in gen:
        sf.write("weather_notice.wav", audio, 24000)
    # Linux播放音频
    os.system("aplay weather_notice.wav")

speak_weather()

场景2:批量TXT小说转有声书

python 复制代码
from kokoro import KPipeline
import soundfile as sf
import os

pipeline = KPipeline(lang_code='zh')

def generate_audiobook(txt_path, out_dir, voice="zf_xiaoxiao"):
    os.makedirs(out_dir, exist_ok=True)
    with open(txt_path, "r", encoding="utf-8") as f:
        full_text = f.read()
    # 按段落拆分,防止长文本内存溢出
    paragraphs = full_text.split("\n")
    for p_idx, para in enumerate(paragraphs):
        if not para.strip():
            continue
        gen = pipeline(para, voice=voice)
        for seg_idx, (_, _, audio) in enumerate(gen):
            save_path = f"{out_dir}/chapter_{p_idx:03d}_{seg_idx}.wav"
            sf.write(save_path, audio, 24000)
        print(f"已完成段落 {p_idx+1}/{len(paragraphs)}")

# 调用,将novel.txt批量转为音频
generate_audiobook("novel.txt", "audio_book_output")

场景3:中英日多语言切换示例

python 复制代码
# 中文
zh_pipe = KPipeline(lang_code="zh")
zh_audio = zh_pipe("你好,世界", voice="zf_xiaoxiao")

# 英语
en_pipe = KPipeline(lang_code="en")
en_audio = en_pipe("Hello World", voice="af_sarah")

# 日语(需额外安装misaki[ja])
# pip install misaki[ja]
ja_pipe = KPipeline(lang_code="ja")
ja_audio = ja_pipe("こんにちは世界", voice="jf_sarah")

六、关键注意事项&排坑指南

  1. 模型首次下载慢
    配置HuggingFace国内镜像加速:
    bash 复制代码
    # Windows cmd
    set HF_ENDPOINT=https://hf-mirror.com
    # Linux/Mac
    export HF_ENDPOINT=https://hf-mirror.com
  2. 内存溢出(长文本)
    不要一次性传入上万字文本,必须按段落、句子拆分分批合成。
  3. 音频格式转换
    原生输出24kHz wav,如需16kHz/MP3可用ffmpeg转换:
    bash 复制代码
    # wav转16kHz
    ffmpeg -i input.wav -ar 16000 output_16k.wav
    # wav转mp3
    ffmpeg -i input.wav output.mp3
  4. 多音字发音错误
    专业词汇多音字异常时,可手动传入phonemes参数强制指定发音修正。
  5. Linux缺失espeak-ng警告
    执行安装:sudo apt install espeak-ng
  6. Windows找不到库报错
    手动下载espeak-ng,配置系统环境变量指向dll文件。

七、官方资源汇总

资源 访问地址
GitHub源码 https://github.com/hexgrad/kokoro
中文模型权重 https://huggingface.co/hexgrad/Kokoro-82M-v1.1-zh
在线试听网页 https://kokoroweb.app
PyPI包 https://pypi.org/project/kokoro

八、生产环境优化建议

  1. 文本预处理:过滤特殊符号、统一中英文标点,减少合成异常
  2. 音频归一化:使用librosa统一音量,避免段落音量忽大忽小
  3. 缓存管线:全局仅初始化一次KPipeline,不要循环重复加载(大幅提速)
  4. 封装API:搭配FastAPI搭建本地TTS接口,供其他程序调用
  5. 嵌入式部署:树莓派部署时使用swap分区,缓解内存不足问题

商用&版权说明

Kokoro-82M 采用 Apache 2.0 协议,个人/企业均可免费商用,无需付费、无调用次数限制,本地离线部署不存在数据上传隐私风险。

快来和小猫聊天吧~