🚨 重要结论: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 上运行。
- 模型大小:0.1B 参数,PyTorch 版 ~235MB,ONNX 版 ~670MB
- 核心能力:声音克隆、多语言(中/英/日等 20 种)、流式合成
- 部署形态:命令行推理 / Web Demo / ONNX CPU 推理
- NPU 加速:❌ 不可行(模型含字符串操作 + 动态维度,RKNN 不支持)
- 实际体验:Windows CPU 推理较慢(5-10 秒/句),ONNX 版提速约 2 倍
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 即可流式生成 |
| 声音克隆 | 参考音频 + 文本即可克隆 |
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)
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
python app.py
访问 http://localhost:18083 ,支持音色选择、声音克隆、文字输入。
python app_onnx.py
ONNX 版无需 PyTorch,推理速度约为 PyTorch 版的 2 倍。
现象:
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
现象: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
# ... 原有逻辑
现象:首次启动从 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"
现象: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 | 参考音频对应的文本内容 |
| 运行方式 | 短句耗时 | 说明 |
|---|---|---|
| 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 秒 | 目标方案 |
| 流式合成 | 感知延迟降低 | 已支持 |
香橙派 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 加速推理
# 系统更新
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
从 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
重要区别:
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 在香橙派上的部署可行性。
# 克隆代码
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 加速版
海小星(端侧版)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 + 流式 + 集成
| 方案 | 音质 | 延迟 | 离线 | 成本 | 声音克隆 |
|---|---|---|---|---|---|
| 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 的安装过程确实比较折腾:
📖 资料来源: - MOSS-TTS-Nano GitHub - HuggingFace 模型页 - 在线 Demo - 论文 arXiv:2603.18090
📝 创建:2026-09-09
🔄 标签:AI、语音技术、TTS、MOSS-TTS-Nano、ONNX、香橙派、声音克隆