AI 编程课
完整教案
自学课件
12 课 · 共 12/48

让板子听见 ——麦克风怎样把声音变成数字

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
配套代码
见项目 demo 目录

自学读本:跟着读、照着做,卡住就问 AI

你好,我是吴老师。

这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。

读完之后,你应该能:说清麦克风和扬声器在"声↔电"上是反过来的;解释 ADC 怎么把声音变成数字;说出回声程序在搬什么;用一个数表示"这一段声音有多大"。

用时:60–90 分钟。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy。


一、上一课的反向操作

上一课我们让板子开口:你会生成数字、送出去,扬声器就响。

这一课把它整个倒过来:让板子听见

先做最直观的实验:对板子说一句话,它一字不差地重复给你听。这个实验叫回声(echo),就像对着山谷喊话。

动手之前先想一个反直觉的问题:说话是空气振动撞到耳朵,可板子没有耳朵,它只有数字。你说的话到了板子里,会变成什么?

——变成一堆数字。

那它是怎么把"空气振动"变成数字的?往下看。

二、先做回声实验

请使用课程的 esp32s3-touchboard-hardware-dev Skill,做一个"回声"程序:
板子从麦克风连续采声音,把采到的声音立刻从扬声器放出来,
就像对着山谷喊话一样。初始化音频时复用本课例程里 ES8311 + I2S 的初始化方式。
屏幕显示"回声中,说句话试试"。帮我新建程序并烧录。

对着它说句话。你听到的自己的声音和平常不一样吧?

现象勾选
声音发闷、变扁
有呲啦杂音
尖叫(啸叫)

大部分人听到的自己的录音都"不像自己"。因为平时你说话,声音既从空气传到耳朵,也从骨头直接传到脑袋;录音只剩空气这一路。找同桌听,他们反而觉得像你。

三、麦克风:一面反过来工作的"鼓"

上一课扬声器是"电动的鼓":电压变 → 纸盆动 → 空气推。

麦克风刚好反过来:空气推 → 纸盆动 → 产生微弱电压。

扬声器麦克风
谁先动电压先动,纸盆跟着动纸盆先动,电压跟着产生
能量方向电 → 声声 → 电

⚠️ 比喻有边界:现在手机里那种小话筒(MEMS)没有看得见的"纸盆",但"声 → 电"的方向不变。

麦克风给出的电压又小又连续,可板子只会处理数字。怎么进去?——靠 ADC。

四、ADC:给电压"拍照"

第 11 课的 DAC 把数字变电压;这一课的 ADC 反过来:电压变数字。

ADC 的干活方式就是拍照

每隔一小段固定时间,看一眼电压多大,记成一个数字。看一眼记一个,再看一眼再记一个。

  • 每秒"拍"多少次 = 采样率(上次是"送"的节奏,这次是"拍"的节奏)
  • 每个数字分多细 = 位深。我们用 16 位:把电压分成 65536 格,每格一个数字

整条录音链:

空气振动 → 麦克风 → 微弱电压 → ADC 按节奏拍照成数字 → 数字存起来

五、声波的样子:上上下下的一串数

你的话变成一长串数字,画出来是波浪状:

  • 起伏多快 = 频率 → 音调
  • 起伏多高 = 振幅 → 响度(音量)
  • 起伏什么形状 = 波形 → 音色

音量在程序里 = 这些数字离开中间 0 有多远。 数字都贴着 0 → 安静;数字冲很高 → 响。

六、回声在搬什么

回声程序的中文伪代码:

不断重复:
    从麦克风读一串数字
    把这一串数字原样送出去

读进来什么样,送出去就什么样——板子并不"理解"你的话,它只是忠实地把数字搬了个家。让板子听懂话(语音识别),是以后联网课程的事。

七、让屏幕看见声音:音量柱

怎么用一个数代表"这段声音多大"?

简单办法:把 0.1 秒内所有采样(1600 个)的绝对值加起来除以个数 → 平均音量

请做一个"音量指示器":
麦克风每 0.1 秒算一次平均音量,
屏幕左边画一根柱子,音量越大柱子越高(超过安全值变红),
上面实时显示音量数值。柱子要平滑变化,不要乱跳。

然后测三个场景:

场景我预测实际
安静
正常说话

"响"在程序里不是感觉,是数字。 安静时几十,说话时几百上千,喊叫更高。

八、啸叫是什么

板子靠近扬声器,可能听到刺耳尖叫——啸叫

声音链:扬声器放出 → 麦克风收进 → 放大 → 再放出……绕圈变大,变成尖叫。

我做的操作看到/听到
板子靠近喇叭
移开

这不是故障,是"回声变成循环"。电话会议、演唱会都怕它。你能想一个简单的压制办法吗?(提示:声音已经很大时,别急着放大。)

九、没声音排查

现象先检查
回声没声音串口报初始化失败了吗?麦克风方向对吗?
声音很轻调大音量
全是嘶嘶底噪去安静环境;看缓冲大小
一冲一冲读和放是不是互相堵死了

十、过关检查

不看 AI,自己说:

  1. 麦克风和扬声器在声↔电方向上的关系?
  2. ADC 干什么?和 DAC 什么关系?
  3. 采样率、位深各决定什么?用"拍照"怎么解释?
  4. 回声程序在搬什么?板子理解你说的话吗?
  5. 音量在程序里是什么?怎么算?
  6. 啸叫哪来的?

十一、还能玩什么

方向想法
噪音报警器音量超阈值屏幕变红 + 灯亮
拍手开关灯拍一下亮、再拍灭(要区分一次和两次)
吹气游戏吹气让屏幕上的球飞起来
神秘低语回声 + 上一课变调,变机器人音

想做"板子听得懂人话"?那叫语音识别,等学了网络再回来。今天先把"收数字"练熟——下一课我们要打开盖子,看这些数字是怎么在两根线之间跑起来的。

本节配套资源 · 在线烧录

查看全部固件 →

下列演示程序已编译为可烧录固件。把你的 ESP32-S3 触摸屏板 用 USB 接上电脑(需 Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装任何软件。

第 12 课 · 回声
可烧录

对它说话,声音立刻从扬声器重复出来。板子不理解的你的话,只是把数字原样搬了个家。

12 麦克风 回声
第 12 课 · 音量指示器
可烧录

麦克风音量变成屏幕上的柱子:安静、说话、喊叫三种档位看得一清二楚。响在程序里是数字。

12 麦克风 音量
第 12 课 · 噪音报警器
可烧录

音量超过阈值,屏幕变红加 RGB 灯亮,安静下来恢复。听 + 判断 + 输出,报警器的基本链路。

12 麦克风 报警
第 12 课 · 拍手开关灯
可烧录

拍一下手灯亮、再拍一下灭。第一次把声音当成事件处理:响起来又安静下去才算一次,带冷却防误触。

12 麦克风 事件