import threading from AudioTranscriber import AudioTranscriber from GPTResponder import GPTResponder import customtkinter as ctk import AudioRecorder import queue import time import torch def write_in_textbox(textbox, text): textbox.delete("0.0", "end") textbox.insert("0.0", text) def update_transcript_UI(transcriber, textbox): transcript_string = transcriber.get_transcript() write_in_textbox(textbox, transcript_string) textbox.after(300, update_transcript_UI, transcriber, textbox) def update_response_UI(responder, textbox, update_interval_slider_label, update_interval_slider, freeze_state): if not freeze_state[0]: response = responder.response textbox.configure(state="normal") write_in_textbox(textbox, response) textbox.configure(state="disabled") update_interval = int(update_interval_slider.get()) responder.update_response_interval(update_interval) update_interval_slider_label.configure(text=f"Update interval: {update_interval} seconds") textbox.after(300, update_response_UI, responder, textbox, update_interval_slider_label, update_interval_slider, freeze_state) def clear_context(transcriber, audio_queue): transcriber.clear_transcript_data() with audio_queue.mutex: audio_queue.queue.clear() def create_ui_components(root): ctk.set_appearance_mode("dark") ctk.set_default_color_theme("dark-blue") root.title("Ecoute") root.configure(bg='#252422') root.geometry("1000x600") font_size = 20 transcript_textbox = ctk.CTkTextbox(root, width=300, font=("Arial", font_size), text_color='#FFFCF2', wrap="word") transcript_textbox.grid(row=0, column=0, padx=10, pady=20, sticky="nsew") response_textbox = ctk.CTkTextbox(root, width=300, font=("Arial", font_size), text_color='#639cdc', wrap="word") response_textbox.grid(row=0, column=1, padx=10, pady=20, sticky="nsew") freeze_button = ctk.CTkButton(root, text="Freeze", command=None) freeze_button.grid(row=1, column=1, padx=10, pady=3, sticky="nsew") update_interval_slider_label = ctk.CTkLabel(root, text=f"", font=("Arial", 12), text_color="#FFFCF2") update_interval_slider_label.grid(row=2, column=1, padx=10, pady=3, sticky="nsew") update_interval_slider = ctk.CTkSlider(root, from_=1, to=10, width=300, height=20, number_of_steps=9) update_interval_slider.set(2) update_interval_slider.grid(row=3, column=1, padx=10, pady=10, sticky="nsew") return transcript_textbox, response_textbox, update_interval_slider, update_interval_slider_label, freeze_button def main(): root = ctk.CTk() transcript_textbox, response_textbox, update_interval_slider, update_interval_slider_label, freeze_button = create_ui_components(root) audio_queue = queue.Queue() user_audio_recorder = AudioRecorder.DefaultMicRecorder() user_audio_recorder.record_into_queue(audio_queue) time.sleep(2) speaker_audio_recorder = AudioRecorder.DefaultSpeakerRecorder() speaker_audio_recorder.record_into_queue(audio_queue) global_transcriber = AudioTranscriber(user_audio_recorder.source, speaker_audio_recorder.source) transcribe = threading.Thread(target=global_transcriber.transcribe_audio_queue, args=(audio_queue,)) transcribe.daemon = True transcribe.start() print(f"[INFO] Whisper using GPU: " + str(torch.cuda.is_available())) responder = GPTResponder() respond = threading.Thread(target=responder.respond_to_transcriber, args=(global_transcriber,)) respond.daemon = True respond.start() print("READY") root.grid_rowconfigure(0, weight=100) root.grid_rowconfigure(1, weight=1) root.grid_rowconfigure(2, weight=1) root.grid_rowconfigure(3, weight=1) root.grid_columnconfigure(0, weight=2) root.grid_columnconfigure(1, weight=1) # Add the clear transcript button to the UI clear_transcript_button = ctk.CTkButton(root, text="Clear Transcript", command=lambda: clear_context(global_transcriber, audio_queue, )) clear_transcript_button.grid(row=1, column=0, padx=10, pady=3, sticky="nsew") freeze_state = [False] # Using list to be able to change its content inside inner functions def freeze_unfreeze(): freeze_state[0] = not freeze_state[0] # Invert the freeze state freeze_button.configure(text="Unfreeze" if freeze_state[0] else "Freeze") freeze_button.configure(command=freeze_unfreeze) update_interval_slider_label.configure(text=f"Update interval: {update_interval_slider.get()} seconds") update_transcript_UI(global_transcriber, transcript_textbox) update_response_UI(responder, response_textbox, update_interval_slider_label, update_interval_slider, freeze_state) root.mainloop() if __name__ == "__main__": main()