智能AI
morning
VibeVoice-ASR-BitNet:让语音大模型在你的笔记本电脑上实时运行
2026-11-05
1 阅读
约10分钟阅读
微软研究院AI
字号:
(本文阅读时间: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 ,正好解决解码阶段的瓶颈。 研究员们有意没有对嵌入层( embedding )和语言模型输出头( LM head )做三值化。这两层负责在约 15 万词的完整词表空间和隐状态之间做映射,三值精度下性能会直接崩溃,所以保留 6bit 的 Q6_K 格式。 两个模块合起来看, 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 。 α=0 时是全精度模型, α=1 时是完全量化。 α 到 1 之后继续训一段时间,让量化后的权重稳定下来。 两种做法的效果差别非常明显。 图3 : 渐进式 QAT 与直接 QAT 的蒸馏损失收敛曲线
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱