← 返回文章

Qwen3-ASR 与 Qwen3-TTS GGUF 怎么选:Jetson AGX Orin 本地语音部署指南

Qwen3-ASR、ForcedAligner 与 TTS GGUF 在 Jetson AGX Orin 32GB/64GB 上的模型选型、编译和部署建议。

#Qwen3#audio.cpp#Jetson#ASR#TTS

Qwen3-ASR 与 Qwen3-TTS GGUF 怎么选:Jetson AGX Orin 本地语音部署指南

如果你准备在 Jetson AGX Orin 上部署本地语音系统,这组 Qwen3 GGUF 模型基本覆盖了完整链路:

flowchart LR
    A["麦克风或音频文件"] --> B["Qwen3-ASR"]
    B --> C["文本"]
    B -. "需要时间戳" .-> D["Qwen3-ForcedAligner"]
    C --> E["Qwen3-TTS"]
    D --> F["字幕、逐字时间轴"]

这些模型并不是“选一个就够了”,而是分别负责识别、对齐和合成。本文以 audio.cpp GGUF Model Packages 中的模型包为基础,重点讨论 Jetson AGX Orin 64GB 和 32GB 的实际选型。

先给结论

使用场景 推荐组合
常驻语音助手、实时转写 Qwen3-ASR-0.6B Q8
会议、长录音、复杂噪声 Qwen3-ASR-1.7B Q8
字幕、逐字时间戳 ASR + Qwen3-ForcedAligner-0.6B Q8
参考音频克隆声音 Qwen3-TTS-12Hz-0.6B-Base Q8 或 1.7B-Base Q8
固定产品角色声音 Qwen3-TTS-12Hz-1.7B-CustomVoice Q8
用文字描述声音风格 Qwen3-TTS-12Hz-1.7B-VoiceDesign Q8
AGX Orin 64GB 高质量方案 ASR-1.7B Q8 + Aligner-0.6B Q8 + 一个 1.7B TTS Q8
AGX Orin 32GB 稳妥方案 ASR-0.6B Q8 + Aligner-0.6B Q8 + TTS-0.6B Base Q8

Q8_0 是 Orin 上最适合作为起点的精度。F16/BF16 更适合做质量基准或最终对比,不建议一开始就把所有模型都用高精度常驻。

这七个模型分别做什么

当前模型包的文件大小大致如下。文件大小不等于实际运行内存,运行时还需要考虑 CUDA workspace、音频缓存、KV cache、系统内存和 TTS tokenizer。

模型 任务 当前包大小 Orin 建议
Qwen3-ASR-0.6B 语音识别、流式转写 Q8 约 1.15GB 默认首选
Qwen3-ASR-1.7B 更高质量语音识别 Q8 约 2.47GB 64GB Orin 首选
Qwen3-ForcedAligner-0.6B 文本与语音对齐、生成时间戳 Q8 约 1.13GB 与 ASR 搭配
Qwen3-TTS-12Hz-0.6B-Base 参考音频声音克隆 Q8 约 1.99GB 32GB Orin 首选
Qwen3-TTS-12Hz-1.7B-Base 高质量声音克隆 Q8 约 2.70GB 64GB Orin 首选
Qwen3-TTS-12Hz-1.7B-CustomVoice 固定说话人和风格控制 Q8 约 2.82GB 产品角色、播报员
Qwen3-TTS-12Hz-1.7B-VoiceDesign 根据自然语言设计声音 Q8 约 2.82GB 角色开发、声音实验

Qwen3-ASR 官方支持多语言、中文方言、歌声和带背景音乐的歌曲识别;Qwen3-TTS 系列支持中文、英语、日语、韩语、德语、法语、西班牙语、葡萄牙语、意大利语和俄语等语言。具体能力可参考 Qwen3-ASR 官方说明Qwen3-TTS 官方仓库

ASR:0.6B 还是 1.7B?

Qwen3-ASR-0.6B:Orin 上的默认模型

0.6B 版本更适合:

  • 常驻后台监听;
  • 语音助手;
  • 麦克风实时转写;
  • 多路轻量请求;
  • Jetson AGX Orin 32GB;
  • 对延迟和功耗敏感的应用。

如果音频语言已知,建议显式传入 –language Chinese、–language English 等语言提示。audio.cpp 文档特别提醒,量化可能降低自动语言识别的稳定性,但在明确语言提示下,转写质量仍然可以保持较好。

Qwen3-ASR-1.7B:质量优先的离线识别

1.7B 更适合:

  • 会议录音;
  • 长音频;
  • 噪声环境;
  • 多语言混合;
  • 歌声和背景音乐;
  • 对识别错误比较敏感的内容生产场景。

在 AGX Orin 64GB 上,1.7B Q8 是一个很平衡的选择。它的文件并不大,但不要简单认为它一定比 0.6B 更快;实际速度还取决于音频长度、功耗模式、CUDA 版本、并发数和是否开启分块。

ForcedAligner:它不是另一个 ASR

Qwen3-ForcedAligner-0.6B 的作用是:给定一段音频和一份准确文本,返回词级或字符级时间戳。

它不能替代 ASR,因为它需要文本作为输入:

audiocpp_cli \
  --task align \
  --family qwen3_forced_aligner \
  --model models/Qwen3-ForcedAligner-0.6B-GGUF/qwen3-forced-aligner-0.6b-q8_0.gguf \
  --backend cuda \
  --audio speech_16k.wav \
  --text "这是需要对齐的准确文本。" \
  --language Chinese \
  --words-out words.json

字幕、卡拉 OK、逐字高亮、口播剪辑都适合使用它。

长音频不要直接把整段音频和整篇文本交给独立的 aligner。更稳妥的方式是:

  1. ASR 先分块识别;
  2. 用 ForcedAligner 对每个音频块和对应文本进行对齐;
  3. 把时间戳映射回原始音频时间轴。

在 audio.cpp 中,也可以通过 qwen3_asr.forced_aligner_model_path 让 ASR 自动调用对齐模型。

TTS:Base、CustomVoice 和 VoiceDesign 的区别

Base:需要参考音频,适合声音克隆

Base 模型需要一段参考音频,最好同时提供参考文本。它适合:

  • 克隆用户声音;
  • 视频配音;
  • 同声改写;
  • 长文本朗读;
  • 保持固定说话人身份。

0.6B Base 适合 Orin 32GB 或低功耗部署;1.7B Base 更适合 Orin 64GB 的高质量声音克隆。

audiocpp_cli \
  --task tts \
  --family qwen3_tts \
  --model models/Qwen3-TTS-12Hz-1.7B-Base-GGUF/qwen3-tts-12hz-1.7b-base-q8_0_v2.gguf \
  --backend cuda \
  --text "这是 Qwen3 TTS 的声音克隆测试。" \
  --voice-ref reference.wav \
  --reference-text "参考音频对应的原始文本。" \
  --language Chinese \
  --out output.wav

CustomVoice:不用参考音频,直接选择内置说话人

CustomVoice 内置固定说话人,通过 –speaker 选择,例如 Vivian、Ryan 等,也可以通过 instruction 控制情绪和表达方式。

它适合:

  • 产品播报员;
  • 智能客服;
  • 固定角色;
  • 教程和导航语音;
  • 需要输出稳定一致声音的系统。
audiocpp_cli \
  --task tts \
  --family qwen3_tts \
  --model models/Qwen3-TTS-12Hz-1.7B-CustomVoice-GGUF/qwen3-tts-12hz-1.7b-customvoice-q8_0.gguf \
  --backend cuda \
  --text "欢迎使用本地语音服务。" \
  --speaker Vivian \
  --instruct "温柔、自然、语速稍慢。" \
  --language Chinese \
  --out output.wav

如果应用不需要用户自定义声音,CustomVoice 通常比 Base 更容易产品化。

VoiceDesign:用文字描述一个声音

VoiceDesign 不需要参考音频,而是通过自然语言描述声音:

audiocpp_cli \
  --task vdes \
  --family qwen3_tts \
  --model models/Qwen3-TTS-12Hz-1.7B-VoiceDesign-GGUF/qwen3-tts-12hz-1.7b-voicedesign-q8_0.gguf \
  --backend cuda \
  --text "今天我们来介绍一个新的机器人项目。" \
  --instruct "年轻、明亮、亲切的中文女声,语速自然,带有轻微的兴奋感。" \
  --language Chinese \
  --out output.wav

VoiceDesign 适合角色探索和创意生产。如果需要一个长期稳定、可复用的角色声音,可以先用 VoiceDesign 设计声音,再将生成的参考音频交给 Base 模型继续使用。

Jetson AGX Orin 为什么适合这组 GGUF 模型?

Jetson AGX Orin 64GB 开发套件采用统一内存架构,CPU 和 GPU 共享 LPDDR5 内存,拥有 2048 个 Ampere CUDA 核心、64 个 Tensor Core,内存带宽最高约 204.8GB/s。详细规格可参考 NVIDIA Jetson AGX Orin 技术资料

这意味着 Orin 的优势不只是“能不能装下模型”,而是可以在同一台设备上完成:

  • 音频采集;
  • VAD;
  • ASR;
  • 强制对齐;
  • TTS;
  • WebUI 或 HTTP 服务;
  • 业务逻辑和设备控制。

但统一内存也意味着系统、GPU 和模型会共同争用内存。因此,不建议按照“64GB 全部给模型”的方式规划。

AGX Orin 上的推荐组合

AGX Orin 32GB

推荐组合:

Qwen3-ASR-0.6B Q8
Qwen3-ForcedAligner-0.6B Q8
Qwen3-TTS-12Hz-0.6B-Base Q8

适合语音助手、轻量字幕、声音克隆和单路 TTS。

如果必须使用固定内置角色,可以把 TTS 换成 1.7B CustomVoice Q8,但不建议同时常驻多个 1.7B TTS 模型。

AGX Orin 64GB

推荐组合:

Qwen3-ASR-1.7B Q8
Qwen3-ForcedAligner-0.6B Q8
Qwen3-TTS-12Hz-1.7B-Base Q8

如果应用是固定播报员,将 Base 替换为 CustomVoice;如果应用是角色设计,将 Base 替换为 VoiceDesign。

不要把 Base、CustomVoice、VoiceDesign 三个 TTS 模型同时加载。它们属于不同工作流,不是需要同时运行的三个阶段。

audio.cpp 编译建议

audio.cpp 为 Qwen3 提供了统一的 qwen3_asr、qwen3_forced_aligner 和 qwen3_tts loader,并支持 CUDA、CLI 和服务端模式。当前 Linux 构建文档要求 GCC 13 或更新版本,以及 CUDA Toolkit 12.0 或更新版本,具体以 JetPack 和当前 audio.cpp 分支为准。

在 Orin 上可以使用类似配置:

scripts/build_linux.sh \
  --backend cuda \
  --cuda-arch 87 \
  --model-set custom \
  --models qwen3_tts,qwen3_asr \
  --deployment-build \
  --target audiocpp_cli \
  --target audiocpp_server \
  --jobs 4

Orin 的 CUDA 架构是 8.7,因此使用 –cuda-arch 87 可以避免编译出不必要的其他 GPU 架构代码。audio.cpp 的 Linux 构建说明见 Linux Build

不同 audio.cpp commit 的 model composite 可能会变化。编译完成后,建议执行:

audiocpp_cli --list-loaders
audiocpp_cli --list-devices

确认 qwen3_asr、qwen3_forced_aligner 和 qwen3_tts 都已经注册。

TTS 还需要额外的 tokenizer

这是部署时最容易忽略的一点。

Qwen3-TTS 的主模型和 Qwen3-TTS-Tokenizer-12Hz 是分开的。当前这些目录中的 GGUF 主要是 TTS 主模型,不能简单认为下载一个 talker GGUF 就完成了全部 TTS 部署。

audio.cpp 文档要求分别准备:

TTS 主模型 GGUF
speech_tokenizer/model.gguf

也就是说,Base、CustomVoice 和 VoiceDesign 可以共享同一个 12Hz tokenizer。部署前应按照 audio.cpp Qwen3 模型文档 准备 tokenizer,并确认它位于当前 loader 能够发现的位置。

Orin 上的运行优化

第一,优先使用 CUDA 后端。audio.cpp 当前将 CUDA 作为主要优化路径,CPU 和 Vulkan 更适合兼容性测试。

第二,服务端使用懒加载,但要理解它的含义。lazy_load 只会延迟模型第一次加载,并不会在请求结束后自动卸载模型。模型一旦被使用,通常会一直留在进程中,直到服务退出。

第三,TTS 可以考虑:

qwen3_tts.mem_saver=true

这会释放部分请求后的缓存图,降低常驻内存,但下一次请求可能需要重新构建部分计算图。

第四,重复使用同一段参考音频时,可以保留 voice prompt cache;内存紧张时再关闭缓存。

第五,已知语言的音频尽量显式传入语言提示。特别是 Q8 模型,不要完全依赖自动语言识别。

Q8 是否一定和 BF16 一样?

不一定。

当前 audio.cpp GGUF 包的 ASR 和 ForcedAligner Q8 路径已经比较适合作为部署版本;但 TTS 包的 Q8 测试记录中仍标注了 ASR-match drift。这并不等于声音一定不可用,而是说明自动化音频相似度或回听一致性不能完全等同于 BF16。

建议采用两阶段策略:

  1. 用 BF16 或原始精度版本建立质量基准;
  2. 再用 Q8_0 在自己的声音、语言、文本长度和 Orin 功耗模式下进行试听和回归测试。

最终建议

如果只能在 AGX Orin 上选择一套模型,我会这样配置:

AGX Orin 32GB:
ASR-0.6B Q8
ForcedAligner-0.6B Q8
TTS-0.6B-Base Q8

AGX Orin 64GB:
ASR-1.7B Q8
ForcedAligner-0.6B Q8
TTS-1.7B-Base Q8_v2

然后根据业务替换 TTS:

  • 要克隆真人声音:Base;
  • 要固定产品角色:CustomVoice;
  • 要通过文字设计角色:VoiceDesign。

这组模型最适合的部署方式,不是把所有模型堆在一起,而是根据任务拆成几个可复用的本地语音组件。对 AGX Orin 来说,Q8 负责把质量、内存和功耗平衡在一个比较实际的位置;1.7B 负责质量上限,0.6B 负责常驻和实时性。