MOSS-TTS-Nano 本地语音合成模型安装与部署

🚨 重要结论:NPU 加速不可行

经过完整实测,MOSS-TTS-Nano 的 ONNX 模型无法转换为 RKNN 格式,不能在 RK3588 NPU 上加速推理。

原因: - Audio Tokenizer 模型含动态输入维度(waveform_length),NPU 不支持 - TTS 核心模型含字符串操作(dtype <U21),NPU 只能处理数值张量

替代方案:Piper TTS(嵌入式专用,C++ 单二进制)或 Sherpa-ONNX TTS(有 RK3588 适配)

以下为安装部署全流程实录,包含 8 个踩坑记录,供参考。


📌 关键要点

MOSS-TTS-Nano 是上海创智学院(MOSI.AI)与复旦大学 OpenMOSS 团队开源的超轻量级多语言 TTS 模型,仅 0.1B 参数,支持 20 种语言、声音克隆、流式推理,可在 CPU 上运行。


项目概况

什么是 MOSS-TTS-Nano?

MOSS-TTS 家族
├── MOSS-TTS (8B)          - 旗舰模型,高保真零样本声音克隆
├── MOSS-TTS-Local (1.7B)  - 轻量版
├── MOSS-TTSD (8B)         - 多说话人对话
├── MOSS-TTS-Nano (0.1B)   - 超轻量版,CPU 可跑  ← 本文重点
├── MOSS-VoiceGenerator      - 声音设计
├── MOSS-SoundEffect          - 音效生成
└── MOSS-TTS-Realtime         - 实时低延迟

核心特性

特性 说明
参数规模 0.1B(仅 1 亿参数)
音频格式 48kHz 双声道
支持语言 20 种(中/英/日/韩/法/德等)
架构 Audio Tokenizer + LLM 纯自回归
流式推理 支持,低延迟首音输出
CPU 友好 4 核 CPU 即可流式生成
声音克隆 参考音频 + 文本即可克隆

Windows 安装全流程

第一步:创建 Conda 环境

conda create -n moss-tts-nano python=3.12 -y
conda activate moss-tts-nano

第二步:克隆代码

git clone https://github.com/OpenMOSS/MOSS-TTS-Nano.git
cd MOSS-TTS-Nano

第三步:安装依赖

pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install -e .

依赖清单(requirements.txt):

包 说明
torch==2.7.0 PyTorch 推理引擎
torchaudio==2.7.0 音频处理
transformers==4.57.1 HuggingFace 模型加载
fastapi + uvicorn Web Demo 服务
onnxruntime>=1.20.0 ONNX CPU 推理
sentencepiece 分词器
soundfile 音频读写
WeTextProcessing 文本规范化(可选)

第四步:下载模型

首次运行会自动从 HuggingFace 下载模型。如果网络不通,可手动下载:

PyTorch 版模型(app.py 使用): - MOSS-TTS-Nano (~235MB) - MOSS-Audio-Tokenizer-Nano (~88MB)

ONNX 版模型(app_onnx.py 使用): - MOSS-TTS-Nano-100M-ONNX (~670MB) - MOSS-Audio-Tokenizer-Nano-ONNX (~89MB)


运行方式

方式一:命令行推理(infer.py)

python infer.py ^
    --checkpoint d:\BYP\Project\Edge\models\huggingface\moss-tts\MOSS-TTS-Nano ^
    --audio-tokenizer-pretrained-name-or-path d:\BYP\Project\Edge\models\huggingface\moss-tts\MOSS-Audio-Tokenizer-Nano ^
    --mode continuation ^
    --text "你好,我是海小星。" ^
    --disable-wetext-processing

输出:generated_audio/infer_output.wav

方式二:Web Demo(app.py)

python app.py

访问 http://localhost:18083 ,支持音色选择、声音克隆、文字输入。

方式三:ONNX Web Demo(app_onnx.py)— 推荐

python app_onnx.py

ONNX 版无需 PyTorch,推理速度约为 PyTorch 版的 2 倍。


安装踩坑实录

坑1:Windows 长路径错误

现象:

FileNotFoundError: [WinError 3] 系统找不到指定的路径。
D:\hf_cache\modules\transformers_modules\OpenMOSS_hyphen_Team\...

原因:HuggingFace 动态模块缓存路径超过 Windows 260 字符限制。

解决:开启 Windows 长路径支持(需管理员权限 + 重启):

reg add "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" /v LongPathsEnabled /t REG_DWORD /d 1 /f

坑2:WeTextProcessing 安装失败

现象:No module named 'tn'

原因:pynini 在 Windows 上编译困难,导致 WeTextProcessing 无法安装。

解决:跳过文本规范化,不影响核心 TTS 功能。修改 text_normalization_pipeline.py:

def normalize(self, *, text, prompt_text, language):
    snapshot = self.ensure_ready()
    if not snapshot.ready:
        # 跳过规范化,直接返回原文本
        logging.warning("WeTextProcessing unavailable, skipping")
        return text, prompt_text
    # ... 原有逻辑

坑3:模型下载超时

现象:首次启动从 HuggingFace 下载模型超时。

解决:修改 defaults.py 指向本地已下载路径:

DEFAULT_CHECKPOINT_PATH = "d:/BYP/Project/Edge/models/huggingface/moss-tts/MOSS-TTS-Nano"
DEFAULT_AUDIO_TOKENIZER_PATH = "d:/BYP/Project/Edge/models/huggingface/moss-tts/MOSS-Audio-Tokenizer-Nano"

坑4:ONNX 版同样报 tn 模块缺失

现象:app_onnx.py 启动时 warmup 失败。

解决:修改 app.py 的 warmup 逻辑,logging.warning 替代 raise RuntimeError,warmup 失败不阻塞启动。


声音克隆实践

录制参考音频

添加自定义音色

编辑 assets/demo.jsonl,添加一行:

{"name": "🎤 平哥", "role": "assets/audio/平哥_202609009.wav", "text": "嗨,你好!我是平哥。有什么需要帮忙的,尽管说,别客气。"}

重启服务后即可在 Web Demo 中选择该音色。

系统音色配置

音色文件位于 assets/demo.jsonl,每行一个 JSON 对象:

字段 说明
name 显示名称
role 参考音频路径
text 参考音频对应的文本内容

推理速度实测

Windows CPU 环境

运行方式 短句耗时 说明
PyTorch (app.py) 5-10 秒 首次加载模型较慢
ONNX (app_onnx.py) 3-5 秒 约为 PyTorch 的 2 倍
限制 max_new_frames=150 2-3 秒 牺牲输出长度换速度

速度瓶颈分析

语音对话延迟链路:
用户说话 → ASR识别 → LLM生成 → TTS合成
  ~1s       ~0.5s      ~1s       ~5s ❌
                                    ↑
                              TTS 是瓶颈!
实时对话要求总延迟 < 3秒

加速方案对比

方案 预期速度 可行性
ONNX CPU 2-3 倍提升 ✅ 已验证
NVIDIA GPU (CUDA) 5-10 倍提升 需要显卡
香橙派 NPU (RK3588) < 1 秒 目标方案
流式合成 感知延迟降低 已支持

香橙派 NPU 部署方案

部署架构

香橙派 Orange Pi 5/5B (RK3588S/5B)
├── CPU: 8核 ARM (4×A76 + 4×A55)
├── NPU: 6 TOPS (RKNN)
├── RAM: 8/16/32GB
└── OS: Ubuntu 22.04 / Debian

MOSS-TTS-Nano 部署:
ONNX 模型 → RKNN 转换 → NPU 加速推理

部署步骤

1. 准备香橙派环境

# 系统更新
sudo apt update && sudo apt upgrade -y

# 安装 Python 3.12
sudo apt install python3.12 python3.12-venv python3-pip -y

# 安装 RKNN Toolkit2(NPU 推理框架)
pip3 install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple

# 安装基础依赖
pip3 install numpy fastapi uvicorn python-multipart \
    sentencepiece soundfile onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simple

2. 传输模型文件

从 Windows 开发机复制 ONNX 模型到香橙派:

# 在 Windows 上打包
# 将 models/ 目录压缩为 models_onnx.tar.gz

# 通过 SCP 传输到香橙派
scp models_onnx.tar.gz orangepi@192.168.x.x:/home/orangepi/

# 在香橙派上解压
tar xzf models_onnx.tar.gz

3. ONNX → RKNN 模型转换(实录)

重要区别:rkllm-toolkit 用于 LLM 模型(如 Qwen),rknn-toolkit2 用于 ONNX 通用模型。两者可共存。

环境准备(龘思 Docker 容器内):

# 进入容器
docker exec -it daas-v2 bash

# 激活 rkllm 环境(之前转换 HXXedge 模型时已创建)
conda activate rkllm

# 安装 rknn-toolkit2(注意不是 rkllm-toolkit!)
pip install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple

踩坑1:libGL.so.1 缺失

安装 rknn-toolkit2 后验证时报错:

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

原因:rknn-toolkit2 依赖 opencv-python,而 Docker 容器缺少 GUI 库。

解决:替换为 headless 版 opencv:

pip uninstall opencv-python -y
pip install opencv-python-headless -i https://pypi.tuna.tsinghua.edu.cn/simple

踩坑2:pkg_resources 缺失

ModuleNotFoundError: No module named 'pkg_resources'

原因:setuptools 83.0.0 已移除 pkg_resources。

解决:降级 setuptools:

pip install "setuptools<70" -i https://pypi.tuna.tsinghua.edu.cn/simple

验证成功:

python -c "from rknn.api import RKNN; print('OK')"
# 输出: OK

踩坑3:quantized_dtype 参数名变更

ValueError: Invalid quantized_dtype 'i8', expect in ['w8a8', 'w8a16', 'w16a16i', 'w16a16i_dfp', 'w4a16']!

原因:rknn-toolkit2 2.3.2 不再使用 'i8',改为 'w8a8'。

解决:quantized_dtype='w8a8'

踩坑4:onnx 版本不兼容

AttributeError: module 'onnx' has no attribute 'mapping'

原因:onnx 1.22.0 太新,rknn-toolkit2 2.3.2 依赖旧版 onnx API。

解决:

pip install "onnx<1.17" -i https://pypi.tuna.tsinghua.edu.cn/simple

踩坑5:动态输入维度(Audio Tokenizer)

ValueError: The input shape ['batch', 2, 'waveform_length'] of 'waveform' is not support!

原因:Audio Tokenizer 的输入包含动态维度 waveform_length(可变长度音频波形),RKNN 不支持。

踩坑6:动态输入维度(TTS 核心模型)

ValueError: The input shape ['batch', 'prefill_seq', 17] of 'input_ids' is not support!

原因:TTS 模型也有动态维度 batch 和 prefill_seq。需要通过 dynamic_input 参数固定输入尺寸。

dynamic_input 参数格式要求(rknn-toolkit2 2.3.2):

# 三层嵌套:[ 模型级 [ 输入级 [ 各维度值 ] ] ]
rknn.config(
    dynamic_input=[[[1, 64, 17], [1, 64]]],  # 2个输入,每个有固定shape
)

注意:参数名是 dynamic_input(单数),不是 dynamic_inputs!

踩坑7:mean_values/std_values 不适用

ValueError: The len of mean_values ([128]) for input 0 is wrong, expect 64!

原因:mean_values/std_values 是图像预处理参数(RGB 通道归一化),TTS 模型输入是文本/Token,不适用。

解决:TTS 模型不设置 mean_values/std_values。

踩坑8(致命):模型包含字符串操作,NPU 不支持

KeyError: dtype('<U21')

原因:TTS 模型内部包含 Unicode 字符串类型操作(dtype('<U21')),RKNN 只能处理数值张量运算,不支持字符串操作。

最终结论:MOSS-TTS-Nano 无法转换为 RKNN 格式!

模型组 问题 NPU 支持
Audio Tokenizer (3个) 动态输入维度 (waveform_length) ❌ 不支持
TTS 核心模型 (5个) 包含字符串操作 (dtype <U21) ❌ 不支持

RK3588 NPU 只能处理数值张量运算,不支持字符串操作和动态维度。MOSS-TTS-Nano 的 ONNX 模型在架构上不适合 NPU 加速。

替代方案

既然 MOSS-TTS-Nano 无法使用 NPU,香橙派上的 TTS 可选方案:

方案 说明 预期延迟
MOSS-TTS-Nano CPU 推理 ONNX Runtime 纯 CPU 5-10 秒/句
Piper TTS 专为嵌入式设计,C++ 实现 < 1 秒
Sherpa-ONNX TTS 支持 RK3588,有 NPU 适配 < 1 秒
Edge TTS 云端调用 取决于网络

需要后续调研 Piper TTS 或 Sherpa-ONNX TTS 在香橙派上的部署可行性。

4. 部署推理服务

# 克隆代码
git clone https://github.com/OpenMOSS/MOSS-TTS-Nano.git
cd MOSS-TTS-Nano

# 修改模型路径指向本地
# 修改 defaults.py 中的 DEFAULT_CHECKPOINT_PATH

# 启动 ONNX 版(先用 CPU 验证)
python3 app_onnx.py

# 后续替换为 RKNN 加速版

5. 集成到 HXXedge 系统

海小星(端侧版)HD001e 语音对话链路:

用户语音 → Whisper ASR → DeepSeek LLM → MOSS-TTS-Nano → 语音回复
  (麦克风)   (RKNN/NPU)    (API/本地)     (RKNN/NPU)     (扬声器)

目标延迟:< 3 秒

部署难点与对策

难点 说明 对策
RKNN 模型转换 ONNX 图可能不完全兼容 需逐个子图测试转换
NPU 内存限制 6 TOPS NPU 算力有限 0.1B 模型应可容纳
ARM 兼容性 部分 Python 包 ARM 编译问题 使用预编译 wheel
量化精度 INT8 量化可能影响音质 需实测对比 FP16/INT8
首次部署复杂度 环境配置步骤多 制作 Docker 镜像

部署难度评估

安装复杂度排名(从易到难):

1. Windows PyTorch 版    ★★☆☆☆  pip install + 下载模型
2. Windows ONNX 版       ★★★☆☆  额外下载 ONNX 模型
3. 香橙派 CPU 版         ★★★☆☆  ARM 环境 + 依赖安装
4. 香橙派 NPU 版         ★★★★☆  RKNN 转换 + 适配
5. 生产级端侧部署         ★★★★★  Docker + 流式 + 集成

与现有 TTS 方案对比

方案 音质 延迟 离线 成本 声音克隆
Edge TTS ⭐⭐⭐⭐⭐ 中 ❌ 需联网 免费 ❌
阿里云 CosyVoice ⭐⭐⭐⭐⭐ 中 ❌ 需联网 按量 ✅
MOSS-TTS-Nano (CPU) ⭐⭐⭐⭐ 慢 ✅ 离线 免费 ✅
MOSS-TTS-Nano (NPU) ⭐⭐⭐⭐ 快 ✅ 离线 免费 ✅

适用场景


文件结构参考

MOSS-TTS-Nano-main/
├── app.py                    # PyTorch Web Demo
├── app_onnx.py               # ONNX Web Demo(推荐)
├── infer.py                  # 命令行推理
├── infer_onnx.py             # ONNX 命令行推理
├── defaults.py               # 默认模型路径配置 ★
├── text_normalization_pipeline.py  # 文本规范化 ★
├── requirements.txt          # Python 依赖
├── simple_test.html          # 简易测试页面(自建)
├── assets/
│   ├── demo.jsonl            # 音色配置 ★
│   └── audio/                # 参考音频
│       ├── zh_1.wav          # 中文女声
│       ├── en_1.wav          # 英文女声
│       ├── 平哥_202609009.wav  # 自定义音色
│       └── ...
├── models/                   # ONNX 模型(自动下载)
│   ├── MOSS-TTS-Nano-100M-ONNX/
│   └── MOSS-Audio-Tokenizer-Nano-ONNX/
└── generated_audio/          # 输出音频

★ 标记的文件在安装过程中需要修改


总结与建议

安装确实麻烦

MOSS-TTS-Nano 的安装过程确实比较折腾:

  1. 依赖重:PyTorch + transformers + torchaudio,光安装就要几分钟
  2. 模型大:PyTorch 版 ~320MB + ONNX 版 ~670MB,首次下载耗时
  3. Windows 兼容差:长路径问题、pynini 编译问题
  4. CPU 推理慢:短句 5-10 秒,实时对话不现实

但值得折腾

  1. 完全开源免费:MIT 许可,可商用
  2. 声音克隆:3-5 秒参考音频即可
  3. 端侧部署:0.1B 参数,香橙派 NPU 有望实现实时
  4. 多语言:20 种语言,覆盖广

下一步计划

  1. ✅ Windows ONNX 版测试完成
  2. ✅ rknn-toolkit2 环境准备完成(龘思 Docker 容器)
  3. ❌ RKNN 模型转换 → 不可行(模型含字符串操作 + 动态维度,NPU 不支持)
  4. ⬜ 调研替代 TTS 方案(Piper TTS / Sherpa-ONNX TTS)
  5. ⬜ 香橙派 TTS 部署测试
  6. ⬜ 集成到 HXXedge 海小星端侧版
  7. ⬜ 实时语音对话链路验证

📖 资料来源: - MOSS-TTS-Nano GitHub - HuggingFace 模型页 - 在线 Demo - 论文 arXiv:2603.18090


📝 创建:2026-09-09
🔄 标签:AI、语音技术、TTS、MOSS-TTS-Nano、ONNX、香橙派、声音克隆

相关笔记