我是一个beatboxer,最近我一直在研究python中涉及循环音频的项目。我的目标是当按下按钮时,麦克风的音频应该开始录制,当我点击另一个按钮时,音频应该停止录制,然后它应该保存在一个wav文件中。
我到处搜索但似乎无法找到答案。
真的很感激任何帮助。
答案 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()