You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:25:02