自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说清"存声音"和"存计数器"是同一件事;解释 WAV 文件头(自述信)里有什么;把录音的字节数算出来;说出播放 WAV 时怎么跳过文件头。
用时:90 分钟。准备:板子、MicroSD 卡(已格式化)、数据线、已经接入板卡 Skill 的 WorkBuddy。
一、三件会的东西,拼成一件新的
你已经有三个"半成品":
- 第 12 课:对着板子说话,麦克风把它变成数字(回声)
- 第 14 课:把数字写进 SD 卡,重启还在
- 第 11 课:把数字送出去,扬声器就响
回声是"边收边放",停机就没了。但如果把收进来的数字像计数器一样写进 SD 卡呢?
那样你说的话就留下来了——这就是声音留言机。
二、存声音 = 存数字
录音在板子里是一大串数字:一秒 16000 个,每个 2 字节。
所以"存声音"和存 count.txt 是同一件事:把数字一个接一个写进文件。
但文件里只有一串数字,别人怎么知道它是声音、每秒几个、多大、几个声道?
需要"自我介绍"——这就是文件头。
三、WAV:声音文件的"自述信"
我们用的格式叫 WAV:
┌──────────────────────────────┐
│ 文件头(前 44 字节 = 自述信) │
│ · 我是 WAV/RIFF │
│ · 采样率:16000 │
│ · 位深:16 │
│ · 声道:2 │
│ · 数据多长 │
├──────────────────────────────┤
│ 声音数据(一串 16 位数字) │
└──────────────────────────────┘
播放器拿到 WAV,先读 44 字节"自述信",就全明白了。参数改了头就要改,否则按错的节奏读。
四、录音存盘的套路
准备:PSRAM 申请大内存;打开 record.wav;先留出 44 字节头
录音(按 BOOT):从麦克风读数字攒进内存,屏显秒数;录够停
写文件:把内存数字写在头后面;回头填上"数据多长";close()
工程细节:数据长度要录完才知道,所以头先空着,写完回头填。
五、播放 = 拆包
打开 record.wav
读 44 字节自述信
跳过文件头,从数据开始:读一小段 → 送出去 → 再读 → 再送
到结尾关闭
和回声的区别只有一处:回声送"麦克风收来的数字",播放送"文件里读出来的数字"。
六、先想好三个"多久"
- 录多久? 3 秒 ≈ 16000×3×2×2 ≈ 192KB → 内存够吗?要 PSRAM
- 存几个文件? 覆盖旧的,还是 note_1、note_2 一直加?
- 何时算录完? 到秒数自动停,还是再按一次?
没有标准答案,但决定"这台留言机怎么用"。这就是设计取舍,真正的作品从这开始。
七、故障排查
| 现象 | 先检查 |
|---|---|
| 录完没声音 | WAV 头写对了吗?字节数填对了吗? |
| 声音变尖变快 | 播放采样率和头里写的一致吗? |
| 断断续续 | 一次读太少了,缓冲大一点 |
| 电脑打不开文件 | 44 字节头写错了 |
八、过关检查
- 为什么存声音和存计数器是同一件事?
- WAV 头写哪几样?像什么?
- 3 秒录音约多少字节?为什么用 PSRAM?
- 播放怎么知道从哪开始是声音数据?
- 数据长度先不知道,怎么解决?
- 录音存文件和回声最大区别?
九、还能玩什么
- 多条留言(序号文件、来回切换)
- 变声留言机(播放时隔一取一)
- 会说话的相册(照片配录音)
- 语音小抄(录英语循环播)
下一课反着来:不录只放,放卡里现成的 MP3——第 16 课,本章收尾。