如何用PyAudio实现按住树莓派物理按键录音,释放后导出带时间戳的MP3?
树莓派按键触发MP3录音实现方案
前置准备
系统依赖安装
先在树莓派上安装底层依赖组件:
sudo apt-get update sudo apt-get install portaudio19-dev lame python3-pip
Python包安装
安装所需的Python库:
pip3 install pyaudio pydub RPi.GPIO
硬件连接
- 将物理按键一端连接到树莓派的GPIO17引脚,另一端连接到GND引脚
- 可选:添加10kΩ上拉电阻(也可以用代码配置软件上拉,无需额外电阻)
实现代码
import pyaudio import wave from pydub import AudioSegment import RPi.GPIO as GPIO import datetime import time # 配置参数 GPIO_PIN = 17 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 44100 CHUNK = 1024 def init_gpio(): GPIO.setmode(GPIO.BCM) GPIO.setup(GPIO_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 软件上拉,按键按下时引脚为低电平 def record_audio(): audio = pyaudio.PyAudio() # 打开录音流 stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) frames = [] print("开始录音...") # 持续录音直到按键松开 while GPIO.input(GPIO_PIN) == GPIO.LOW: data = stream.read(CHUNK) frames.append(data) time.sleep(0.001) # 降低CPU占用率 print("停止录音...") # 关闭录音流 stream.stop_stream() stream.close() audio.terminate() # 先保存临时WAV文件 temp_wav = "/tmp/temp_recording.wav" wf = wave.open(temp_wav, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(audio.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() # 转换为MP3并以当前时间命名 timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") mp3_filename = f"{timestamp}.mp3" audio_segment = AudioSegment.from_wav(temp_wav) audio_segment.export(mp3_filename, format="mp3") print(f"录音已保存为: {mp3_filename}") if __name__ == "__main__": try: init_gpio() print("等待按键按下开始录音...") while True: # 检测按键按下事件 if GPIO.input(GPIO_PIN) == GPIO.LOW: record_audio() time.sleep(0.1) except KeyboardInterrupt: print("\n程序终止") finally: GPIO.cleanup()
注意事项
- 运行脚本需要GPIO权限,可通过
sudo python3 your_script.py执行,或者将当前用户加入gpio组:sudo usermod -aG gpio $USER,完成后重新登录生效 - 若录音有杂音,检查硬件连接是否松动,或调整采样率、通道数参数
- pydub依赖lame完成MP3转换,确保已通过apt安装lame
- 临时WAV文件会被自动覆盖,无需手动清理
内容的提问来源于stack exchange,提问作者Bob Gill
相关产品推荐
相关产品推荐

