最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的介绍。
一、需求:耳机里"藏"一个语音转写模型
某 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):
python
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), # 再 2×
)
self.layers = nn.ModuleList([
ConformerBlock(192, 4, 1024) for _ in range(2)
])
self.ctc_head = nn.Linear(192, 29) # a-z + space + blank
四、INT4 量化:让 512KB SRAM 也够放
4.1 权重 INT4 Group-wise
-
组大小:128,共享一个 scale/zero
-
存储格式:
uint4_packed→ 2 元素/byte -
汇编解包:Helium
VLD1一条指令展开 32 组,零开销
4.2 激活 INT8 Block-wise
-
块大小:32,per-token 动态范围
-
利用 M55
UDOT指令,1 周期 32 MAC
4.3 量化感知训练(QAT)
python
class QuantConv1d(nn.Module):
def forward(self, x):
x_q = quantize(x, n_bits=8, block_size=32)
w_q = quantize(self.weight, n_bits=4, group_size=128)
return F.conv1d(x_q, w_q, self.bias, stride=self.stride)
前向模拟 INT4/INT8,反向 STE,20 epoch 后收敛。
五、知识蒸馏:让"大 Whisper"教"小"模型
教师 :Whisper-Large V3
学生 :本文 EncoderLite
损失:
L = 0.7*L_ctc + 0.3*L_kd
L_kd = KL(softmax(Teacher_logits/4), softmax(Student_logits/4))
数据:
-
开源 65kh 英文 + 自采 8kh 中文会议
-
SpecAugment(F=27, T=100)+ 0.1×Speed Perturb
蒸馏 30 epoch,WER 从 6.2% → 4.8%。
六、SRAM 峰值优化:双缓冲 + 分段 FFT
| 模块 | 原峰值 | 优化后 | 技巧 |
|---|---|---|---|
| ConvSub | 320KB | 80KB | 2×降采样先 |
| Conformer | 180KB | 45KB | 分段 FFT 256 点 |
| CTC Head | 12KB | 6KB | 延迟 softmax |
| 总峰值 :512KB → 128KB,给音频环形缓冲留 64KB 安全余量。 |
七、M55 Helium 汇编加速核心算子
Lua
; INT4 解包 → INT8
vdupb.q r0, #0x0F
vldrb.u q0, [r1]! ; 加载 32 byte(64 INT4)
vand.q q1, q0, r0 ; 低 4 位
vshr.q q2, q0, #4 ; 高 4 位
vsubb.q q1, q1, #8 ; 减 8 得符号
vsubb.q q2, q2, #8
vstrb.u q1, [r2]!
vstrb.u q2, [r2]!
32 个 INT4 权重 → 64 个 INT8 只需 24 周期,对比 C 实现提速 5.3×。
八、关键词唤醒:共用同一套声学编码器
把「Hey, Note」做成 1-stage 唤醒,直接复用 EncoderLite 降采样特征:
-
唤醒词数据集 1.2k h,CTC 训练
-
输出 3 类:{Hey, Note, Other}
-
误唤醒 < 1/24h,功耗增加 0.3mA
逻辑:
唤醒 → 立即打开 USB 音频通道 → 10 分钟转写 → 自动生成 txt → 回手机
九、实测结果
| 指标 | 目标 | 实测 |
|---|---|---|
| 模型体积 | ≤1.5MB | 1.46MB |
| WER(LibriSpeech-test) | ≤5% | 4.8% |
| 首字延迟 | ≤200ms | 168ms |
| 平均功耗 | ≤8mA | 7.3mA |
| 5h 续航 | OK | 5.1h |
连续 10 分钟转写 1.2k 中文字,误差仅 28 字,用户侧「零感知」掉电。