基于 STM32 的智能语音唤醒与关键词识别系统设计 —— 从硬件集成到算法实现
一、引言
随着物联网与智能家居的发展,语音交互作为自然且便捷的人机接口,被广泛应用于智能设备控制。基于 STM32 的智能语音唤醒与关键词识别系统,通过嵌入式技术实现低功耗下的实时语音检测、唤醒词触发及特定关键词识别,可应用于智能音箱、语音遥控器等场景。本文详细阐述其硬件选型、接线设计、软件流程及核心代码实现。
二、硬件设计
2.1 核心芯片与模块选型
(1)主控制器
选用STM32F407VET6(ARM Cortex-M4 内核,168MHz 主频,512KB Flash,192KB RAM),具备硬件浮点运算单元(FPU)和丰富的外设接口(SPI、I²C、UART、ADC),可高效处理语音数据并驱动外围模块。
(2)语音识别模块
选用LD3320 语音识别芯片,支持离线语音识别,可自定义唤醒词和关键词(最多 50 个),无需外部 Flash 存储模型,集成 A/D 转换和语音处理算法,通过 SPI 接口与 STM32 通信,识别响应时间≤200ms,适合低功耗场景。
(3)麦克风模块
选用MAX9814 驻极体麦克风模块,内置自动增益控制(AGC)和低噪声放大器,可将语音信号转换为 0-3.3V 模拟电压,输出至 LD3320 的音频输入引脚,确保语音采集的清晰度。
(4)指示与执行模块
- LED 指示灯:3 个 RGB LED(共阴极),分别用于指示 “待机”“唤醒”“识别成功” 状态;
- 蜂鸣器:有源蜂鸣器,用于识别成功时的声音反馈;
- 继电器模块:用于模拟控制外部设备(如灯光、风扇),响应关键词指令。
(5)电源模块
选用LM1117-3.3V线性稳压器,将 5V 输入转为 3.3V,为 STM32、LD3320 及麦克风模块供电,确保系统稳定工作。
2.2 硬件接线设计
| 模块 | 接口 / 引脚 | STM32 引脚 | 功能说明 |
|---|---|---|---|
| LD3320 | VCC | 3.3V | 电源输入 |
| GND | GND | 接地 | |
| SPI_SCK | PA5(SPI1_SCK) | SPI 时钟线 | |
| SPI_MOSI | PA7(SPI1_MOSI) | SPI 主机输出 / 从机输入 | |
| SPI_MISO | PA6(SPI1_MISO) | SPI 主机输入 / 从机输出 | |
| CS | PA4(SPI1_NSS) | 片选信号(低电平有效) | |
| RST | PB0 | 复位信号(低电平复位) | |
| INT | PB1 | 中断输出(识别成功时触发) | |
| AUDIO_IN | 接 MAX9814 输出 | 语音信号输入 | |
| MAX9814 | VCC | 3.3V | 电源输入 |
| GND | GND | 接地 | |
| OUT | LD3320_AUDIO_IN | 音频信号输出 | |
| RGB LED | R | PC0 | 红色通道(PWM 控制) |
| G | PC1 | 绿色通道(PWM 控制) | |
| B | PC2 | 蓝色通道(PWM 控制) | |
| 蜂鸣器 | IO | PC3 | 控制端(高电平触发) |
| 继电器 | IN | PC4 | 控制端(高电平吸合) |
接线说明:
- LD3320 的 SPI 接口需上拉电阻(4.7kΩ),确保通信稳定;
- MAX9814 的增益可通过外部电阻调节(默认 40dB),输出端串联 100nF 电容滤波;
- RGB LED 通过 STM32 的 TIM3_CH1~CH3(PC0~PC2)输出 PWM 信号控制亮度。
三、软件设计
3.1 软件流程图
(1)主程序流程图

(2)LD3320 识别子流程图

3.2 核心代码实现
(1)系统初始化与 LD3320 配置
#include "stm32f4xx.h"
#include "ld3320.h"
#include "pwm.h"
#include "delay.h"// 关键词ID定义
#define KW_OPEN_LIGHT 1 // "打开灯"
#define KW_CLOSE_LIGHT 2 // "关闭灯"
#define KW_OPEN_FAN 3 // "打开风扇"// 全局状态变量
uint8_t wakeup_flag = 0; // 唤醒标志
uint8_t kw_id = 0; // 识别到的关键词IDvoid RCC_Configuration(void) {RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 用于PWM控制LED
}// 初始化LD3320控制引脚(CS、RST、INT)
void LD3320_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;// CS (PA4), RST (PB0), INT (PB1)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_Init(GPIOB, &GPIO_InitStructure);// INT引脚配置为输入(下降沿触发中断)GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOB, &GPIO_InitStructure);// 初始化状态:CS高电平(未选中),RST高电平(正常工作)GPIO_SetBits(GPIOA, GPIO_Pin_4);GPIO_SetBits(GPIOB, GPIO_Pin_0);
}// 注册唤醒词和关键词
void LD3320_RegisterWords(void) {// 注册唤醒词:"小助手"(唤醒词需优先注册)LD3320_AddWakeUpWord("小助手", 0); // 0为唤醒词固定ID// 注册关键词(最多50个,ID从1开始)LD3320_AddKeyWord(KW_OPEN_LIGHT, "打开灯");LD3320_AddKeyWord(KW_CLOSE_LIGHT, "关闭灯");LD3320_AddKeyWord(KW_OPEN_FAN, "打开风扇");
}// 系统初始化
void System_Init(void) {RCC_Configuration();Delay_Init();SPI1_Init(); // 初始化SPI通信(与LD3320)LD3320_GPIO_Init();LD3320_Init(); // 初始化LD3320芯片LD3320_RegisterWords(); // 注册唤醒词和关键词TIM3_PWM_Init(255, 83); // 初始化PWM(控制RGB LED,84MHz/84=1MHz)Buzzer_Init(); // 初始化蜂鸣器Relay_Init(); // 初始化继电器
}
(2)中断处理与识别结果解析
// LD3320中断服务函数(PB1下降沿触发)
void EXTI1_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line1) != RESET) {// 读取LD3320识别结果(SPI通信)kw_id = LD3320_ReadResult();if (kw_id == 0) {wakeup_flag = 1; // 唤醒词识别成功} else {// 关键词识别成功(kw_id为1~3)wakeup_flag = 2;}EXTI_ClearITPendingBit(EXTI_Line1);}
}// 执行关键词对应动作
void ExecuteAction(uint8_t id) {switch(id) {case KW_OPEN_LIGHT:GPIO_SetBits(GPIOC, GPIO_Pin_4); // 继电器吸合(开灯)break;case KW_CLOSE_LIGHT:GPIO_ResetBits(GPIOC, GPIO_Pin_4); // 继电器断开(关灯)break;case KW_OPEN_FAN:// 可扩展风扇控制逻辑break;default:break;}
}
(3)主函数(状态机与流程控制)
int main(void) {uint32_t timeout = 0;System_Init();// 初始状态:蓝色LED常亮(待机)LED_SetColor(0, 0, 255); // RGB(0,0,255)while(1) {if (wakeup_flag == 1) {// 唤醒成功:绿色LED闪烁wakeup_flag = 0;LED_SetBlink(0, 255, 0, 500); // 绿色,500ms闪烁一次LD3320_StartRecognition(); // 启动关键词识别timeout = 0;// 等待关键词识别(超时3秒)while(timeout < 3000) {if (wakeup_flag == 2) {wakeup_flag = 0;// 识别到关键词,执行动作ExecuteAction(kw_id);// 反馈:红色LED闪烁+蜂鸣器提示LED_SetBlink(255, 0, 0, 200);Buzzer_Beep(1000); // 鸣响1秒Delay_Ms(2000);break;}Delay_Ms(1);timeout++;}// 恢复待机状态:蓝色常亮LED_SetColor(0, 0, 255);LD3320_StopRecognition(); // 停止识别,返回唤醒检测}}
}
四、总结与展望
本文设计的基于 STM32 与 LD3320 的智能语音系统,通过硬件集成实现了低功耗下的语音唤醒与关键词识别,响应迅速且无需依赖云端。系统可通过扩展关键词库支持更多指令,适用于智能家居、车载交互等场景。未来可优化方向:引入语音合成模块实现语音反馈,结合机器学习算法提升噪声环境下的识别率,进一步降低系统功耗以适应电池供电场景。
