录制音频 - Raspberry Pi 在本课程的这一部分,你将编写代码来录制Raspberry Pi上的音频。音频录制将由一个按钮控制。 硬件 Raspberry Pi需要一个按钮来控制音频录制。 你将使用的按钮是一个Grove按钮。这是一个数字传感器,可以开启或关闭信号。这些按钮可以根据需要配置为在按下按钮时发送高信号,松开时发送低信号,或者相反。 如果你正在使用ReSpeaker 2-Mics Pi HAT作为麦克风,则无需连接按钮,因为这个HAT上已经配备了一个。跳过到下一个部分。 连接按钮 按钮可以通过Grove底座HAT连接。 任务 - 连接按钮 Grove按钮 将Grove线的一端插入按钮模块上的插座。只能以一种方式插入。
在本课程的这一部分,你将编写代码来录制Raspberry Pi上的音频。音频录制将由一个按钮控制。
Raspberry Pi需要一个按钮来控制音频录制。
你将使用的按钮是一个Grove按钮。这是一个数字传感器,可以开启或关闭信号。这些按钮可以根据需要配置为在按下按钮时发送高信号,松开时发送低信号,或者相反。
如果你正在使用ReSpeaker 2-Mics Pi HAT作为麦克风,则无需连接按钮,因为这个HAT上已经配备了一个。跳过到下一个部分。
按钮可以通过Grove底座HAT连接。

将Grove线的一端插入按钮模块上的插座。只能以一种方式插入。
在Raspberry Pi断电的情况下,将Grove线的另一端连接到Grove Base HAT上标记为 D5 的数字插座。该插座是GPIO引脚旁边一排插座中的第二个。

你可以使用Python代码从麦克风录制音频。
启动Pi并等待其启动。
打开VS Code,可以直接在Pi上打开,也可以通过Remote SSH扩展远程连接。
PyAudio Pip包提供了录音和回放音频的功能。这个包依赖于一些需要首先安装的音频库。在终端中运行以下命令来安装这些库:
sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes
安装PyAudio Pip包。
pip3 install pyaudio
创建一个名为 smart-timer and add a file called app.py 的新文件夹,并将此文件放入其中。
在文件顶部添加以下导入语句:
import io import pyaudio import time import wave from grove.factory import Factory
这些语句导入了 pyaudio module, some standard Python modules to handle wave files, and the grove.factory module to import a Factory 来创建按钮类。
在这之后,添加代码以创建Grove按钮。
如果你正在使用ReSpeaker 2-Mics Pi HAT,请使用以下代码:
# The button on the ReSpeaker 2-Mics Pi HAT button = Factory.getButton("GPIO-LOW", 17)
这段代码在端口 D17 上创建了一个按钮,这是连接到ReSpeaker 2-Mics Pi HAT的按钮所在的端口。这个按钮被设置为在按下时发送低信号。
如果你没有使用ReSpeaker 2-Mics Pi HAT,并且使用的是连接到底部HAT的Grove按钮,请使用以下代码。
button = Factory.getButton("GPIO-HIGH", 5)
这段代码在端口 D5 上创建了一个按钮,该按钮在按下时发送高信号。
在这之后,创建一个PyAudio类的实例来处理音频:
audio = pyaudio.PyAudio()
声明麦克风和扬声器的硬件卡号。这将是之前在这个课程中通过运行 arecord -l and aplay -l 命令找到的卡号。
microphone_card_number = <microphone card number> speaker_card_number = <speaker card number>
替换 <microphone card number> with the number of your microphones card.
Replace <speaker card number> with the number of your speakers card, the same number you set in the alsa.conf 文件。
在这之后,声明用于音频捕获和播放的采样率。根据你使用的硬件,你可能需要更改此值。
rate = 48000 #48KHz
如果稍后运行此代码时遇到采样率错误,请将此值更改为 44100 or 16000. The higher the value, the better the quality of the sound.
Below this, create a new function called capture_audio。这将被调用以从麦克风捕获音频:
def capture_audio():
在此函数内部,添加以下内容以捕获音频:
stream = audio.open(format = pyaudio.paInt16, rate = rate, channels = 1, input_device_index = microphone_card_number, input = True, frames_per_buffer = 4096) frames = [] while button.is_pressed(): frames.append(stream.read(4096)) stream.stop_stream() stream.close()
这段代码使用PyAudio对象打开一个音频输入流。该流将以16KHz的采样率从麦克风捕获音频,每次捕获4096字节的缓冲区。
然后代码将在Grove按钮被按下时循环,每次读取这些4096字节的缓冲区到数组中。
你可以在 PyAudio文档 中了解更多关于传递给
open方法的选项。
一旦按钮被释放,流将停止并关闭。
在此函数末尾添加以下内容:
wav_buffer = io.BytesIO() with wave.open(wav_buffer, 'wb') as wavefile: wavefile.setnchannels(1) wavefile.setsampwidth(audio.get_sample_size(pyaudio.paInt16)) wavefile.setframerate(rate) wavefile.writeframes(b''.join(frames)) wav_buffer.seek(0) return wav_buffer
这段代码创建了一个二进制缓冲区,并将所有捕获的音频写入它作为一个WAV文件。这是一种标准的方式,用于将未压缩的音频写入文件。然后将此缓冲区返回。
添加以下 play_audio 函数以播放音频缓冲区:
def play_audio(buffer): stream = audio.open(format = pyaudio.paInt16, rate = rate, channels = 1, output_device_index = speaker_card_number, output = True) with wave.open(buffer, 'rb') as wf: data = wf.readframes(4096) while len(data) > 0: stream.write(data) data = wf.readframes(4096) stream.close()
此函数打开另一个音频流,这次是用于输出——播放音频。它使用与输入流相同的设置。然后将缓冲区作为wave文件打开,并以4096字节的块写入输出流,播放音频。然后关闭流。
在 capture_audio 函数下方添加以下代码,以循环直到按钮被按下。一旦按钮被按下,音频将被捕获并播放。
while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() play_audio(buffer)
运行代码。按下按钮并对着麦克风说话。当你完成后释放按钮,你会听到录音。
当创建PyAudio实例时,你可能会遇到一些ALSA错误。这是由于Pi上对未使用的音频设备的配置。你可以忽略这些错误。
pi@raspberrypi:~/smart-timer $ python3 app.py ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
如果你遇到以下错误:
OSError: [Errno -9997] Invalid sample rate
那么请将 rate 更改为44100或16000。
你可以在 code-record/pi 文件夹中找到此代码。
你的音频录制程序成功了!
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。