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》消费者物联网(Consumer IoT)项目"语音识别"课程中的 pi-microphone.md 为核心,系统讲解如何在树莓派(Raspberry Pi)上为智能语音设备(本课中的"智能厨房定时器")搭建音频输入/输出硬件环境。你将掌握麦克风与扬声器的连接方式、基于 ALSA 的声卡枚举与默认设备配置、arecord/aplay录音与回放测试,以及如何将这些声卡编号对接进后续的 PyAudio 采集代码,为"语音转文字"功能铺平道路。
硬件需求:树莓派没有内置麦克风
树莓派主板没有内置麦克风,这是它与手机、笔记本电脑等消费设备最大的不同。要在树莓派上做语音识别,必须外接一个麦克风。课程文档给出的可行方案包括:
- USB 麦克风:即插即用,最常见的入门选择;
- USB 耳机(含麦克风的一体式耳机);
- USB 全向会议扬声器(speakerphone,同时具备麦克风与扬声器);
- USB 音频适配器 + 3.5mm 接口麦克风:适合手头已有模拟麦克风的场景;
- ReSpeaker 2-Mics Pi HAT:Seeed 出品的树莓派扩展板,板载双麦克风阵列和一颗 Grove 按钮,是官方推荐搭配。
💁 需要注意:蓝牙麦克风在树莓派上的支持并不完整。如果你的蓝牙麦克风或蓝牙耳机,可能会出现配对失败或无法采集音频的问题,因此课程明确建议优先使用 USB 设备。
扬声器的接入方式
与麦克风不同,树莓派自带 3.5mm 耳机接口(HDMI 音频也原生支持)。你可以通过以下任意一种方式输出声音:
- 直接插入 3.5mm 耳机/耳麦/有源音箱(内置
bcm2835 Headphones声卡); - 通过HDMI将音频输出到显示器或电视;
- USB 音箱或USB 耳机;
- USB 全向会议扬声器;
- ReSpeaker 2-Mics Pi HAT上外接扬声器——既可接在板载 3.5mm 插孔,也可接在板载JST 端口上。
背景:为什么采样率与声卡编号如此重要
在动手配置之前,先理解两个贯穿本课的概念,它们直接决定了后面命令参数的选择:
数字音频与 PCM:麦克风采集到的是连续变化的模拟电信号,必须通过脉冲编码调制(PCM)以固定时间间隔"采样"成离散数值。本课录音命令中的
--rate=16000(16KHz)与--format=S16_LE(16-bit 有符号小端整数)就是采样率与采样位深。16KHz/16-bit 是语音识别模型常用的入门配置——1 秒未压缩音频约需16000 × 2 = 32000字节,即 32KB。声卡编号(card number):Linux 下 ALSA 为每个音频设备分配
card N(从 0 开始)与device M编号。后续所有录音、播放、乃至 Python 代码里的input_device_index/output_device_index,都依赖你手动查到的这个编号。这也是本课配置工作的核心产出之一。
关于麦克风类型(动圈、铝带、电容、MEMS)与数字音频采样原理的完整理论讲解,可参阅本课总览 README.md 的 "Microphones" 与 "Digital audio" 小节。
连接并配置麦克风
步骤一:物理连接
根据你选择的方案,把麦克风插到树莓派的 USB 口或 GPIO 扩展板上。如果使用的是ReSpeaker 2-Mics Pi HAT:
- 先取下原有的 Grove Base hat(如果之前装过);
- 将 ReSpeaker hat 对准 GPIO 40 针排座压装到位,替换 Grove Base hat 的位置。
注意:本课稍后还需要一个 Grove 按钮来控制录音,而ReSpeaker hat 上已经集成了一颗按钮,因此无需再保留 Grove Base hat。
- ReSpeaker hat 需要安装驱动才能工作,请参照 Seeed 官方的 Getting Started 说明完成驱动安装。
⚠️ 驱动安装过程会用到
git克隆仓库。如果树莓派上尚未安装 git,先执行:sudo apt install git --yes
步骤二:用arecord -l枚举录音设备
在树莓派本机终端,或通过 VS Code Remote-SSH 远程终端中执行:
arecord -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),后面配置默认设备、以及编写录音代码时都要用到它。
💡 实操建议:Linux 的声卡配置比较敏感,尽量只保留一个麦克风,把多余的拔掉,可以避免默认设备指向错误导致的各种诡异问题。
连接并配置扬声器
步骤一:物理连接并按需枚举播放设备
接好扬声器后,用aplay -l查看所有播放(PLAYBACK)设备:
aplay -l典型输出如下:
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 ... card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0注意:输出中总会存在card 0: Headphones,这是树莓派板载的 3.5mm 耳机插孔。如果你额外接了 USB 音箱等设备,它也会出现在列表中。
步骤二:将外部扬声器设为默认设备
如果你使用的是外接扬声器(而不是插在板载耳机孔上的耳机/音箱),需要把它配置为 ALSA 的默认播放设备,否则系统仍然会往耳机孔输出:
sudo nano /usr/share/alsa/alsa.conf该命令会用nano(终端文本编辑器)打开 ALSA 全局配置文件。用方向键向下滚动,找到这一行:
defaults.pcm.card 0把0改成aplay -l输出中目标声卡的编号。例如上面示例中第二个声卡是card 1: M0 [eMeet M0], device 0: USB Audio [USB Audio],则改为:
defaults.pcm.card 1保存并退出:按Ctrl+x,再按y确认保存,最后按return(回车)确认文件名。
📌 参数说明:
defaults.pcm.card是 ALSA 的默认 PCM 播放声卡编号。除了这里修改的播放默认值,也可以关注defaults.ctl.card(控制接口)等关联配置,但对于本课场景,只需保证播放指向正确的声卡即可。
测试麦克风与扬声器
录制 5 秒测试音频
执行以下命令,通过麦克风录制 5 秒音频并保存为 WAV 文件:
arecord --format=S16_LE --duration=5 --rate=16000 --file-type=wav out.wav录制期间对着麦克风制造声音——说话、唱歌、beatbox、弹奏乐器都可以,目的是验证麦克风确实采到了信号。各参数含义:
| 参数 | 含义 | 本课取值 |
|---|---|---|
--format=S16_LE | 16-bit 有符号小端(PCM 位深) | 与语音识别服务兼容 |
--duration=5 | 录制时长(秒) | 5 |
--rate=16000 | 采样率 16KHz | 语音识别常用入门采样率 |
--file-type=wav | 输出容器格式 | WAV(未压缩) |
out.wav | 输出文件名 | 可自定义 |
回放刚才的录音
aplay --format=S16_LE --rate=16000 out.wav播放参数要与录制时的采样率、位深保持一致,否则可能出现变调或报错。播放时注意调节扬声器音量。
调整增益与音量:alsamixer
如果麦克风音量太小(需要提高增益)或太大,可以使用alsamixer交互式工具调整。这是一个终端界面的混音器,方向键调节、Esc退出,具体按键操作可查阅 Linux 上alsamixer的 man page。
播放报错排查
如果回放报错,优先检查alsa.conf中设置的defaults.pcm.card是否与aplay -l列出的实际声卡编号一致——这是最常见的错误来源。
从配置到代码:声卡编号如何在 Python 采集程序中使用
硬件配置完成后,这些信息会被直接写进后续的音频采集程序(详见本课配套实操文档 pi-audio.md)。以仓库中完整的示例代码 code-record/pi/smart-timer/app.py 为例:
import io import pyaudio import time import wave from grove.factory import Factory button = Factory.getButton('GPIO-HIGH', 5) audio = pyaudio.PyAudio() microphone_card_number = 1 speaker_card_number = 1 rate = 48000代码中microphone_card_number正是你在arecord -l中查到的编号,speaker_card_number则是你在alsa.conf中设置的播放声卡编号,二者都填入PyAudio.open()的设备索引:
stream = audio.open(format = pyaudio.paInt16, rate = rate, channels = 1, input_device_index = microphone_card_number, input = True, frames_per_buffer = 4096)- 采集音频时通过
input_device_index指定麦克风声卡; - 回放时通过
output_device_index指定扬声器声卡; rate默认 48000(48KHz),如果运行时报OSError: [Errno -9997] Invalid sample rate,需要把它降到44100或16000——这也与你在arecord测试命令里选择的采样率策略一致。
从源码可以看出,本课的硬件配置流程(查编号 → 设默认卡)与软件采集流程(PyAudio 指定device_index)是严格一一对应的,硬件配置的好坏会直接决定软件能否正确拾音。更完整的"按钮控制录音 → 转文字"链路,可继续阅读 pi-speech-to-text.md 与对应完整代码 code-speech-to-text/pi/smart-timer/app.py。
本课的其他设备路径与下一步
这份配置指南是"语音识别"课程三路硬件分支之一,同一小节还有:
- Arduino 分支:wio-terminal-microphone.md(Wio Terminal 麦克风配置);
- 虚拟设备分支:virtual-device-microphone.md(直接使用电脑自带麦克风/扬声器,无需额外硬件)。
配置完成后,下一步就是编写代码采集音频并调用 Azure 语音服务完成"语音转文字",这部分的整体流程与理论知识(唤醒词、隐私、RNN 语音模型等)见 README.md。
总结
本篇完成了树莓派语音设备的"最后一公里"硬件准备:
- 选型:优先 USB 麦克风/耳机,蓝牙设备存在兼容性风险;ReSpeaker 2-Mics Pi HAT 可同时提供双麦克风与 Grove 按钮;
- 枚举:用
arecord -l/aplay -l获取声卡编号,并确认板载card 0: Headphones始终存在; - 配置默认卡:外接扬声器需在
/usr/share/alsa/alsa.conf中修改defaults.pcm.card; - 验证:用
arecord录制 5 秒 16KHz WAV 并用aplay回放,必要时用alsamixer调增益; - 对接代码:将查到的声卡编号填入 PyAudio 的
input_device_index/output_device_index,即可进入语音识别开发。
这套"查编号 → 配默认卡 → 测试录音 → 对接代码"的方法论,适用于任意基于 ALSA 的 Linux 音频环境,是后续所有语音功能开发的可靠地基。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考