still buggy recording and crashes without error

This commit is contained in:
Andrew Ward
2024-05-02 18:09:51 +01:00
parent df9d41c507
commit 4282b6f7c1

View File

@@ -2,6 +2,7 @@ import tkinter as tk
import platform import platform
from tkinter import ttk, messagebox, simpledialog, Menu from tkinter import ttk, messagebox, simpledialog, Menu
import os import os
import threading
import pyaudio import pyaudio
import wave import wave
import webbrowser import webbrowser
@@ -52,7 +53,7 @@ class Application(tk.Tk):
instruction_window.title("App Version") instruction_window.title("App Version")
instruction_window.geometry("300x150") # Width x Height instruction_window.geometry("300x150") # Width x Height
instructions = """Version 1.0.2\n\n App by Scorchsoft.com""" instructions = """Version 1.0.3\n\n App by Scorchsoft.com"""
tk.Label(instruction_window, text=instructions, justify=tk.LEFT, wraplength=280).pack(padx=10, pady=10) tk.Label(instruction_window, text=instructions, justify=tk.LEFT, wraplength=280).pack(padx=10, pady=10)
@@ -219,7 +220,7 @@ https://www.scorchsoft.com/blog/text-to-mic-for-meetings/
def get_app_support_path_mac(): def get_app_support_path_mac(self):
home = Path.home() home = Path.home()
app_support_path = home / 'Library' / 'Application Support' / 'scorchsoft-text-to-mic' app_support_path = home / 'Library' / 'Application Support' / 'scorchsoft-text-to-mic'
app_support_path.mkdir(parents=True, exist_ok=True) # Ensure directory exists app_support_path.mkdir(parents=True, exist_ok=True) # Ensure directory exists
@@ -289,7 +290,7 @@ https://www.scorchsoft.com/blog/text-to-mic-for-meetings/
def get_audio_file_path(self, filename): def get_audio_file_path(self, filename):
if platform.system() == 'Darwin': # Check if the OS is macOS if platform.system() == 'Darwin': # Check if the OS is macOS
mac_path = self.get_app_support_path_mac(); mac_path = self.get_app_support_path_mac()
#return self.get_app_support_path_mac() / filename #return self.get_app_support_path_mac() / filename
return f"{mac_path}/{filename}" return f"{mac_path}/{filename}"
else: else:
@@ -448,16 +449,20 @@ https://www.scorchsoft.com/blog/text-to-mic-for-meetings/
if not self.recording: if not self.recording:
# Start recording # Start recording
self.recording = True self.recording = True
self.record_button.config(text="Stop") self.after(0, self.stop_recording_btn_change, "Stop") # Self.after because UI update so being careful due to threads
self.record_audio_start() self.record_audio_start()
else: else:
# Stop recording # Stop recording
self.recording = False self.after(0, self.stop_recording_btn_change, "Rec") # Self.after because UI update so being careful due to threads
self.record_button.config(text="Rec")
self.record_audio_stop() self.record_audio_stop()
self.recording = False
def stop_recording_btn_change(self, btn_text):
self.record_button.config(text=btn_text)
def record_audio_start(self): def record_audio_start(self):
import threading
self.frames = [] self.frames = []
self.p = pyaudio.PyAudio() self.p = pyaudio.PyAudio()
self.stream = self.p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024) self.stream = self.p.open(format=pyaudio.paInt16, channels=1, rate=44100, input=True, frames_per_buffer=1024)
@@ -471,24 +476,36 @@ https://www.scorchsoft.com/blog/text-to-mic-for-meetings/
self.record_thread = threading.Thread(target=record) self.record_thread = threading.Thread(target=record)
self.record_thread.start() self.record_thread.start()
def record_audio_stop(self): def record_audio_stop(self):
self.recording = False if self.recording:
self.stream.stop_stream() self.recording = False
self.stream.close() self.stream.stop_stream()
self.p.terminate() self.stream.close()
self.record_thread.join() # Ensure the recording thread has finished self.p.terminate()
# Save the recording to a file # Try joining with a timeout to see if the thread stops properly
file_path = self.get_audio_file_path("input_speech_recording.wav") self.record_thread.join(timeout=1)
wf = wave.open(str(file_path), 'wb') if self.record_thread.is_alive():
wf.setnchannels(1) # Log or handle the scenario where the thread did not stop as expected
wf.setsampwidth(self.p.get_sample_size(pyaudio.paInt16)) print("Warning: Recording thread did not stop as expected.")
wf.setframerate(44100)
wf.writeframes(b''.join(self.frames))
wf.close()
# Optionally transcribe the recording # Save the recording to a file
self.transcribe_audio(file_path) try:
file_path = self.get_audio_file_path("input_speech_recording.wav")
with wave.open(str(file_path), 'wb') as wf:
wf.setnchannels(1)
wf.setsampwidth(self.p.get_sample_size(pyaudio.paInt16))
wf.setframerate(44100)
wf.writeframes(b''.join(self.frames))
except Exception as e:
print(f"Error saving audio file: {e}")
return
# Optionally transcribe the recording
self.after(0, self.transcribe_audio, file_path)
def transcribe_audio(self, file_path): def transcribe_audio(self, file_path):
try: try:
@@ -498,15 +515,26 @@ https://www.scorchsoft.com/blog/text-to-mic-for-meetings/
model="whisper-1", model="whisper-1",
response_format="verbose_json" response_format="verbose_json"
) )
self.text_input.delete("1.0", tk.END) # Clear existing text
self.text_input.insert("1.0", transcription.text) # Insert new text #This prevents issues with trying to upload TK after thread operations
#whcih can cause crashes with no error displayed
self.after(0, self.transcribe_audio_update_ui, transcription)
print("Transcription Complete: The audio has been transcribed and the text has been placed in the input area.")
#messagebox.showinfo("Transcription Complete", "The audio has been transcribed and the text has been placed in the input area.") #messagebox.showinfo("Transcription Complete", "The audio has been transcribed and the text has been placed in the input area.")
except Exception as e: except Exception as e:
messagebox.showerror("Transcription Error", f"An error occurred during transcription: {str(e)}") #messagebox.showerror("Transcription Error", f"An error occurred during transcription: {str(e)}")
self.after(0, self.throw_error_test, 'transcription',e)
#print(f"Transcription error: An error occurred during transcription: {str(e)}")
def transcribe_audio_update_ui(self, transcription):
self.text_input.delete("1.0", tk.END) # Clear existing text
self.text_input.insert("1.0", transcription.text) # Insert new text
print("Transcription Complete: The audio has been transcribed and the text has been placed in the input area.")
def throw_error_test(self, error_type, e):
print(f"{error_type} error: An error occurred during transcription: {str(e)}")
if __name__ == "__main__": if __name__ == "__main__":
app = Application() app = Application()