基于 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;          // 识别到的关键词ID

void 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 的智能语音系统,通过硬件集成实现了低功耗下的语音唤醒与关键词识别,响应迅速且无需依赖云端。系统可通过扩展关键词库支持更多指令,适用于智能家居、车载交互等场景。未来可优化方向:引入语音合成模块实现语音反馈,结合机器学习算法提升噪声环境下的识别率,进一步降低系统功耗以适应电池供电场景。

相关推荐
D.....l3 小时前
STM32学习(MCU控制)(DMA and ADC)
stm32·单片机·学习
循着风5 小时前
二叉树的多种遍历方式
数据结构·算法
.格子衫.10 小时前
022数据结构之树状数组——算法备赛
数据结构·算法·1024程序员节
黑科技Python10 小时前
生活中的“小智慧”——认识算法
学习·算法·生活
兆龙电子单片机设计10 小时前
【STM32项目开源】STM32单片机多功能饮水机系统
stm32·单片机·物联网·开源·毕业设计
sali-tec11 小时前
C# 基于halcon的视觉工作流-章52-生成标定板
开发语言·图像处理·人工智能·算法·计算机视觉
IT古董11 小时前
【第五章:计算机视觉-项目实战之推荐/广告系统】2.粗排算法-(4)粗排算法模型多目标算法(Multi Task Learning)及目标融合
人工智能·算法·1024程序员节
熬了夜的程序员11 小时前
【LeetCode】89. 格雷编码
算法·leetcode·链表·职场和发展·矩阵
對玛祷至昏12 小时前
数据结构理论知识
数据结构·算法·排序算法