(本文阅读时间:16 分钟)
语音识别正在被大模型重塑。基于大语言模型的语音识别(LLM-based ASR)支持多语种、长上下文,还能一次输出带标点的完整文字稿,但它对算力要求很高,基本只能部署在云端 GPU 上。
那么,能不能让它在用户自己的设备上本地运行,既保护隐私,又不受网络影响?
来自微软亚洲研究院的研究员们,针对这一需求,提出了 VibeVoice-ASR-BitNet。研究员们分析了模型中两个模块各自的性能瓶颈,并分别设计了量化方案,把一个基于大语言模型的自动语音识别(LLM-based ASR)模型压缩到 1.58GB。在消费级 CPU 上,VibeVoice-ASR-BitNet只用 1 个线程就能实时转写,精度几乎没有损失。目前,相关代码和模型均已开源。
相关信息已整理至文末,欢迎点击了解更多技术详情。
准还是快?语音识别的两难
今天的语音识别大致有两条技术路线。一条是传统的轻量路线,使用transducer、CTC、Conformer 等专用声学模型。这类模型速度快、天然适合流式识别,但口音、语种或录音环境一变,准确率就会下降。
另一条是 LLM-based ASR,借助十亿参数级 Transformer 的序列建模能力提升准确率。多语种、长上下文、带标点的完整抄本都能一次生成,但代价是算力需求高出一个量级,基本只能放在云端GPU 上。
部署在云端,就绕不开两个问题。一是隐私,音频必须离开设备;二是延迟,响应快慢由网络状况决定。
CPU 推理引擎让本地运行成为可能,但在端侧设备上,大模型要么达不到实时,要么要开很多线程把 CPU 占满。而端侧的 CPU 资源通常是给整个系统使用的,不能全部留给语音识别。
VibeVoice-ASR-BitNet要解决的正是这个问题。它把 LLM-based ASR 压缩到1.58GB,在消费级 CPU 上只用 1 个线程就能实时运行。
图1:VibeVoice-ASR-BitNet整体架构与各模块的量化格式。这里用实时率(real-time factor,RTF)衡量速度,即推理耗时除以音频时长。例如 RTF = 0.86,表示处理20 秒音频用时 17.2 秒,比实时略快。RTF 小于 1,是语音识别能够实际落地的门槛。
同一个模型,两种截然相反的瓶颈
VibeVoice-ASR由两个模块组成:
VAE tokenizer(变分自编码器分词器):包括声学编码器(acoustic encoder)和语义编码器(semantic encoder),两者都是 7 阶段 ConvNeXt卷积网络结构,负责把 24kHz 的原始波形压到 7.5Hz 的 token 序列。时间维度下采样 3200 倍,1 秒音频变成 7.5 个token。 LM decoder(语言模型解码器):基于28 层自回归 Transformer,把 token 转换成文字。
常见的量化做法是全模型统一降低精度。但研究员们发现,这两个模块的计算特性恰好相反。
VAE的瓶颈在激活值的内存读写( activation IO-bound),以一段 20 秒、24kHz、共48 万个采样点的音频为例,分别统计每一层需要读写的权重量和激活量,可以发现,两者差距非常悬殊。
图2:ConvNeXt 各阶段的权重量与激活量
在最浅的阶段 0 (stage 0),权重只有约 3 万个参数,激活值却多达 12.9 亿个元素,相差 5 万多倍。随着网络加深,通道数增加、时间轴缩短,差距逐渐缩小,直到最后一个阶段才发生反转。从整体看,激活值的数据量是权重的 16.4倍。这意味着,只量化权重几乎没有意义。常见的“权重 8 比特、激活 32 比特”(W8A32)做法压缩的恰恰是不占带宽的部分,真正的大头一点没动,实测速度基本没有变化。
LM decode 阶段正好相反,其瓶颈在权重的内存读写(weight IO-bound)。自回归解码时批大小(batch size)为 1,每生成一个 token,都要把 1.5B 的权重矩阵完整读取一遍,而激活只有一个向量。瓶颈几乎全压在权重的内存流量上。
异构量化:两个模块,两套方案
既然瓶颈不同,研究员们就没有用同一种格式处理两个模块。
VAE 侧采用I8_S格式:整条前向路径统一 INT8。 权重、激活值、中间缓冲区和所有算子边界都是 INT8,中间不存在任何精度格式转换。这一点很关键。如果激活值以更高精度存储,每层边界都要先量化再转回,那在十几亿个元素上做格式转换,开销本身将抵消压缩带来的收益。
为什么选择 INT8,而不是 INT4?原因有三点:1. sub-byte 格式需要打包(pack)和解包(unpack),省下的带宽有一部分会消耗在解包上;2. 主流 CPU 对 4bit 不提供原生 SIMD 指令支持;3. ConvNeXt 结构在 INT4 下精度下降很快。相比之下,INT8 在 AVX2 和 NEON 指令集上都有原生硬件支持。
LM 侧采用 I2_S格式:BitNet 三值权重。 权重被量化到 {-1, 0, +1} 三个值、用2bit 存储,激活值按 token 在线量化到 INT8。相对 FP16,权重内存流量降到 1/8,正好解决解码阶段的瓶颈。
两个模块合起来看,VAE 从 1.31GB 降到 0.65GB,压缩 2 倍;LM从 3.32GB 降到 0.92GB,压缩 3.6 倍;整个系统从 4.62GB 降到1.58GB,压缩2.9 倍。
一步到位反而失败:渐进式量化训练才能收敛
压缩到这种程度,直接量化行不通,需要依靠量化感知训练(quantization-aware training,QAT)。对此,研究员们在训练中做了两项关键设计。
第一,把GELU 全换成 ReLU。 GELU 在 INT8 算术下很难高效实现,所以研究员们先替换激活函数,再做短暂微调把精度恢复回来。这是为了让训练时的模型与推理时实际运行的计算内核(kernel)对齐。如果训练用 GELU、推理用 ReLU,那就是两个不同的模型。
第二,α-blending 三阶段渐进。 研究员们在所有权重和激活值边界插入伪量化(fake-quant)节点,但不是一开始就全量化,而是让量化值和原值做一次线性混合:x̂ = (1 - α) · x + α· FakeQuant(x)。
α 从 0 线性增长到 1。...