# 第6周：语音处理基础 - 讲义

## 教学目标

| 目标 | 内容 |
|-----|------|
| 知识目标 | 理解音频信号采集原理、语音唤醒概念 |
| 能力目标 | 能够使用Edge Impulse训练并部署关键词识别模型 |
| 情感目标 | 建立"让设备听懂人话"的信心 |

---

## 课程导入（10分钟）

### 6.1 开场Demo设计

**Demo名称：语音控制灯**

**演示流程：**
1. 老师说"开灯" → ESP32的LED亮起
2. 老师说"关灯" → ESP32的LED熄灭
3. 引导：这节课学完，你们也能做出来

**引导语：**
> "同学们，刚才喊'开灯'灯就亮了——这是你们这学期要学的核心技能：让设备听懂人的话。今天学完语音处理基础，你们也能做出来。"

---

## 原理讲解（40分钟）

### 6.2 声音的数字化

#### 6.2.1 声音是什么

```
声音 = 空气振动
     = 连续的模拟信号

数字化过程：
┌────────────────────────────────────────────────────────────┐
│  模拟信号（连续）→ 采样 → 量化 → 编码 → 数字信号（离散）    │
└────────────────────────────────────────────────────────────┘
```

#### 6.2.2 采样率

| 采样率 | 质量 | 应用场景 |
|--------|------|---------|
| 8 kHz | 电话质量 | 电话通信 |
| 16 kHz | 宽带 | 语音识别 |
| 44.1 kHz | CD质量 | 音乐播放 |
| 48 kHz | 专业 | 录音棚 |

**奈奎斯特定理**：采样率 ≥ 2 × 最高频率
- 人声频率：300Hz ~ 3400Hz → 采样率≥8kHz即可

#### 6.2.3 音频参数

```cpp
// ESP32音频采集参数
const int SAMPLE_RATE = 16000;   // 采样率 16kHz
const int SAMPLE_BITS = 16;     // 位深 16bit
const int CHANNEL = 1;           // 单声道
```

---

### 6.3 I2S协议

#### 6.3.1 I2S是什么

```
I2S = Inter-IC Sound
     IC间音频总线
```

**特点：**
- 专门用于音频数据传输
- 高质量同步串行通信
- 立体声/单声道支持

#### 6.3.2 I2S接线

```
ESP32              MAX9814麦克风
---------          ------------
GPIO32 (I2S_WS)  →  WS
GPIO33 (I2S_SCK) →  SCK
GPIO34 (I2S_SD)  ←  DOUT (数据输出)
3.3V             →  VDD
GND              →  GND
```

---

### 6.4 MAX9814麦克风模块

#### 6.4.1 模块特点

```
MAX9814特性：
• 内置自动增益控制 (AGC)
• 低噪声前置放大器
• 3V-5V供电
• 模拟音频输出
• 增益可调 (40dB/50dB/60dB)
```

#### 6.4.2 接线图

```
ESP32 GPIO32 ──→ MAX9814 OUT (模拟输出)
                │
                ├──→ ESP32 GPIO34 (ADC测量)  ← 不需要！

注意：MAX9814是模拟输出，不需要接ADC！
      ESP32有I2S接口直接采集模拟音频
```

---

### 6.5 语音识别类型

#### 6.5.1 关键词识别 vs 连续语音识别

| 类型 | 特点 | 例子 |
|------|------|------|
| 关键词识别 | 检测特定词 | "Hey Siri"、"小爱同学" |
| 命令词识别 | 检测预设命令 | "开灯"、"关灯" |
| 连续语音识别 | 转文字 | 语音输入法 |

**我们课程使用的是：命令词识别（Keyword Spotting）**

#### 6.5.2 TinyML边缘AI

```
传统语音识别：
┌──────────┐    网络     ┌──────────┐
│  手机   │ ────────→  │  云服务器│  ← 需要网络！
└──────────┘            └──────────┘

TinyML语音识别：
┌──────────┐
│  ESP32  │  ← 本地离线识别，不需要网络！
└──────────┘
```

---

### 6.6 Edge Impulse平台

#### 6.6.1 什么是Edge Impulse

```
Edge Impulse = 边缘AI训练平台
• 在线训练AI模型
• 自动优化到嵌入式设备
• 支持ESP32、Arduino等
• 免费的云端服务
```

#### 6.6.2 使用流程

```
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  1️⃣ 数据采集 → 录制"开灯"和"关灯"的音频样本                 │
│                                                             │
│  2️⃣ 特征提取 → 将音频转换为MFCC特征图                        │
│                                                             │
│  3️⃣ 模型训练 → 训练神经网络分类器                          │
│                                                             │
│  4️⃣ 部署 → 生成ESP32可运行的库文件                         │
│                                                             │
│  5️⃣ 集成 → 在Arduino项目中使用模型                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

---

## 实验操作（40分钟）

### 6.7 实验：关键词识别

#### 实验目的
- 学会使用Edge Impulse采集音频数据
- 训练关键词识别模型
- 部署模型到ESP32

#### 实验器材
- ESP32-S3开发板 × 1
- MAX9814麦克风模块 × 1
- 杜邦线若干

#### 实验步骤

**1. Edge Impulse注册与项目创建**
```
1. 访问 https://www.edgeimpulse.com
2. 注册账号（可用Google账号）
3. 创建新项目 → 输入项目名 → 选择ESP32
```

**2. 连接设备采集数据**
```
1. 在项目中选择"Devices" → "Connect a new device"
2. 选择"Use your computer's microphone"
3. 按照提示录制音频样本
```

**3. 采集训练数据**
```
• 录制10-20个"开灯"的样本（不同人说、不同语调）
• 录制10-20个"关灯"的样本
• 录制5-10分钟的背景噪音
```

**4. 创建Impulse**
```
1. Create Impulse
2. 设置：Time series (1秒) → 窗长 1000ms
3. Processing → 添加 "Audio (MFE)"
4. Learning → 添加 "Neural Network (Keras)"
5. 保存
```

**5. 训练模型**
```
1. 提取特征
2. 训练参数：训练周期 30，训练集 80%
3. 训练完成查看准确率（应>85%）
```

**6. 部署到ESP32**
```
1. Deployment → 选择 "Arduino library"
2. 构建 → 下载库
3. Arduino IDE：项目 → 加载库 → 添加 .zip 库
```

**7. Arduino代码**
```cpp
#include <your_model_inference.h>

// 模型推断
if (microphone_inference_record()) {
    signal_t signal;
    signal.get_features = microphone_audio_features;
    int prediction = inference_classify(&signal);
    
    if (prediction == 0) {
        Serial.println("检测到: 开灯");
        digitalWrite(LED_PIN, HIGH);
    } else if (prediction == 1) {
        Serial.println("检测到: 关灯");
        digitalWrite(LED_PIN, LOW);
    }
}
```

---

## 知识总结

### 6.8 音频数字化核心参数

```
采样率：每秒采集多少次（16kHz语音识别常用）
位深度：每次采样的精度（16bit）
声道数：单声道/立体声
时长窗口：每次识别的音频片段长度
```

### 6.9 语音识别流程

```
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  原始音频 → 预加重 → 分帧 → 加窗 → FFT → Mel滤波器 → MFCC  │
│                                                             │
│  MFCC特征图 ──→ 神经网络 ──→ 分类结果（开灯/关灯/噪音）    │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

---

## 课后作业

1. **理论题**：解释采样率和位深度
2. **实践题**：在Edge Impulse上完成"开灯""关灯"模型训练
3. **思考题**：为什么TinyML比云端语音识别更适合物联网场景？

---

## 延伸阅读

- Edge Impulse官方文档：https://docs.edgeimpulse.com
- 《TinyML》第4章：语音识别
