小爱音箱LED律动程序开发备忘

By | 2026-09-19

小米 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 0xffg 0xffb 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 权限(解锁教程)。