🌟 完整项目和代码
本教程是 AI 入门 30 天挑战 系列的一部分!
- 💻 GitHub 仓库 : https://github.com/Lee985-cmd/AI-30-Day-Challenge
- 📖 CSDN 专栏 : https://blog.csdn.net/m0_67081842?type=blog
- ⭐ 欢迎 Star 支持!
Week 3 第六天:让电脑听懂人话!
Siri、小爱同学的核心技术!
每个概念都解释!每行代码都说明白!
预计时间:3-4 小时(含费曼输出练习)
📖 第 1 步:快速复习昨天的内容(30 分钟)
费曼输出 #0:考考你
合上教程,尝试回答:
□ BERT 的核心创新是什么?为什么比之前的模型好?
□ 预训练和微调有什么区别?用例子说明
□ GPT 和 BERT 各有什么特点?适合什么场景?
□ 大语言模型的"涌现能力"是什么意思?
□ 如果要做一个智能客服系统,你会怎么设计?
⏰ 时间:25 分钟
如果能答出 80% 以上,我们开始今天的语音识别之旅!如果不够,花 5 分钟翻一下 Day19 的笔记。
🤔 第 2 步:语音识别是什么?(50 分钟)
说人话版本
想象一下这个场景:
你对着手机说:
"明天北京天气怎么样?"
手机听懂了,并回答:
"明天北京晴,最高温度 25 度"
这就是语音识别!
- 输入:声音信号 (声波)
- 输出:文字内容
就像有个速记员:
你说什么,它就记下来什么
而且速度飞快、准确率超高
生活中的例子:同声传译
语音识别就像:
联合国翻译官
你说中文 → 他听进去
然后记录 → 变成文字
最后翻译 → 成英文
整个过程:
声波 → 特征提取 → 识别 → 文字
只不过 AI 做得更快更准!
语音识别能做什么?
真实应用场景:
1. 语音输入法
- 说话变文字
- 比打字快 3 倍
- 解放双手
2. 智能助手
- Siri、小爱同学
- 天猫精灵
- 小度音箱
3. 语音转写
- 会议记录
- 课堂录音转文字
- 访谈整理
4. 字幕生成
- 视频自动字幕
- 直播实时字幕
- 电影翻译
5. 语音控制
- 智能家居
- 车载系统
- 工业控制
🎯 费曼输出 #1:解释语音识别
任务 1:向小学生解释
场景: 有个小朋友问你:"语音识别是什么?"
要求:
- 不用"声波"、"特征提取"、"端到端"这些专业术语
- 用听话、记笔记、翻译等生活场景比喻
- 让小学生能听懂
参考模板:
"语音识别就像一个______。
当你对它说话时,
它会______,
然后______,
最后______。
这样就能______!"
⏰ 时间:15 分钟
💡 卡壳检查点
如果你在解释时卡住了:
□ 我说不清楚声音是怎么变成数字的
□ 我不知道如何解释"识别"的过程
□ 我只能说"AI 听懂",但不能说明白怎么听懂
这很正常! 标记下来,回去再看上面的内容,然后重新尝试解释!
提示:
- 声音 = 空气振动
- 数字化 = 变成一串数字
- 识别 = AI 分析这些数字,猜出你说的什么
📊 第 3 步:从声波到文字详解(60 分钟)
声音的本质
声音是什么?
物理角度:
- 空气振动产生的波
- 有频率 (音调高低)
- 有振幅 (声音大小)
人耳能听到:
- 频率:20Hz - 20kHz
- 说话:85Hz - 255Hz(男), 165Hz - 700Hz(女)
数字化:
- 采样率:每秒采多少个点 (44.1kHz = CD 音质)
- 位深度:每个点的精度 (16bit = 65536 级)
例子:
你说"你好"0.5 秒
→ 采样率 16000Hz
→ 得到 8000 个数字点
→ 这些点组成声波
语音识别的挑战
难点 1:同音词
"公式"vs"公事"vs"工事"
发音一样,意思不同
解决:
- 看上下文
- "请告诉我公式" → 数学公式
难点 2:口音和方言
普通话 vs 粤语 vs 四川话
同一个词,发音不同
解决:
- 多口音训练数据
- 方言模型
难点 3:背景噪音
咖啡厅、马路上的噪音
解决:
- 降噪算法
- 数据增强 (训练时加噪音)
难点 4:语速变化
有人说话快,有人慢
解决:
- CTC Loss(对齐不同长度)
- Attention 机制
难点 5:连续语音
"明天北京天气"不是"明 - 天 - 北 - 京..."
字与字之间没有明显停顿
解决:
- 端到端模型
- 语言模型辅助
🔬 第 4 步:端到端语音识别(90 分钟)
核心思想
端到端 (End-to-End):
输入:声波 (音频文件)
↓
一个神经网络
↓
输出:文字 (字符序列)
特点:
✓ 不需要手工设计特征
✓ 不需要音素、字典等中间步骤
✓ 直接从数据中学习映射关系
就像:
传统方法 = 手工组装汽车
端到端 = 全自动生产线
关键技术 1:CTC Loss
CTC = Connectionist Temporal Classification
解决的问题:
输入和输出长度不一致!
例子:
音频:"你 --- 好 ---"(2 秒,3000 个点)
文字:"你好"(2 个字)
怎么对齐?
CTC 的做法:
1. 允许输出"空白"符号 (-)
2. 合并重复的字符
3. 计算所有可能对齐的概率
演示:
音频帧:1 2 3 4 5 6 7 8
预测:你 你 你 - - 好 好 好
↓ 去掉空白
你 你 你 好 好 好
↓ 合并重复
你 好
优点:
✓ 不需要预先对齐
✓ 自动学习输入输出对应关系
✓ 训练简单
缺点:
❌ 假设输出之间独立 (实际不独立)
❌ 没有语言模型
关键技术 2:Attention-based ASR
Attention 机制:
想法:
识别每个字时,只关注音频的相关部分
例子:
识别"你"时:
- 关注音频的第 1-2 秒
- 忽略其他部分
识别"好"时:
- 关注音频的第 2-3 秒
- 忽略其他部分
好处:
✓ 可以处理长音频
✓ 自动学习对齐
✓ 效果更好
代表模型:
- Listen, Attend and Spell (LAS)
- Transformer ASR
- Whisper
🎯 费曼输出 #2:深入理解技术
任务 1:创造多个比喻
场景 A:解释给音乐老师听
用音乐的例子
声波 = 乐谱
特征提取 = 识谱
识别 = 演奏
文字 = 录下来的音乐
场景 B:解释给作家听
用写作的例子
听写 = 语音识别
构思 = 特征提取
落笔 = 输出文字
修改 = 后处理
场景 C:解释给厨师听
用做菜的例子
食材 = 声音
洗菜切菜 = 特征提取
炒菜 = 识别过程
装盘 = 输出文字
要求: 每个场景都要详细说明
任务 2:解释技术细节
思考题:
1. CTC 是怎么解决长度不一致问题的?
2. Attention 相比 CTC 有什么优势?
3. 为什么端到端方法更好?
4. 语音识别还有哪些挑战?
⏰ 时间:25 分钟
💡 卡壳检查点
□ 我解释不清 CTC 的工作原理
□ 我说不明白 Attention 的优势
□ 我不能用生活中的例子说明
提示:
- CTC = 允许重复和空白,最后合并
- Attention = 重点关注相关部分
- 端到端 = 一步到位
💻 第 5 步:Whisper 实战(70 分钟)
使用 OpenAI 的 Whisper
import torch
import whisper
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import Audio
print("=" * 60)
print("🎤 Whisper 语音识别实战")
print("=" * 60)
# ============================================================================
# 第 1 步:加载 Whisper 模型
# ============================================================================
print("\n【1. 加载 Whisper 模型】")
# 选择模型大小
# tiny: 39M, base: 74M, small: 244M, medium: 769M, large: 1550M
model_size = "base"
print(f"正在加载 {model_size} 模型...")
print("提示:第一次会自动下载,请耐心等待")
model = whisper.load_model(model_size)
print(f"✓ Whisper {model_size} 加载完成")
print(f" 模型参数量:{sum(p.numel() for p in model.parameters()):,}")
# ============================================================================
# 第 2 步:准备音频
# ============================================================================
print("\n" + "=" * 60)
print("【2. 准备测试音频】")
print("=" * 60)
# 方法 1:使用示例音频
print("使用内置示例音频...")
# 如果没有音频,创建一个简单的测试
# 实际使用时替换成你的音频文件
audio_path = "test_audio.wav"
try:
# 加载音频
audio = whisper.load_audio(audio_path)
print(f"✓ 音频加载成功")
print(f" 时长:{len(audio)/16000:.2f} 秒")
print(f" 采样率:16000 Hz")
# 可视化声波
fig, ax = plt.subplots(figsize=(14, 4))
time = np.arange(0, len(audio)) / 16000
ax.plot(time, audio, linewidth=0.5)
ax.set_xlabel('时间 (秒)', fontsize=12)
ax.set_ylabel('振幅', fontsize=12)
ax.set_title('声波图', fontsize=14)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
except Exception as e:
print(f"无法加载音频:{e}")
print("将使用模拟数据进行演示")
# 创建模拟音频(正弦波组合)
duration = 3 # 3 秒
sample_rate = 16000
t = np.linspace(0, duration, int(sample_rate * duration))
# 组合几个频率(模拟元音)
audio = (0.3 * np.sin(2 * np.pi * 300 * t) +
0.3 * np.sin(2 * np.pi * 500 * t) +
0.3 * np.sin(2 * np.pi * 800 * t))
# 加窗函数(让它像语音)
window = np.hanning(len(audio))
audio *= window
print(f"✓ 已创建模拟音频")
print(f" 时长:{duration} 秒")
# ============================================================================
# 第 3 步:语音识别
# ============================================================================
print("\n" + "=" * 60)
print("【3. 开始语音识别】")
print("=" * 60)
print("正在识别...")
# 设置选项
options = {
"language": "zh", # 中文
"task": "transcribe", # 转写(而不是翻译)
"verbose": False
}
# 进行识别
result = model.transcribe(
audio_path if 'audio_path' in locals() else audio,
language=options["language"],
task=options["task"]
)
text = result["text"]
segments = result["segments"]
print(f"\n✅ 识别完成!")
print(f"\n识别结果:")
print(f" {text}")
# ============================================================================
# 第 4 步:显示详细结果
# ============================================================================
print("\n" + "=" * 60)
print("【4. 详细分析】")
print("=" * 60)
print(f"\n完整文本:")
print(f" {text}")
print(f"\n分段结果:")
for i, segment in enumerate(segments, 1):
start = segment["start"]
end = segment["end"]
content = segment["text"]
print(f"\n片段 {i}:")
print(f" 时间:{start:.2f}s - {end:.2f}s")
print(f" 内容:{content}")
print(f" 时长:{end-start:.2f}秒")
# ============================================================================
# 第 5 步:可视化注意力(如果可用)
# ============================================================================
if hasattr(model, 'decoder') and hasattr(model.decoder, 'layers'):
print("\n" + "=" * 60)
print("📊 可视化 Attention 权重")
print("=" * 60)
try:
# 获取最后一个 decoder layer 的 attention
with torch.no_grad():
# 这里简化演示,实际会更复杂
print("注意:完整的 attention 可视化需要更复杂的处理")
print("这里展示概念图")
# 画一个概念图
fig, ax = plt.subplots(figsize=(10, 8))
# 模拟 attention 矩阵
n_frames = 50 # 音频帧数
n_tokens = len(text) * 2 # 文字 token 数
# 创建一个对角线为主的矩阵(模拟对齐)
attention = np.zeros((n_tokens, n_frames))
for i in range(n_tokens):
center = int(i * n_frames / n_tokens)
width = max(3, n_frames // (n_tokens * 2))
start = max(0, center - width)
end = min(n_frames, center + width)
attention[i, start:end] = 1.0
# 归一化
attention = attention / attention.sum(axis=1, keepdims=True)
im = ax.imshow(attention, cmap='Blues', aspect='auto')
ax.set_xlabel('音频帧', fontsize=12)
ax.set_ylabel('文字 Token', fontsize=12)
ax.set_title('Attention 权重示意图', fontsize=14)
plt.colorbar(im, ax=ax, label='Attention 强度')
plt.tight_layout()
plt.show()
print("\n💡 Attention 的作用:")
print(" - 识别每个字时,关注对应的音频部分")
print(" - 亮色区域 = 高关注度")
print(" - 可以看到字和音频的对齐关系")
except Exception as e:
print(f"Attention 可视化失败:{e}")
print("这不影响使用,继续下面的内容")
print("\n🎊 恭喜!你完成了 Whisper 语音识别实战!")
print("=" * 60)
# ============================================================================
# 第 6 步:实际应用建议
# ============================================================================
print("\n" + "=" * 60)
print("【6. 实际应用建议】")
print("=" * 60)
print("""
使用场景推荐:
1. 会议记录:
✓ 录制会议音频
✓ 用 Whisper 转文字
✓ 人工校对关键信息
✓ 自动生成会议纪要
2. 视频字幕:
✓ 提取视频音频
✓ 语音识别生成字幕
✓ 调整时间轴
✓ 导出 SRT 格式
3. 语音输入法:
✓ 实时录音
✓ 流式识别
✓ 即时显示文字
✓ 支持标点符号
4. 客服质检:
✓ 录音转文字
✓ 关键词检测
✓ 情感分析
✓ 自动生成报告
注意事项:
✓ 音频质量很重要
- 尽量清晰、无噪音
- 采样率至少 16kHz
✓ 选择合适的模型
- tiny/base: 快速测试
- small/medium: 生产环境
- large: 追求最佳效果
✓ 后处理有必要
- 纠正同音词错误
- 添加标点符号
- 格式化数字、日期
✓ 隐私保护
- 敏感数据本地处理
- 不要上传机密信息
""")
print("\n🎉 语音识别实战完成!")
print("=" * 60)
按 Shift + Enter 运行!
🎉 今日费曼总结(30 分钟)⭐
完整的费曼学习流程
第 1 步:回顾今天的内容(5 分钟)
□ 语音识别的基本概念
□ 从声波到文字的转换
□ CTC 和 Attention 机制
□ Whisper 实战应用
第 2 步:合上教程,尝试完整教授(15 分钟)⭐
任务: 假装你在给一个完全不懂的人上第二十堂课
要覆盖:
- 语音识别是怎么工作的(用至少 2 个比喻)
- 声音是怎么变成数字的
- CTC 和 Attention 各有什么特点
- 演示一个实际的语音识别应用
方式:
- 📝 写一篇 800 字左右的文章
- 🎤 录一段 10-15 分钟的视频
- 👥 找个朋友,给他讲一遍
第 3 步:标记卡壳点(5 分钟)
我今天卡壳的地方:
□ _________________________________
□ _________________________________
□ _________________________________
第 4 步:针对性复习(5 分钟)
回到教程中卡壳的地方,重新学习,然后再次尝试解释!
📝 费曼学习笔记模板
╔═══════════════════════════════════════════════════╗
║ Day 20 费曼学习笔记 ║
╠═══════════════════════════════════════════════════╣
║ 日期:__________ ║
║ 学习时长:__________ ║
╠═══════════════════════════════════════════════════╣
║ ║
║ 1. 我向小白解释了: ║
║ _______________________________________________ ║
║ _______________________________________________ ║
║ ║
║ 2. 我卡壳的地方: ║
║ □ _____________________________________________ ║
║ □ _____________________________________________ ║
║ ║
║ 3. 我的通俗比喻: ║
║ • 语音识别就像 ______ ║
║ • 声波就像 ______ ║
║ • CTC 就像 ______ ║
║ • Attention 就像 ______ ║
║ ║
║ 4. 我还想知道: ║
║ _______________________________________________ ║
║ ║
╚═══════════════════════════════════════════════════╝
📊 今日总结
✅ 你今天学到了:
1. 语音识别基础
- 声波数字化
- 识别的挑战
- 应用场景
2. 核心技术
- CTC Loss
- Attention 机制
- 端到端识别
3. 实践能力
- 使用 Whisper
- 加载和处理音频
- 可视化和分析
4. 费曼输出能力 ⭐
- 能用比喻解释语音识别
- 能向小白说明识别过程
- 能完整讲解技术应用
🎁 明日预告
明天你将学习:
主题:Week 3 综合项目
内容:
✓ 综合运用 Week 3 的知识
✓ 选择一个完整项目
✓ 目标检测 or 图像分割 or GAN
✓ 从数据到部署的全流程
✓ 项目展示和总结
需要准备:
✓ 复习 Week 3 的所有内容
✓ 想好要做什么项目
✓ 保持好奇心!
只剩最后一天了!
- Day21: Week3 综合项目(完整深度学习项目)
准备好完成 Week 3 的最后冲刺吗?🚀
🔗 相关链接
🌐 项目资源
- 💻 GitHub 仓库 : https://github.com/Lee985-cmd/AI-30-Day-Challenge
- 📖 CSDN 专栏 : https://blog.csdn.net/m0_67081842?type=blog
- ⭐ 如果觉得有帮助,请给 GitHub 仓库 Star 支持!
本教程属于 AI 入门 30 天挑战 系列
🎉 恭喜你完成今天的学习!
🔗 资源汇总
- 📘 完整 30 天教程 :CSDN 专栏 - AI 入门 30 天挑战
- 💻 完整代码 + 项目实战 :GitHub 仓库 ⭐欢迎 Star
- ❓ 遇到问题 :GitHub Issues 提问
💬 互动时间
思考题:今天的知识点中,哪个让你印象最深刻?为什么?
欢迎在评论区分享你的想法或疑问!👇
❤️ 如果有帮助
- 👍 点赞:让更多人看到这篇教程
- ⭐ Star GitHub:获取完整代码和项目
- ➕ 关注专栏:不错过后续更新
- 🔄 分享给朋友:一起学习进步
明天见!继续 Day 21 的学习~ 🚀
📱 关于作者 & 获取更多资源
本教程由 Lee(职场宝爸) 创建,记录从零基础到独立完成 AI 项目的真实历程。
其他平台
- 📂 GitHub :https://github.com/Lee985-cmd/AI-30Days-Challenge
- 📝 CSDN 博客 :https://blog.csdn.net/m0_67081842
💡 学习建议
如果本篇教程对你有帮助,欢迎:
- Star GitHub 项目 :https://github.com/Lee985-cmd/AI-30Days-Challenge
- 留言交流你的学习困惑
一起学习,一起进步! 🤝