import sys import os import pyaudio import wave import threading from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QInputDialog, QLabel, QComboBox from PyQt5.QtGui import QIcon, QPixmap import summarize class RecordingApp(QWidget): def __init__(self): super().__init__() self.recording_pixmap = QPixmap("recording.png") self.not_recording_pixmap = QPixmap("notrecording.png") self.is_recording = False self.audio_thread = None self.stream = None self.p = None self.wf = None self.initUI() def initUI(self): self.setWindowTitle('Meeting Recorder') self.setGeometry(500, 500, 500, 150) # Main vertical layout main_layout = QVBoxLayout() # Horizontal layout for the status label and device combo box top_layout = QHBoxLayout() self.status_label = QLabel(self) self.status_label.setPixmap(self.not_recording_pixmap) top_layout.addWidget(self.status_label) self.device_combo = QComboBox(self) self.device_combo.addItems(self.get_device_names()) top_layout.addWidget(self.device_combo) main_layout.addLayout(top_layout) # Horizontal layout for the buttons button_layout = QHBoxLayout() self.record_button = QPushButton('Record', self) self.record_button.clicked.connect(self.toggle_recording) button_layout.addWidget(self.record_button) self.transcribe_button = QPushButton('Transcribe', self) self.transcribe_button.clicked.connect(self.transcribe) button_layout.addWidget(self.transcribe_button) self.clean_button = QPushButton('Clean', self) self.clean_button.clicked.connect(self.clean) button_layout.addWidget(self.clean_button) main_layout.addLayout(button_layout) self.setLayout(main_layout) def get_device_names(self): p = pyaudio.PyAudio() info = p.get_host_api_info_by_index(0) num_devices = info.get('deviceCount') device_names = [] for i in range(num_devices): device_info = p.get_device_info_by_host_api_device_index(0, i) if device_info.get('maxInputChannels') > 0: device_names.append(device_info.get('name')) p.terminate() return device_names def toggle_recording(self): if not self.is_recording: self.start_recording() else: self.stop_recording() def start_recording(self): filename, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter filename:') if ok and filename: self.is_recording = True self.record_button.setText('Stop Recording') self.status_label.setPixmap(self.recording_pixmap) selected_device_index = self.device_combo.currentIndex() self.audio_thread = threading.Thread(target=self.record_audio, args=(filename, selected_device_index)) self.audio_thread.start() def stop_recording(self): if self.is_recording: self.is_recording = False self.record_button.setText('Record') self.status_label.setPixmap(self.not_recording_pixmap) if self.audio_thread: self.audio_thread.join() if self.stream: self.stream.stop_stream() self.stream.close() if self.p: self.p.terminate() if self.wf: self.wf.close() def record_audio(self, filename, device_index): chunk_size = 1024 sampling_rate = 16000 num_channels = 1 self.p = pyaudio.PyAudio() file_path = f"{filename}.wav" self.wf = wave.open(file_path, 'wb') self.wf.setnchannels(num_channels) self.wf.setsampwidth(self.p.get_sample_size(pyaudio.paInt16)) self.wf.setframerate(sampling_rate) self.stream = self.p.open( format=pyaudio.paInt16, channels=num_channels, rate=sampling_rate, input=True, frames_per_buffer=chunk_size, input_device_index=device_index ) print(f"Recording to {file_path}. Press 'Stop Recording' to stop...") while self.is_recording: data = self.stream.read(chunk_size) self.wf.writeframes(data) print(f"Audio saved to {file_path}") def transcribe(self): # Run the transcription and summarization in the background threading.Thread(target=self.run_transcription_and_summarization).start() def run_transcription_and_summarization(self): summarize.process_wav_files() summarize.summarize_transcripts() def clean(self): print("Cleaning files...") try: for file in os.listdir('.'): if file.endswith(('.wav', '.tns')): os.remove(file) print(f"Deleted: {file}") print("Cleaning complete.") except Exception as e: print(f"An error occurred while cleaning files: {e}") def closeEvent(self, event): self.stop_recording() event.accept() if __name__ == '__main__': app = QApplication(sys.argv) app.setWindowIcon(QIcon("headphones.png")) ex = RecordingApp() ex.show() sys.exit(app.exec_())