小米 Sound (L06A) 原生 ALSA 数字回环 + 1024 点 FFT 音乐律动系统复盘
项目地址:eastwoodnet/xiaomi-sound-spectrum
实机演示:YouTube 演示视频
发布日期:2026-09-18 ~ 2026-09-19
版本:v1.0-beta2
项目缘起
从小米音箱拿到手那一刻我就拿到了SSH权限了。市面上的智能音箱多数都是使用openwrt系统精简后实现的,所以拿到ssh登陆后,就可以登入。一直以来就是当作airplay音乐推送(用airconnect项目把DLNA转成了airplay)接收用,接入homeassistant之后并没有什么其他的作用,并且平常都是麦克风静音的。
而突然有一天想起来这个灯光是RGB的啊,能不能控制呢?登陆后扫了一圈硬件设备发现,小米 Sound (L06A) 音箱顶部搭载了 18 颗全彩环形 RGB LED,但出厂固件的灯光效果相对简单——通常只是简单的呼吸灯或变色灯效,小爱同学说话都不能显示效果,跟HomePod相比差远了,就算不能实现HomePod的效果,也缺乏与音乐内容本身的联动。
核心问题:能否利用音箱硬件本身的数字音频回环能力,构建一套纯数字域、极低延迟、高精度的频谱分析 + LED 律动系统?
答案是肯定的。 经过一天多的开发,借助AI实现了一套完整的原生 C 语言律动引擎,核心架构如下:
graph TD
A[TI TAS5805M 功放数字总线 TDMOUT_C] -->|Hardware Loopback| B[ALSA hw:0,2 无损数字回环]
B -->|arecord 极低时延 PCM 流 21.33ms/帧| C[原生 aarch64 C 语言守护进程 led_music]
C -->|双声道解包| D[左声道 / 右声道 16-bit PCM 缓冲区]
D -->|Hanning 汉宁窗查表| E[频域泄漏抑制平滑]
E -->|左右声道独立 1024 点 FFT| F[Radix-2 定点频谱计算 46.88 Hz 分辨率]
F -->|8 大核心声学频段聚合| G[Sub-Bass / Bass Punch / Mids / Treble / Air]
G -->|各频段独立 AGC 包络跟踪| H[Attack 瞬态抓拍 + Decay 柔和防频闪]
H -->|I2C Deadband 智能死区滤波| I[AW20054 I2C 总线 18 颗全彩环形 RGB]
核心技术突破
纯硬件数字音频回环 (Hardware Digital Loopback)
传统方案使用 SAR ADC 模拟采样,信号经过 DAC → 功放 → 扬声器 → 空气 → ADC 的完整物理链路,存在大量噪声和延迟。
本项目直接读取 Amlogic SoC 内核级硬件数字回环节点 hw:0,2 (TDM-C),该节点直通 TI TAS5805M 功放芯片的数字音频输出,采样率为 48kHz / 16-bit / 双声道的无损 PCM 流。
关键优势:
- 播放音乐时信号饱满强劲
- 停止播放时幅值暴跌 41 倍(-32.3 dB)归入绝对数字静音
- 从物理源头彻底消除悬空杂波导致的误触发和频闪
- 对比
hw:0,1(内核 Dummy 声卡,+26561 严重直流偏置)和hw:0,3(PDM 麦克风阵列,被语音唤醒引擎独占),hw:0,2是唯一的纯数字回环通道
这里面有一个坑,一开始我配置的AI使用了Qwen3.8-27B的模型。让他找了几个小时后他告诉我没办法做到ALSA 的loopback节点采样。只能看到ADC芯片的电平。然后他给我写了一个SHELL的采样重放脚本。虽然也是能工作的,但是由于电平低噪一直存在,所以最后效果非常差强人意。等我反应过来过来换了Claude 4.6 Opus后有分析了一遍,直接的告诉我实际上可以用hw:0.2这个节点进行数字采样,这是标准的音频链路内核节点。切换了采样节点。提高了采样率后,傅里叶变化算法展示出来的律动效果惊人。另外,程序使用C语言重构,这样性能大大加强,CPU占用率几乎没有,并且由于人眼的特性,我把FPS刷新率降到了30.因为使用过高的刷新率反而让人觉得闪烁,降低后,由于视觉暂留的特性,效果好了很多。
技术细节备忘
有一些技术细节,让我更加理解了linux下驱动硬件的一些方式。
LED 颜色物理格式为 BGR
sysfs 节点 /sys/devices/i2c-0/0-003a/led_rgb 接收格式为 0xBBGGRR。例如 0xFF0000 实际点亮纯蓝,0x0000FF 为纯红,0x00FF00 为纯绿。
驱动电流控制寄存器(led_fade 陷阱)
AW20054 的 /sys/devices/i2c-0/0-003a/led_fade 实际上映射了芯片的各通道电流限制寄存器。初始化时必须写入 r 0xff、g 0xff、b 0xff,否则输出电流为 0mA,灯珠绝对不亮。
ALSA Loopback 节点辨析
| 节点 | 类型 | 用途 |
|---|---|---|
| hw:0,2 | TAS5805M 功放数字回环 | 本项目使用,静音时能量严格归零 |
| hw:0,1 | 内核 Dummy 声卡 | 未连接物理音源,+26561 严重直流偏置,不可使用 |
| hw:0,3 | 8 通道 PDM 麦克风阵列 | 被语音唤醒引擎独占,本项目无需抢占 |
一些future
增加开关控制,由于音箱上没有更多的按钮。可以使用长按播放暂停按钮的方式开启或者关闭LED律动的功能。或者通过MQTT报告给homeassistant控制。
增加调色盘和律动模式选择。目前只有两个律动模式。可以看看别的律动音箱的效果增加一些律动模式。颜色也做得能够风丰富一些。这些控制功能使用homeassistant插件的形式进行实现。
前置条件
音箱需开启 SSH root 权限(解锁教程)。