单击按钮时使用pyaudio录制音频,然后在另一个按钮上停止录制

时间:2017-04-20 14:04:13

标签: python pyaudio

我是一个beatboxer,最近我一直在研究python中涉及循环音频的项目。我的目标是当按下按钮时,麦克风的音频应该开始录制,当我点击另一个按钮时,音频应该停止录制,然后它应该保存在一个wav文件中。

我到处搜索但似乎无法找到答案。

真的很感激任何帮助。

1 个答案:

答案 0 :(得分:1)

我有一个运行的tkinter gui,仅带有两个按钮“开始”录制和“停止”录制。他们会将wav文件记录到与.py文件相同的目录中。我已经将其编写为一个类,因此您可以导入它并在另一个项目中使用该功能。希望对您有所帮助。

它变得非常简单,我在空闲状态下对其进行了测试,并且必须增大缓冲区大小,否则会发生溢出异常,该异常一直保持较高状态,但是如果您想在播放时监视录音,则可以想要把它放下来;用pyCharm编写时,它在1024时工作正常。

最好的问候

研究员穆索

# Import the necessary modules.
import tkinter
import tkinter as tk
import tkinter.messagebox
import pyaudio
import wave
import os


class RecAUD:

    def __init__(self, chunk=3024, frmat=pyaudio.paInt16, channels=2, rate=44100, py=pyaudio.PyAudio()):

        # Start Tkinter and set Title
        self.main = tkinter.Tk()
        self.collections = []
        self.main.geometry('500x300')
        self.main.title('Record')
        self.CHUNK = chunk
        self.FORMAT = frmat
        self.CHANNELS = channels
        self.RATE = rate
        self.p = py
        self.frames = []
        self.st = 1
        self.stream = self.p.open(format=self.FORMAT, channels=self.CHANNELS, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK)

        # Set Frames
        self.buttons = tkinter.Frame(self.main, padx=120, pady=20)

        # Pack Frame
        self.buttons.pack(fill=tk.BOTH)



        # Start and Stop buttons
        self.strt_rec = tkinter.Button(self.buttons, width=10, padx=10, pady=5, text='Start Recording', command=lambda: self.start_record())
        self.strt_rec.grid(row=0, column=0, padx=50, pady=5)
        self.stop_rec = tkinter.Button(self.buttons, width=10, padx=10, pady=5, text='Stop Recording', command=lambda: self.stop())
        self.stop_rec.grid(row=1, column=0, columnspan=1, padx=50, pady=5)

        tkinter.mainloop()

    def start_record(self):
        self.st = 1
        self.frames = []
        stream = self.p.open(format=self.FORMAT, channels=self.CHANNELS, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK)
        while self.st == 1:
            data = stream.read(self.CHUNK)
            self.frames.append(data)
            print("* recording")
            self.main.update()

        stream.close()

        wf = wave.open('test_recording.wav', 'wb')
        wf.setnchannels(self.CHANNELS)
        wf.setsampwidth(self.p.get_sample_size(self.FORMAT))
        wf.setframerate(self.RATE)
        wf.writeframes(b''.join(self.frames))
        wf.close()

    def stop(self):
        self.st = 0


# Create an object of the ProgramGUI class to begin the program.
guiAUD = RecAUD()