一、需求:耳机里'藏'一个语音转写模型
某 TWS 耳机代工厂要做「离线会议速记」:
- 芯片:BES 2800,Cortex-M55 + ARM-Helium,SRAM 512KB,外挂 8MB Flash
- 场景:长按触控 3 秒→实时转写 10 分钟→回手机 TXT 文件
- 指标:功耗 < 8mA(45mAh 电池续航 5h),WER ≤ 5%,模型体积 ≤ 1.5MB,首包延迟 < 200ms
开源 Whisper Tiny 39MB → 直接劝退。
目标:39MB → 1.46MB,26× 压缩,WER 4.8%,功耗 7.3mA,已量产 12K。
二、技术总览:三层漏斗压缩
| 层级 | 方法 | 体积 | WER↑ | 说明 |
|---|---|---|---|---|
| ① 结构 | CTC-Only/单层 | 1/4 | +0.9% | 去掉整个 Decoder |
| ② 参数量化 | INT4 + Group-wise | 1/2 | +0.4% | 128 组共享 scale |
| ③ 知识蒸馏 | Seq-KD + SpecAug | 1/3 | +0.2% | 教师 Whisper-Large |
| 总体 | 39MB → 1.46MB | 26× 压缩 | 总 WER 仅涨 1.5% |
三、结构裁剪:把 Encoder-Decoder 砍成'单塔'
- 去掉整个 Decoder,改用 CTC Loss 直接输出字母表
- Encoder 层数 6 → 2,d_model 512 → 192,head 8 → 4
- 卷积降采样 2×2×2×2 → 2×2×1×1,减少 SRAM 峰值 4×
代码片段(PyTorch):
class EncoderLite(nn.Module):
def __init__(self):
super().__init__()
self.conv_sub = nn.Sequential(
nn.Conv1d(80, 192, 7, 2, 3), # 2×降采样
nn.GELU(),
nn.Conv1d(192, 192, 7, 2, 3),
)
.layers = nn.ModuleList([
ConformerBlock(, , ) _ ()
])
.ctc_head = nn.Linear(, )

