树莓派4B上使用INMP441麦克风进行语音识别:从I2S配置到Python环境搭建全记录

引言

最近在做一个树莓派语音识别项目,选用了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),此时 pythonpip 都指向虚拟环境内的版本。

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 但没有 usedconsumer 信息,并不一定表示未启用,有时内核驱动不会将这些引脚标记为"已使用"。


五、总结

通过以上步骤,我们成功在树莓派4B上配置了INMP441 I2S麦克风,并在Python虚拟环境中完成了语音识别依赖的安装。整个过程中,最关键的是:

  1. 正确的设备树覆盖名称googlevoicehat-soundcard)。

  2. 使用虚拟环境管理Python包,避免系统环境被污染。

  3. 硬件接线无误,尤其是L/R引脚不能悬空。

树莓派的灵活性在于可以通过设备树动态配置硬件,但这也意味着我们需要对每个外设进行精确的配置。希望本文能帮助你少走弯路,顺利实现语音识别功能。

如果你在配置过程中遇到其他问题,欢迎在评论区留言交流!

相关推荐
七夜zippoe2 小时前
Python 3.12+ 新特性深度解析:类型系统与性能革命
android·网络·python·类型系统·性能革命·3.12+
如若1232 小时前
WSL2 启动报错“拒绝访问“ E_ACCESSDENIED 完整解决方案
人工智能·pytorch·python·深度学习·计算机视觉
qq_334903152 小时前
用Python实现自动化的Web测试(Selenium)
jvm·数据库·python
Storynone2 小时前
【Day30】卡码网:46. 携带研究材料,LeetCode:416. 分割等和子集
python·算法·leetcode
Xpower 172 小时前
Clawith:开启多智能体协作的新纪元
人工智能·python·语言模型·自动化
阿钱真强道2 小时前
28 Python 分类:不只是画一条线,一文认识支持向量机(SVM)
python·支持向量机·分类·svm·边界·核方法·高维
Jay_Franklin2 小时前
Python一站式科研工作流:从数据分析到报告生成
开发语言·python·论文笔记
m0_518019482 小时前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
reasonsummer2 小时前
【办公类-133-03】20260320_学区化展示PPT_03_“Python”批量gif制作
python·豆包