IoT-For-Beginners 实战:为 Raspberry Pi 配置麦克风与扬声器(智能定时器语音识别硬件准备篇)
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本篇技术指南是微软开源课程项目 IoT-For-Beginners《使用 IoT 设备识别语音》一课(课程目录见 6-consumer/lessons/1-speech-recognition/README.md)中面向 Raspberry Pi(树莓派)单板机的硬件准备指南。文章完整讲解如何为树莓派外接麦克风与扬声器、如何用arecord/aplay识别 ALSA 声卡、如何编辑alsa.conf设置默认回放设备,并最终完成 5 秒录音与回放的端到端验证。读完本文,你将掌握一套可在树莓派上直接复用的音频设备排查与配置流程,为后续实现"按住按钮说话→云端语音转文字"的智能厨房定时器打下硬件基础。
硬件选型:树莓派没有内置麦克风
树莓派主板本身不包含麦克风,任何语音识别应用都必须外接音频采集设备。文档给出了多种可行方案:
- USB 麦克风(最简单、即插即用);
- USB 耳机(麦克风 + 扬声器二合一);
- USB 一体式免提会议扬声器(speakerphone,麦克风与扬声器集成);
- USB 音频适配器 + 带 3.5 mm 接口的麦克风;
- ReSpeaker 2-Mics Pi HAT(官方推荐的双麦克风扩展板,直接叠装在 GPIO 排针上)。
注意:并非所有蓝牙麦克风都能在树莓派上正常工作。如果你使用蓝牙麦克风或蓝牙耳机,可能会在配对或采集音频时遇到问题,建议优先选择 USB 或 HAT 方案。
硬件选型:树莓派的音频输出选项
树莓派自带3.5 mm 耳机插孔,可直接连接耳机、头戴式耳机或扬声器。除此之外,还可以通过以下方式添加音频输出:
- HDMI 音频:通过显示器或电视输出;
- USB 扬声器;
- USB 耳机;
- USB 一体式免提会议扬声器;
- ReSpeaker 2-Mics Pi HAT外接扬声器(接 3.5 mm 插孔或板载 JST 端口)。
对本文的智能定时器项目而言,扬声器的作用不只是"出声"——在本课后续小节中它用于测试麦克风录音是否正常,而在更后面的课程中则用于播放语音反馈。
连接并配置麦克风
第一步:物理连接
使用合适的接线方式连接麦克风,例如插入任一 USB 端口。
第二步:ReSpeaker 2-Mics Pi HAT 的特殊安装流程
如果你选择 ReSpeaker 2-Mics Pi HAT,需要先取下 Grove Base HAT(树莓派传感器扩展板),再将 ReSpeaker HAT 装到原位置:
此处有一个巧妙的设计:本课稍后需要用到一个 Grove 按钮来触发录音,而 ReSpeaker HAT 板载了按钮,因此安装后不再需要 Grove Base HAT。
HAT 装好后还需安装设备驱动,官方 Seeed 入门指南使用git克隆驱动仓库。若你的树莓派尚未安装git,先执行:
sudo apt install git --yes第三步:用arecord -l查看麦克风设备
在树莓派本机终端,或通过 VS Code 远程 SSH 连接后的终端中执行:
arecord -larecord是 ALSA(Advanced Linux Sound Architecture,高级 Linux 声音架构)的录音命令行工具,-l参数用于列出所有音频采集(CAPTURE)硬件设备。输出大致如下:
pi@raspberrypi:~ $ arecord -l **** List of CAPTURE Hardware Devices **** card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0关键操作:记下card后面的数字(即声卡号)。上例中麦克风声卡号为1,稍后在配置文件和 Python 代码中都会用到。
实操建议:Linux 下麦克风配置容易出问题,最简单可靠的做法是只保留一个麦克风,把其他不用的都拔掉。如果只接了一个麦克风,列表中通常只有一条记录。
连接并配置扬声器
第一步:用aplay -l查看扬声器设备
aplay -laplay是 ALSA 的播放工具,-l列出所有音频回放(PLAYBACK)硬件设备。典型输出如下:
pi@raspberrypi:~ $ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 ... card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0你总会看到card 0: Headphones,因为这是树莓派板载的耳机插孔(bcm2835是博通 SoC 的音频控制器)。如果额外接了 USB 扬声器等设备,会以card N: ...的形式一并列出。
第二步:将外部扬声器设为默认设备
如果使用外部扬声器(而非插在板载耳机孔上的耳机/音箱),必须把它配置为 ALSA 默认回放设备,否则播放命令会落到card 0。用终端文本编辑器打开 ALSA 主配置文件:
sudo nano /usr/share/alsa/alsa.conf在nano中用方向键向下滚动,找到下面这一行:
defaults.pcm.card 0将0改为aplay -l输出中目标声卡的编号。以上述输出为例,第二个声卡是card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio],需要把该行改为:
defaults.pcm.card 1配置说明:
defaults.pcm.card是 ALSA PCM 插件层的默认声卡索引,它决定了不带显式设备参数调用aplay/arecord等工具时使用哪块声卡。改为外部声卡编号后,后续的录音与播放命令都会默认走该设备。
修改时用方向键定位到数字,删除后键入新值即可。保存并退出:按Ctrl+x,出现提示后按y确认保存,再按return确认文件名。
测试麦克风和扬声器
录制 5 秒音频
arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav out.wav各参数含义:
| 参数 | 含义 |
|---|---|
--format=S16_LE | 采样格式为 16 位有符号整数、小端字节序(Signed 16-bit Little Endian),这是 WAV 音频最通用的 PCM 编码 |
--duration=5 | 录制时长 5 秒,到时自动停止 |
--rate=16000 | 采样率 16 kHz(16,000 次采样/秒)。这一档位对语音识别模型而言已足够(详见下文"录音背后的数字音频原理") |
--file-type=wav | 输出为 WAV 容器格式,便于直接播放 |
out.wav | 输出文件名 |
命令运行期间对着麦克风说话、唱歌、打节拍或弹奏乐器制造声音。5 秒后录制自动结束。
回放录音
aplay --format=S16_LE --rate=16000 out.wav参数应与录制时保持一致,否则可能出现格式不匹配。播放时从扬声器应能听到刚才录制的声音,可根据需要调整扬声器音量。
调整音量与麦克风增益
如需调整板载麦克风输入音量或麦克风增益,可使用alsamixer交互式混音工具:
alsamixer该工具以字符界面显示各声道的输入/输出电平,用方向键调节、Esc退出。如果播放报错,优先检查你在alsa.conf中设置的defaults.pcm.card是否正确对应到aplay -l列出的声卡。
声卡号在代码中的落地:从命令行到 Python
配置验证完成后,声卡号会被直接写进录音代码,这是"硬件配置"与"应用代码"之间的关键桥梁。同课程的 pi-audio.md 展示了用 PyAudio 采集音频的完整流程,仓库中对应的可运行样例为 code-record/pi/smart-timer/app.py。
在代码中,本文前面记下的两个声卡号分别赋给麦克风与扬声器:
microphone_card_number = 1 # 来自 arecord -l 的卡片号 speaker_card_number = 1 # 来自 aplay -l 的卡片号,即写入 alsa.conf 的那个 rate = 48000 # 采样率,默认 48KHz采集音频时,microphone_card_number作为input_device_index传入,指定 PyAudio 从哪块声卡读取数据;回放时speaker_card_number作为output_device_index传入。可见本文的命令行排查结果(卡片号、采样率)直接决定了 Python 代码能否正确工作。
从源码看,capture_audio()函数以pyaudio.paInt16格式、单声道、4096 字节缓冲逐块读取麦克风数据,在按钮按住期间持续采样,松手后把数据封装为 WAV 字节流返回。若运行时出现如下报错:
OSError: [Errno -9997] Invalid sample rate说明当前声卡不支持 48 kHz,需把rate改为44100或16000(值越低音质越差,但兼容性越好)。此外,创建 PyAudio 实例时可能打印若干 ALSA 警告(如Unknown PCM cards.pcm.front),这是树莓派上未接入设备的配置提示,可以忽略。
录音背后的数字音频原理
理解 16 kHz / 16-bit / WAV 这些参数,有助于你针对不同硬件调整录音配置。课程 README.md 对音频原理有系统讲解,核心要点如下:
- PCM(脉冲编码调制)是数字音频的基础编码方式:按固定时间间隔对模拟电压信号采样,并量化为最接近的离散整数值。16-bit 表示每个采样值范围是 -32,768 到 32,767。
- 采样率指每秒采样次数,以 kHz 计。16 kHz 对语音转文字足够;流媒体音乐通常使用 48 kHz,部分"无损"音频高达 96/192 kHz。
- 数据量计算:16-bit × 16 kHz = 2 字节 × 16,000 次/秒 = 32,000 字节/秒。每秒钟语音约 32 KB,对内存有限的微控制器(如 Wio Terminal 仅 192 KB RAM)是大挑战,因此采集类代码通常把数据直接写入存储而非一次性放入内存。
- WAV 文件是未压缩音频的常见容器:文件头约 44 字节,记录采样率、采样位数、声道数等信息,之后紧跟原始 PCM 数据。
aplay回放时正是依据这些头信息解析音频流。
下一步:把录音交给语音识别服务
麦克风与扬声器配置完成后,即可进入语音转文字环节。同课程 pi-speech-to-text.md 展示了完整实现:先向https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken申请访问令牌(令牌 10 分钟过期),再携带令牌与Content-Type: audio/wav; codecs=audio/pcm; samplerate={rate}头,把录音缓冲 POST 到语音识别 REST 端点,解析响应 JSON 中的DisplayText得到文本。仓库中对应的完整代码见 code-speech-to-text/pi/smart-timer/app.py。
该实现印证了本文硬件配置的价值:rate采样率既用于arecord/aplay命令行测试,也作为Content-Type中的samplerate参数告知语音服务音频格式,同时被 PyAudio 采集流引用——三处必须保持一致。而"按住按钮才录音"的设计则呼应了隐私考量:设备不应持续把家中声音上传云端,而是由用户显式触发录音,这正是一个消费级语音 IoT 设备的合理交互模式。
通过本文的硬件选型、ALSA 配置、命令行测试与代码接线四步,你的树莓派已具备完整的音频采集与回放能力,可以顺畅衔接后续的语音转文字课程内容。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考