录制音频-RaspberryPi


文档摘要

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

录制音频 - Raspberry Pi

在本课程的这一部分,你将编写代码来录制Raspberry Pi上的音频。音频录制将由一个按钮控制。

硬件

Raspberry Pi需要一个按钮来控制音频录制。

你将使用的按钮是一个Grove按钮。这是一个数字传感器,可以开启或关闭信号。这些按钮可以根据需要配置为在按下按钮时发送高信号,松开时发送低信号,或者相反。

如果你正在使用ReSpeaker 2-Mics Pi HAT作为麦克风,则无需连接按钮,因为这个HAT上已经配备了一个。跳过到下一个部分。

连接按钮

按钮可以通过Grove底座HAT连接。

任务 - 连接按钮

Grove按钮

  1. 将Grove线的一端插入按钮模块上的插座。只能以一种方式插入。

  2. 在Raspberry Pi断电的情况下,将Grove线的另一端连接到Grove Base HAT上标记为 D5 的数字插座。该插座是GPIO引脚旁边一排插座中的第二个。

连接到D5插座的Grove按钮

录制音频

你可以使用Python代码从麦克风录制音频。

任务 - 录制音频

  1. 启动Pi并等待其启动。

  2. 打开VS Code,可以直接在Pi上打开,也可以通过Remote SSH扩展远程连接。

  3. PyAudio Pip包提供了录音和回放音频的功能。这个包依赖于一些需要首先安装的音频库。在终端中运行以下命令来安装这些库:

    sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes
  4. 安装PyAudio Pip包。

    pip3 install pyaudio
  5. 创建一个名为 smart-timer and add a file called app.py 的新文件夹,并将此文件放入其中。

  6. 在文件顶部添加以下导入语句:

    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 来创建按钮类。

  7. 在这之后,添加代码以创建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 上创建了一个按钮,该按钮在按下时发送高信号。

  8. 在这之后,创建一个PyAudio类的实例来处理音频:

    audio = pyaudio.PyAudio()
  9. 声明麦克风和扬声器的硬件卡号。这将是之前在这个课程中通过运行 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 文件。

  10. 在这之后,声明用于音频捕获和播放的采样率。根据你使用的硬件,你可能需要更改此值。

    rate = 48000 #48KHz

    如果稍后运行此代码时遇到采样率错误,请将此值更改为 44100 or 16000. The higher the value, the better the quality of the sound.

  11. Below this, create a new function called capture_audio。这将被调用以从麦克风捕获音频:

    def capture_audio():
  12. 在此函数内部,添加以下内容以捕获音频:

    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 方法的选项。

    一旦按钮被释放,流将停止并关闭。

  13. 在此函数末尾添加以下内容:

    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文件。这是一种标准的方式,用于将未压缩的音频写入文件。然后将此缓冲区返回。

  14. 添加以下 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字节的块写入输出流,播放音频。然后关闭流。

  15. capture_audio 函数下方添加以下代码,以循环直到按钮被按下。一旦按钮被按下,音频将被捕获并播放。

    while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() play_audio(buffer)
  16. 运行代码。按下按钮并对着麦克风说话。当你完成后释放按钮,你会听到录音。

    当创建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 文件夹中找到此代码。

你的音频录制程序成功了!

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


作者与出处
原作者: microsoft
来源:microsoft
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: microsoft 转发
评论区 (0)
U