使用 PyAudio 在 PyQt6 GUI 中录制音频

问题描述 投票:0回答:0

我想制作一个 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 运行文件。

python macos microphone pyqt6 macos-monterey
© www.soinside.com 2019 - 2024. All rights reserved.