引言
最近在做一个树莓派语音识别项目,选用了INMP441 I2S数字麦克风。本以为是很简单的操作,却踩了不少坑------从设备树覆盖的名称错误,到Python虚拟环境的权限问题,足足折腾了好几天。今天把完整的配置过程记录下来,希望能帮助到同样在树莓派上折腾I2S麦克风的朋友。
本文适用于 树莓派4B ,系统为 Raspberry Pi OS Bookworm (Debian 12) 或更高版本(文中示例为Debian 13 trixie)。如果你使用的是旧版系统,部分路径和命令可能略有差异。
一、硬件接线
INMP441与树莓派4B的连接方式如下(使用物理引脚编号):
| INMP441引脚 | 树莓派GPIO | 物理引脚 |
|---|---|---|
| VDD | 3.3V | 1 或 17 |
| GND | GND | 6、9、14等 |
| SD (数据) | GPIO20 | 38 |
| BCLK (时钟) | GPIO18 | 12 |
| LRCK (帧时钟) | GPIO19 | 35 |
| L/R (声道选择) | GND 或 3.3V | 接地为左声道 |
接线时务必注意:L/R引脚不能悬空,必须接到GND或3.3V,否则麦克风无输出。建议使用杜邦线连接,并确保接触良好。
二、软件配置
1. 启用I2S接口
树莓派的I2S接口默认是关闭的,需要在 /boot/firmware/config.txt(旧系统为 /boot/config.txt)中启用。
bash
sudo nano /boot/firmware/config.txt
在文件末尾添加:
ini
dtparam=i2s=on
保存后重启系统。
2. 加载设备树覆盖
这是最容易踩坑的地方。INMP441对应的设备树覆盖名称是 googlevoicehat-soundcard ,而不是 googlevoicehat-codec(后者在最新系统中已不存在)。
编辑同一个 config.txt 文件,添加:
ini
dtoverlay=googlevoicehat-soundcard
如果你看到其他音频覆盖(如 audioinjector-*),建议先注释掉,避免冲突。
最终你的 config.txt 相关部分应该类似这样:
ini
dtparam=i2c_arm=on # 可能已有
dtparam=i2s=on
dtoverlay=vc4-kms-v3d
dtoverlay=googlevoicehat-soundcard
保存后重启。
3. 验证设备是否识别
重启后,运行以下命令查看录音设备:
bash
arecord -l
正常情况下会看到类似输出:
text
**** List of CAPTURE Hardware Devices ****
card 3: sndrpigooglevoi [snd_rpi_googlevoicehat_soundcar], device 0: Google voiceHAT SoundCard HiFi voicehat-hifi-0 [Google voiceHAT SoundCard HiFi voicehat-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
如果出现 card 3 或其它编号,说明I2S麦克风已被系统识别。
4. 测试录音
使用 arecord 录制5秒音频:
bash
arecord -D plughw:3,0 -f S16_LE -r 16000 -d 5 test.wav
参数说明:
-
-D plughw:3,0:指定声卡(card 3, device 0),根据实际arecord -l的输出调整 -
-f S16_LE:16位小端格式 -
-r 16000:采样率16kHz -
-d 5:录制5秒
录制后播放测试:
bash
aplay test.wav
如果能听到自己的声音,恭喜,硬件配置成功!
三、Python环境搭建
树莓派OS Bookworm版本开始,系统Python环境被保护,不允许直接使用 pip 安装全局包(会报 externally-managed-environment 错误)。官方推荐使用 虚拟环境 (venv) 隔离项目依赖。
1. 创建虚拟环境
进入你的项目目录(例如 ~/workspace/ex-brain/voice):
bash
cd ~/workspace/ex-brain/voice
python3 -m venv venv
2. 激活虚拟环境
bash
source venv/bin/activate
激活后,终端提示符前会显示 (venv),此时 python 和 pip 都指向虚拟环境内的版本。
3. 安装依赖包
在虚拟环境中安装所需的Python库:
bash
pip install --upgrade pip
pip install pyaudio SpeechRecognition numpy scipy soundfile pydub webrtcvad vosk
注意:不要使用 sudo ,也不要加 --break-system-packages。虚拟环境会自动处理依赖隔离。
4. 运行你的语音识别脚本
假设你有一个名为 inmp441_record.py 的脚本,其中使用了 speech_recognition 库。你需要指定正确的麦克风设备索引。
在代码中,可以这样设置:
python
import speech_recognition as sr
# 获取所有麦克风设备列表
print(sr.Microphone.list_microphone_names())
# 选择你的I2S麦克风(例如索引3)
mic = sr.Microphone(device_index=3)
然后运行脚本:
bash
python inmp441_record.py --listen
如果一切正常,你应该能看到程序开始监听,并能识别你的语音。
四、常见问题与解决
Q1: arecord -l 没有出现新声卡?
-
检查
config.txt中的覆盖名称是否正确(googlevoicehat-soundcard而不是googlevoicehat-codec)。 -
确认覆盖文件存在:
ls /boot/firmware/overlays/googlevoicehat-soundcard.dtbo。 -
查看内核日志:
dmesg | grep -i voicehat,查找错误信息。 -
尝试更换覆盖,如
dtoverlay=audioinjector-wm8731-audio。
Q2: 麦克风有设备但录音全是噪音?
-
检查INMP441的L/R引脚是否接地(或接3.3V),不能悬空。
-
检查电源:3.3V供电是否稳定?可尝试使用树莓派的3.3V引脚(物理1号)。
-
检查数据线连接:SD(数据)是否接在GPIO20?某些覆盖可能使用GPIO21,请查阅覆盖文档。
Q3: Python虚拟环境中 pip install 报权限错误?
-
确保虚拟环境的所有权属于当前用户:
sudo chown -R pi:pi venv。 -
如果创建时使用了
sudo,会导致权限混乱,建议删除后重新创建(不加sudo)。
Q4: 虚拟环境激活后 which python3 仍指向系统路径?
-
检查
venv/bin目录下是否有python3可执行文件。如果没有,可能是python3-venv未安装,执行sudo apt install python3-venv后重新创建。 -
也可能是创建时出现错误,删除
venv目录重试。
Q5: 树莓派上 gpioinfo 命令找不到?
安装 gpiod 工具包:
bash
sudo apt install gpiod
然后使用 gpioinfo 查看引脚状态。对于I2S引脚,如果显示为 input 但没有 used 或 consumer 信息,并不一定表示未启用,有时内核驱动不会将这些引脚标记为"已使用"。
五、总结
通过以上步骤,我们成功在树莓派4B上配置了INMP441 I2S麦克风,并在Python虚拟环境中完成了语音识别依赖的安装。整个过程中,最关键的是:
-
正确的设备树覆盖名称 (
googlevoicehat-soundcard)。 -
使用虚拟环境管理Python包,避免系统环境被污染。
-
硬件接线无误,尤其是L/R引脚不能悬空。
树莓派的灵活性在于可以通过设备树动态配置硬件,但这也意味着我们需要对每个外设进行精确的配置。希望本文能帮助你少走弯路,顺利实现语音识别功能。
如果你在配置过程中遇到其他问题,欢迎在评论区留言交流!