2301_76761127/chatterbox-npu
模型介绍
文件和版本
Pull Requests
讨论
分析

ResembleAI/chatterbox — 英文 TTS 语音合成(Ascend NPU 迁移验收)

1. 模型身份

  • 模型:ResembleAI/chatterbox(0.5B 级英文 TTS:T3 token-to-token Llama-520M 主干 + S3Gen CausalConditionalCFM 流匹配 + HiFT-GAN 声码器 + VoiceEncoder 说话人嵌入 + S3 speech tokenizer)
  • 官方 URL:https://huggingface.co/ResembleAI/chatterbox
  • 官方 Stage 3 源仓(GitCode 镜像/mirror):https://ai.gitcode.com/hf_mirrors/ResembleAI/chatterbox
  • 固定 revision(source revision):5bb1f6ee58e50c3b8d408bc82a6d3740c2db6e18
  • 许可:MIT(快照 README frontmatter 标注)
  • canonical English 管线权重(5 个文件,逐文件 SHA-256/size 在 inference.py 启动时强制校验):
    • ve.safetensors(5,695,784 B)— VoiceEncoder
    • t3_cfg.safetensors(2,129,653,744 B)— T3 Llama-520M(fp32,532,405,248 参数)
    • s3gen.safetensors(1,056,484,620 B)— S3Gen(CFM + HiFT-GAN + S3 tokenizer 权重)
    • tokenizer.json(25,470 B)— EnTokenizer
    • conds.pt(107,374 B)— 内置默认嗓音 Conditionals(T3Cond + S3Gen ref_dict,emotion_adv=0.5)
  • 快照其余 13 个文件(t3_23lang/t3_mtl23ls_v2/v3/s3gen_v3/mtl_tokenizer/Cangjie5_TC/ grapheme_mtl_merged_expanded_v1/.pt 变体等)属多语/turbo 变体,不是本次验收目标
  • 注 1:验收代码使用官方 PyPI 包 chatterbox-tts==0.1.7,不做手搓移植、零数学改动。 已逐文件 SHA-256 比对 PyPI 0.1.7 与 GitHub master:本验收路径覆盖的全部文件 (t3.py 的 teacher-forced T3.forward、s3gen 全套、s3tokenizer、voice_encoder、tokenizers、 cond_enc/perceiver/learned_pos_emb)逐字节一致;差异仅在多语采样路径 (alignment_stream_analyzer / GPT2 回退配置 / tts_turbo / mtl_tts),本驱动不 import
  • 注 2:官方 ChatterboxTTS.generate 含 torch.multinomial 采样,不可用于跨后端精度验收; 本验收用 T3.forward teacher-forcing(同数学、调用方给 speech token id),完全确定
  • 注 3:官方推理路径有三处随机源,全部由驱动钉到内嵌 sha256 计数器流 (numpy float64 生成 + Box-Muller,CPU 上生成后搬到设备,CPU/NPU 逐字节相同, 只钉噪声实现、不改任何数学):torch.randn_like(CFM 初始噪声 z、SineGen 噪声、 SourceModuleHnNSF 噪声)、torch.rand(覆盖 SineGen 谐波相位 torch.distributions.Uniform.sample)、torch.randn(本路径不用,防御性钉住)
  • 注 4:严格加载核验——VE/T3 strict=True(missing=[] unexpected=[]);S3Gen strict=False 且 missing 恰为官方声明的唯一非持久 buffer tokenizer.window;conds.pt 用 torch.load(weights_only=True);全部权重 isfinite 复核

2. 硬件软件矩阵

  • 服务器:单卡 Atlas 910B3(逻辑设备 npu:0),aarch64
  • 平台栈(未替换):CANN(/usr/local/Ascend)、Python 3.11.15、PyTorch 2.10.0+cpu、torch_npu 2.10.0
  • 模型级依赖:见 requirements.txt(官方 chatterbox-tts==0.1.7 及其模型级依赖,精确钉版; 平台 torch/torch_npu 不在其列)

3. 外部权重准备与完整性门禁

权重来自固定 revision 的不可变快照(supply MANIFEST 18 文件全量 rehash, manifest SHA-256 81ea69b85b0606bedae7da4bc4b0f7f088116e7ba613b36585f57b247e0c96fa, READY 绑定)。inference.py 启动时对 5 个 canonical 文件逐一校验 SHA-256+size, 并复核 strict load 结果、参数总数与全部权重有限性,任何漂移直接拒绝运行;全部加载离线, 不回退网络 model id。

4. 唯一验收入口

inference.py 是唯一验收入口(sole acceptance entry):

python inference.py --model_path <staged_snapshot> --device <cpu|npu:0> --seed 20260816 --output_json result.json

参数:--model_path(本地快照目录)、--device(仅允许 cpu 或 npu:N,其他值直接报错)、 --seed(默认 20260816)、--output_json。拒绝 CPU 回退:NPU 不可用时以非零退出码失败。

5. 固定样本、输出计数与有限值

完整测试用例(complete test case)为 8 个固定 CC0 样本(见 accuracy/manifest.json): 每样本 = 确定性 sha256 计数器生成的 2s 16kHz 波形(幅值 ±0.25)+ 16 个 S3 speech token id (∈[0,6561))+ 一条固定英文句,逐样本 SHA-256 身份冻结。输出族(每样本):

  • text_tokens:EnTokenizer 文本 token(含 sot/eot,int,硬等)
  • s3_tokens:S3 speech tokenizer 对 fixture 波形的 token(int,硬等,25 token/s → 50 个)
  • t3_tokens:T3 teacher-forced speech_logits 的 argmax(17 步,int,硬等)
  • ve_embedding:VoiceEncoder 说话人嵌入(256 floats,float 门限)
  • t3_logits:T3 speech_logits 全量(17×8194 floats,float 门限;speech head 词表 8194)
  • mel:CFM 流匹配输出梅尔谱(80×mel_len floats,float 门限)
  • wav:HiFT-GAN 输出波形(wav_len floats,float 门限)

全部浮点值必须有限,token 必须在值域内,逐样本计数冻结于比较器。

6. 验收政策(fast-track)与 CPU Golden

fast-track(协调者裁决,覆盖旧精度流程):本仓唯一验收 = 模型全程真实 NPU 运行—— device 四字段全部 npu:0、输出完整且全部有限、退出码 0、负向门禁 fail-closed、 两次独立 NPU 运行逐位一致(防呆)。未评估精度(不做 CPU-vs-NPU 数值比对/门限判定)。 CPU golden 已发布于私有控制面注册表(entry 4212f333b18d645fb09b4beccc616154169035320ce655519396d504c3d67a3e), 仅作可选后台 backfill 留存,不参与验收判定。

探索性精度观察(不属于验收,仅供评审参考)

fast-track 之前的探索性 NPU 运行曾按旧严门限比对过 CPU golden,实测:text/t3 token 两族全等;ve_embedding max_abs 3.7e-7;t3_logits max_abs 3.5e-5;S3 tokenizer FSQ round 边界翻转 13/400(量化码跨后端硬等不是合法判据);mel 相对误差 0.09%(官方 Ascend 1% 口径内);wav 点对点偏差大(相位敏感)。噪声流已实证双端逐字节一致。 以上仅为观察记录,不作为验收依据。

7. 真实 NPU 运行

fast-track:仅验证模型全程真实 NPU 运行,未评估精度。

两次独立 NPU 运行(Atlas 910B3,npu:0,seed 20260816,完整 8 样本):

  • run A(2026-08-17T02:47:43Z 启动,队列 job kimi-chatterbox-ft2-a-*):证据目录 audit/npu-runs/20260817T024743Z/;推理 PID 4055005,npu-smi 采样命中该 PID (卡级 HBM 4597/65536 MB 量级),持有 /dev/davinci_manager fd,进程地址空间含 1167 条 Ascend 映射;退出码 0;前向 11.0s
  • run B(2026-08-17T02:51:20Z 启动,队列 job kimi-chatterbox-ft2-b-*):证据目录 audit/npu-runs/20260817T025120Z/;推理 PID 4060346,同类取证齐备;退出码 0;前向 34.6s

两跑结果:device 四字段(requested/model/tensor/output)全部 npu:0,NPU 名称 Ascend910B3; sample_count=8、total_output_value_count=1,259,792、total_token_count=728 与冻结计数一致; 全部输出有限、token 在值域内。比较器(accuracy/accuracy.json)判定 双跑逐位一致(bit-identical,剔除计时字段后全等),status=PASS。

8. 截图证据(assets/)

  • assets/agent_workflow.png:Agent 工作流(完整提示与实质规划同屏)
  • assets/npu_device_call.png:推理 PID 存活期间完整命令、ps 与同 PID npu-smi 同屏
  • assets/model_result.png:model/revision/weight、设备、计数、门限、全部输出族指标与 PASS 同屏

9. compare 命令与负向门禁

python accuracy/compare_accuracy.py --run_a <npu_result_run1.json> --run_b <npu_result_run2.json> --output_json accuracy/accuracy.json

比较器只比较两个既有 NPU 结果 JSON(fast-track:身份/绑定/计数/设备/有限值/值域 + 双跑逐位一致),不启动任何推理路径,不做精度评估。 负向门禁(均已验证为 fail-closed):缺失权重文件拒绝运行;--device cuda:0 拒绝运行; 缺失 compare 输入文件时报错退出。

10. 限制

  • 许可 MIT。
  • 公开仓只含最小复现代码与摘要;完整结果 JSON、日志、PID 采样与失败尝试保留在私有审计区。
  • 平台栈(CANN/torch/torch_npu)不可替换。
  • 已知平台差异(同族验收实测):NPU float 归约算子内部以更低精度累加;本模型 token 族全部走 整数路径(argmax/tokenizer 输出),float 族走预声明门限。
  • Perth 水印模块仅 chatterbox.tts 顶层 import 需要(uv_build 打包无法 pip 安装, 以源码树形式提供 import perth);验收路径不实例化、不使用任何水印功能。

本仓为 2301_76761127 队伍交付件(与备份账号合并提交)。