Skip to content

Latest commit

 

History

History
345 lines (267 loc) · 8.34 KB

File metadata and controls

345 lines (267 loc) · 8.34 KB

ESP-SR与MicroPython完整集成指南

🎯 项目概述

本项目成功将乐鑫ESP-SR语音识别框架集成到MicroPython中,实现了完整的语音唤醒和命令识别功能。基于project-i2s-wakup项目的C代码实现,完全复现了其功能和逻辑。

📋 功能特性

✅ 已实现功能

  • 语音唤醒检测: 支持"嗨,小乐"、"小乐小乐"等唤醒词
  • 命令词识别: 支持空调控制、灯光控制等多种指令
  • 实时语音处理: 基于AFE (Audio Front-End) 音频前端处理
  • I2S音频输入: 完整的数字麦克风接口支持
  • 脉冲输出: GPIO4脉冲信号输出,用于指示识别结果
  • 自定义命令: 支持动态添加自定义语音命令
  • 多种检测模式: 单次检测、连续监听等

📊 预设命令词

ID 命令拼音 中文含义 类型
0 xiao le xiao le 小乐小乐 唤醒词
1 hai xiao le 嗨小乐 唤醒词
2 da kai kong tiao 打开空调 控制指令
3 guan bi kong tiao 关闭空调 控制指令
4 zeng da feng su 增大风速 控制指令
5 jian xiao feng su 减小风速 控制指令
6 sheng gao yi du 升高一度 控制指令
7 jiang di yi du 降低一度 控制指令
8 zhi re mo shi 制热模式 控制指令
9 zhi leng mo shi 制冷模式 控制指令
10 da kai deng 打开灯 控制指令
11 guan bi deng 关闭灯 控制指令

🔧 硬件要求

ESP32-S3开发板

  • Flash: 8MB
  • PSRAM: 必需 (语音模型需要大量内存)
  • CPU频率: 240MHz (推荐)

I2S数字麦克风 (INMP441)

ESP32-S3 引脚    INMP441引脚
GPIO5           SCK (串行时钟)
GPIO4           WS  (字选择信号)
GPIO6           SD  (串行数据)
GND             GND
3.3V            VCC

脉冲输出指示

GPIO4           LED正极 (通过电阻)
GND             LED负极

📦 软件环境准备

1. ESP-IDF环境

# 安装ESP-IDF 5.2+
git clone https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
source export.sh

2. MicroPython源码

# 获取MicroPython源码
git clone https://github.com/micropython/micropython.git
cd micropython

# 获取ESP-SR组件 (自动通过组件管理器获取)
# 无需手动下载,idf_component.yml会自动处理

🔨 编译步骤

1. 配置文件准备

所有配置文件已准备完毕:

  • ports/esp32/main_esp32s3/idf_component.yml - ESP-SR组件依赖
  • ports/esp32/boards/ESP32_GENERIC_S3/partitions-8MiB-sr.csv - 分区表
  • ports/esp32/boards/ESP32_GENERIC_S3/sdkconfig.board - 硬件配置
  • ports/esp32/modespsr.c - ESP-SR模块绑定

2. 编译固件

cd micropython/ports/esp32

# 清理之前的编译
rm -rf build-*
make clean

# 设置ESP-IDF环境
source $ESP_IDF_PATH/export.sh

# 编译固件
make BOARD=ESP32_GENERIC_S3

# 编译成功后会生成:
# build-ESP32_GENERIC_S3/micropython.bin - 主固件
# build-ESP32_GENERIC_S3/bootloader/bootloader.bin - 引导程序

3. 获取模型文件

project-i2s-wakup项目编译生成模型文件:

cd project-i2s-wakup

# 编译C项目以生成模型文件
idf.py build

# 生成的模型文件位于:
# build/srmodels.bin

📱 烧录步骤

1. 烧录固件和模型

# 烧录完整固件 (包含模型数据)
cd micropython/ports/esp32
idf.py -p /dev/ttyUSB0 flash

# 单独烧录模型文件 (如果需要)
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 \
    write_flash 0x1EB000 /path/to/project-i2s-wakup/build/srmodels.bin

2. 验证烧录

# 连接串口监视器
idf.py -p /dev/ttyUSB0 monitor

# 或使用其他串口工具
minicom -D /dev/ttyUSB0 -b 115200

🎤 使用方法

1. 基础使用

import espsr
import time

# 初始化ESP-SR系统
espsr.init()

# 获取支持的命令
commands = espsr.get_commands()
print("支持的命令:", commands)

# 单次检测
result = espsr.detect_once()
if result:
    print("检测结果:", result)

# 连续监听 (30秒超时)
result = espsr.listen(30)
if result:
    if result['type'] == 'wakeup':
        print("检测到唤醒词!")
    elif result['type'] == 'command':
        print(f"检测到命令: ID={result['command_id']}")

# 清理资源
espsr.cleanup()

2. 运行演示程序

# 运行完整演示
exec(open('espsr_demo.py').read())

# 或运行简化版本
exec(open('logic.py').read())

3. 添加自定义命令

# 添加自定义命令
espsr.add_command(20, "ni hao shi jie")  # 你好世界
espsr.add_command(21, "zai jian")        # 再见

# 获取模型信息
model_info = espsr.get_model_info()
print("模型信息:", model_info)

# 发送测试脉冲
espsr.send_pulse()

🛠️ API参考

espsr模块方法

方法 参数 返回值 描述
init() bool 初始化ESP-SR系统
detect_once() dict/None 单次语音检测
listen(timeout) timeout(秒) dict/None 连续监听指定时间
add_command(id, text) id, text None 添加自定义命令
get_commands() dict 获取所有命令列表
get_model_info() dict 获取模型配置信息
send_pulse() None 发送GPIO脉冲信号
cleanup() None 清理系统资源

返回结果格式

唤醒词检测结果

{
    'type': 'wakeup',
    'model_index': 0,      # 模型索引
    'word_index': 1,       # 词汇索引
    'state': 'WAKENET_DETECTED'
}

命令词检测结果

{
    'type': 'command',
    'command_id': 2,       # 命令ID
    'phrase_id': 0,        # 短语ID
    'prob': 0.95,          # 置信度
    'num_results': 1       # 结果数量
}

其他状态

{'type': 'detecting'}           # 正在检测
{'type': 'timeout'}            # 检测超时
{'type': 'channel_verified'}   # 通道验证

🔍 故障排除

编译问题

1. ESP-SR组件未找到

ERROR: Failed to resolve component 'esp-sr'

解决方案: 检查网络连接,组件管理器会自动下载ESP-SR组件。

2. 内存不足

region `iram0_0_seg' overflowed

解决方案: 启用PSRAM,检查sdkconfig.board中的PSRAM配置。

3. 分区表错误

Partition table binary not found

解决方案: 确保partitions-8MiB-sr.csv文件存在且格式正确。

运行时问题

1. 模型初始化失败

RuntimeError: SR model initialization failed!

解决方案:

  • 检查是否烧录了模型文件到model分区
  • 验证模型文件完整性
  • 确保分区表配置正确

2. I2S初始化失败

RuntimeError: I2S initialization failed!

解决方案:

  • 检查I2S引脚连接
  • 确认麦克风供电正常
  • 验证引脚配置无冲突

3. 检测无结果

  • 检查麦克风方向和距离
  • 确认环境噪音水平
  • 调整语音命令发音清晰度

📊 性能参数

内存使用

  • Flash使用: ~3MB (固件) + 2.26MB (模型)
  • RAM使用: ~200KB (运行时)
  • PSRAM使用: ~1-2MB (音频缓冲)

检测性能

  • 检测延迟: <200ms
  • 识别准确率: >90% (安静环境)
  • 支持距离: 0.5-3米
  • 工作频率: 16kHz采样率

🔄 版本历史

v1.0.0 (当前版本)

  • ✅ 完整ESP-SR集成
  • ✅ MultiNet中文模型支持
  • ✅ I2S音频接口
  • ✅ 预设命令词系统
  • ✅ 脉冲输出功能
  • ✅ 自定义命令支持

📝 待开发功能

计划中功能

  • 多语言模型支持
  • 音频录制和回放
  • 网络命令传输
  • 语音合成集成
  • 更多音频编解码格式

🙏 致谢

本项目基于以下开源项目:

  • ESP-IDF - 乐鑫ESP32开发框架
  • ESP-SR - 乐鑫语音识别框架
  • MicroPython - Python在微控制器上的实现
  • project-i2s-wakup - C语言参考实现

📧 技术支持

如遇问题,请检查:

  1. 硬件连接是否正确
  2. 固件和模型是否完整烧录
  3. ESP-IDF版本兼容性
  4. 参考故障排除章节

🎉 恭喜!你现在拥有了一个完整的ESP32-S3语音识别系统,可以通过"嗨,小乐"唤醒并执行各种语音指令!