ByteNoteByteNote

字节笔记本

2026年2月16日

Qwen-ASR:antirez 的纯 C 语音识别推理引擎

API中转
¥120

本文介绍 antirez(Redis 作者)开源的 Qwen-ASR 项目,一个纯 C 语言实现的 Qwen3-ASR 语音识别推理引擎,支持 0.6B 和 1.7B 模型,零依赖,CPU 上实现数倍实时速度。

项目简介

Qwen-ASR 是由 antirez(Salvatore Sanfilippo,Redis 作者)开发的纯 C 语言语音识别推理管道。该项目实现了对 Qwen3-ASR 0.6B 和 1.7B 模型的本地推理,除了 C 标准库和 BLAS 实现(macOS 上是 Accelerate,Linux 上是 OpenBLAS)外,零外部依赖。

截至目前,该项目在 GitHub 上已获得 313+ stars,主要由 C 语言(79.5%)和 Python(18.5%)编写。

核心特性

  • 几乎零依赖:纯 C 实现,仅需 BLAS(macOS 用 Accelerate,Linux 用 OpenBLAS)
  • 双模型支持:自动检测 Qwen3-ASR 0.6B 或 1.7B 模型
  • 流式输出:Token 逐词打印到 stdout,即使是离线模式
  • 流式模式--stream 分块处理音频,带前缀回滚
  • 监控模式--monitor 在 stderr 显示实时诊断符号
  • 语言控制--language 强制指定目标语言(支持 30 种语言)
  • 提示词偏置--prompt 注入系统提示以引导特定术语拼写
  • 静音跳过--skip-silence 跳过长时间静音段
  • 内存映射权重:BF16 权重直接从 safetensors 文件 mmap,加载近乎瞬间
  • 多格式输入:支持 WAV 文件和 stdin 管道输入

技术架构

模型管道

WAV -> 16kHz -> Mel Spectrogram -> Conv2D Stem -> Encoder -> Projection -> Decoder -> Tokens

模型规格对比

参数0.6B1.7B
编码器层数1824
编码器维度8961024
解码器层数2828
解码器维度10242048
GQA 头数16 Q / 8 KV16 Q / 8 KV
词表大小151,936151,936
权重格式BF16BF16

安装与构建

前置要求

  • macOS(自带 Accelerate)或 Linux(需安装 OpenBLAS)

Linux 安装 OpenBLAS

bash
# Ubuntu/Debian
sudo apt install libopenblas-dev

# Fedora
sudo dnf install openblas-devel

构建步骤

bash
# 克隆项目
git clone https://github.com/antirez/qwen-asr.git
cd qwen-asr

# 构建
make blas

# 下载模型(交互选择:small=0.6B, large=1.7B)
./download_model.sh

快速开始

基本使用

bash
# 转录音频文件(Token 流式输出)
./qwen_asr -d qwen3-asr-0.6b -i audio.wav

# 通过 ffmpeg 管道任意格式
ffmpeg -i audio.mp3 -f s16le -ar 16000 -ac 1 - 2>/dev/null | \
./qwen_asr -d qwen3-asr-0.6b --stdin

# 流式模式(实时音频增量输出)
./qwen_asr -d qwen3-asr-0.6b -i long_recording.wav --stream

高级用法

bash
# 指定语言
./qwen_asr -d qwen3-asr-0.6b -i audio.wav --language Chinese

# 使用提示词引导
./qwen_asr -d qwen3-asr-0.6b -i audio.wav --prompt "Preserve spelling: PostgreSQL, Redis, CUDA"

# 监控模式(实时诊断)
./qwen_asr -d qwen3-asr-0.6b -i audio.wav --stream --monitor

# 长文件分段处理
./qwen_asr -d qwen3-asr-0.6b -i lecture.wav -S 20

# 跳过静音段
./qwen_asr -d qwen3-asr-0.6b -i recording.wav --skip-silence

实时网络流转录

bash
# 实时转录网络电台
curl -sL http://stream.live.vc.bbcmedia.co.uk/bbc_world_service | \
ffmpeg -i pipe:0 -ar 16000 -ac 1 -f s16le pipe:1 2>/dev/null | \
./qwen_asr -d qwen3-asr-0.6b --stdin --stream --monitor

性能基准

在 Apple M3 Max(128GB RAM)上的测试结果:

离线模式(完整 + 分段)

音频0.6B 推理时间0.6B 实时倍速1.7B 推理时间1.7B 实时倍速
11s1.4s7.99x2.6s4.29x
45s3.4s13.38x5.9s7.63x
89s13.1s6.78x26.6s3.34x

流式模式(45s 音频)

配置0.6B 实时倍速1.7B 实时倍速
缓存开启(默认)4.69x2.54x
缓存关闭2.05x1.31x

内存需求

静态内存占用

组件0.6B1.7B
safetensors mmap1.747 GiB4.376 GiB
编码器 F32 权重0.694 GiB1.183 GiB
解码器堆内存0.328 GiB1.313 GiB
总计2.770 GiB6.871 GiB

推荐配置

  • 60 秒以内音频:-S 0(默认)获得最佳质量
  • 大型预录文件:-S 20-S 30 分段处理
  • 实时连续音频:--stream 模式

C API 使用

项目提供简洁的回调式 C API:

c
#include "qwen_asr.h"

// 加载模型
qwen_ctx_t *ctx = qwen_load("qwen3-asr-0.6b");

// 设置 Token 回调
qwen_set_token_callback(ctx, my_token_handler, userdata);

// 可选:强制语言或设置提示词
qwen_set_force_language(ctx, "Chinese");
qwen_set_prompt(ctx, "Preserve spelling: PostgreSQL, Redis");

// 转录音频文件
char *text = qwen_transcribe(ctx, "audio.wav");
printf("%s\n", text);
free(text);

// 或从原始样本转录
char *text2 = qwen_transcribe_audio(ctx, samples, n_samples);

qwen_free(ctx);

作者说明

antirez 特别说明:该项目明确不支持 MPS(Metal Performance Shaders)。原因是语音识别系统通常在远程 Linux 服务器上运行,添加 MPS 会过多关注 Apple 硬件。代码在 Apple 硬件上运行良好(NEON 优化),但不接受 MPS 相关的 PR。

项目链接

分享: