我想制作一个 PyQT6 应用程序,单击录制按钮后将录制三秒钟的音频。目前我正在尝试使用 PyAudio 来录制音频,但似乎没有任何效果。
这是我使用的代码:
import sys
import wave
from PyQt6.QtCore import QTimer
import pyaudio
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel, QWidget, QGridLayout
class RecordingWindow(QMainWindow):
def __init__(self):
super().__init__()
self.init_ui()
self.chunk = 1024
self.sample_format = pyaudio.paInt16
self.channels = 1
self.fs = 44100
self.seconds = 3
self.filename = "new.wav"
self.p = pyaudio.PyAudio()
def init_ui(self):
self.setWindowTitle("Audio Recorder")
self.setGeometry(100, 100, 400, 300)
self.status_label = QLabel("Press 'Record' to start recording.\nMicrophone will record for three seconds.", self)
self.record_button = QPushButton("Record", self)
self.record_button.clicked.connect(self.start_recording)
layout = QGridLayout()
layout.addWidget(self.status_label, 0, 0, 2, 2)
layout.addWidget(self.record_button, 1, 0, 1, 2)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def start_recording(self):
self.status_label.setText("Recording... Please Speak Loudly!")
self.record_button.setEnabled(False)
self.p = pyaudio.PyAudio()
self.frames = []
self.stream = self.p.open(format=self.sample_format,
channels=self.channels,
rate=self.fs,
frames_per_buffer=self.chunk,
input=True)
# Start a QTimer to automatically stop recording after the specified duration
self.timer = QTimer()
self.timer.timeout.connect(lambda: self.stop_recording())
# Use lambda to pass the instance
self.timer.start(self.seconds * 1000) # Convert seconds to milliseconds
def stop_recording(self):
self.stream.stop_stream()
self.stream.close()
self.p.terminate()
wf = wave.open(self.filename, 'wb')
wf.setnchannels(self.channels)
wf.setsampwidth(self.p.get_sample_size(self.sample_format))
wf.setframerate(self.fs)
wf.writeframes(b''.join(self.frames))
wf.close()
self.status_label.setText("Recording completed. Press 'Record' to record again.")
self.record_button.setEnabled(True)
def closeEvent(self, event):
if hasattr(self, 'stream'):
self.stream.stop_stream()
self.stream.close()
self.p.terminate()
event.accept()
if __name__ == 'main':
app = QApplication(sys.argv)
window = RecordingWindow()
window.show()
sys.exit(app.exec())
但是,当我运行该代码时,它不会录制任何音频。用于录制的窗口/应用程序以及所有按钮和文本都按预期显示。当我按下“录音”按钮时,它会显示“正在录音......请大声说话!”就像它应该的那样,但是当我检查我的文件时,“new.wav”文件说它已经录制了 0 秒。我查遍了互联网,但找不到太多有帮助的信息。如果有帮助的话,我使用 macOs Monterey(版本 12.5),使用 VSCode 编写文件,然后使用 IDLE 运行文件。