1. 项目概述:当台灯听懂你的声音
去年给女儿辅导作业时,发现她每次要调节台灯都得放下笔去摸开关,一晚上能打断十几次注意力。作为电子工程师,我决定用STM32做个能听懂人话的智能台灯。这个项目实现了通过语音指令控制灯光开关/亮度/色温,实测识别准确率在安静环境下能达到92%,成本控制在80元以内。
核心功能包括:
- 本地化语音识别(无需联网)
- 多级亮度/色温调节
- 触摸按键备用控制
- 学习模式记忆偏好设置
相比市面同类产品,我们的方案有三大优势:一是采用离线识别方案保护隐私;二是使用PWM动态调节实现无频闪;三是加入环境光自适应补偿,避免夜间过亮刺激眼睛。
2. 硬件设计解析
2.1 主控选型对比
测试过STM32F103C8T6(72MHz Cortex-M3)和STM32F411CEU6(100MHz Cortex-M4)两款芯片:
- F103方案成本低(约15元)但处理MFCC特征提取时帧率仅23fps
- F411自带硬件浮点单元,识别响应时间缩短40%至0.3秒
最终选用F411,虽然贵10元但用户体验明显提升
2.2 关键电路设计
电源部分采用TPS5430 DCDC转换器(输入5V输出3.3V),实测转换效率91%:
c复制// PWM调光电路配置
TIM_OC_InitTypeDef sConfigOC;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 255; // 8位分辨率
HAL_TIM_PWM_Init(&htim3);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 100; // 初始亮度40%
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
2.3 麦克风阵列优化
采用双驻极体麦克风+MSM261S4030H0 ADC方案,通过以下手段提升信噪比:
- 在麦克风输入端增加RC低通滤波(fc=8kHz)
- PCB布局时保持麦克风间距≥4cm
- 软件端实现自适应噪声消除算法
实测在50dB环境噪声下仍能保持85%识别率
3. 语音识别实现
3.1 声学模型训练
使用TensorFlow Lite Micro框架,训练流程:
- 采集500条本地语音样本(包含老人/儿童不同音色)
- 通过Mel滤波器组提取40维MFCC特征
- 构建3层DNN网络(输入层40→隐藏层64→输出层8)
模型量化后仅占Flash 58KB,推理耗时8ms
关键技巧:在"开灯"/"关灯"等易混淆指令间加入200ms静音间隔
3.2 关键词识别算法
采用改进的DTW动态时间规整算法:
c复制float dtw_distance(float *test, float *ref, int len) {
float cost[len][len];
// 初始化第一行/列
for(int i=0; i<len; i++)
cost[i][0] = fabs(test[i]-ref[0]);
for(int j=0; j<len; j++)
cost[0][j] = fabs(test[0]-ref[j]);
// 动态规划计算
for(int i=1; i<len; i++)
for(int j=1; j<len; j++)
cost[i][j] = fabs(test[i]-ref[j]) +
fmin(cost[i-1][j], fmin(cost[i][j-1], cost[i-1][j-1]));
return cost[len-1][len-1]/len;
}
3.3 指令集设计
定义8种核心指令及对应触发阈值:
| 语音指令 | 特征向量阈值 | 响应动作 |
|---|---|---|
| "开灯" | ≤0.35 | 灯光渐亮 |
| "亮一点" | ≤0.42 | 亮度+15% |
| "暖色调" | ≤0.38 | 色温2700K |
4. 灯光控制子系统
4.1 无频闪调光方案
采用双路PWM混合控制:
- 通道1:调节白光LED(3000-6500K)
- 通道2:调节暖光LED(2700-3000K)
通过以下公式计算混合比:
code复制PWM_warm = 亮度% * (1 - 色温系数)
PWM_cold = 亮度% * 色温系数
实测THD<3%,远超市面常见可控硅调光方案
4.2 环境光自适应
通过BH1750传感器实时监测环境照度,实现:
- 自动亮度补偿(目标500lux)
- 深夜模式(22:00-6:00自动降低30%亮度)
- 延时关灯(检测到无人移动10分钟后渐暗)
5. 常见问题排查
5.1 识别率下降
可能原因及对策:
- 麦克风进尘→用酒精棉清洁
- 电源纹波过大→检查DCDC电感值
- 环境回声干扰→增加吸音海绵
5.2 PWM调光闪烁
典型解决方案:
- 将PWM频率从1kHz提升至8kHz
- 在LED驱动端并联100uF电容
- 检查MOS管栅极电阻是否≤10Ω
5.3 功耗优化记录
通过以下措施将待机功耗从12mA降至1.8mA:
- 关闭未用外设时钟(ADC/DAC)
- 采用WFI睡眠模式
- 语音检测间隔从100ms改为300ms
6. 成品实测数据
经过200小时老化测试,主要性能指标:
- 唤醒响应时间:0.28±0.05s
- 指令识别准确率:91.7%(安静环境)
- 待机电流:1.8mA@3.3V
- 工作温度范围:-10℃~55℃
这个项目最让我惊喜的是我女儿现在会主动说"台灯亮一点"而不是直接伸手乱按了。下一步计划加入手势识别模块,正在研究APDS-9960传感器的集成方案。
