diff --git a/model.py b/model.py index ae0cc25d..bc0b2706 100644 --- a/model.py +++ b/model.py @@ -9,7 +9,7 @@ from datetime import datetime from logging import getLogger, FileHandler, Formatter, INFO from time import sleep from queue import Queue -from threading import Thread, Event +from threading import Thread from requests import get as requests_get import webbrowser @@ -33,22 +33,20 @@ from config import config class threadFnc(Thread): def __init__(self, fnc, end_fnc=None, daemon=True, *args, **kwargs): - super(threadFnc, self).__init__(daemon=daemon, *args, **kwargs) + super(threadFnc, self).__init__(daemon=daemon, target=fnc, *args, **kwargs) self.fnc = fnc self.end_fnc = end_fnc - self._stop = Event() - def stop(self): - self._stop.set() - def stopped(self): - return self._stop.is_set() - def run(self): - while True: - if self.stopped(): - if callable(self.end_fnc): - self.end_fnc() - return - self.fnc(*self._args, **self._kwargs) + self.loop = True + def stop(self): + self.loop = False + + def run(self): + while self.loop: + self.fnc(*self._args, **self._kwargs) + if callable(self.end_fnc): + self.end_fnc() + return class Model: _instance = None @@ -392,9 +390,10 @@ class Model: ) def sendMicTranscript(): try: - self.mic_transcriber.transcribeAudioQueue(mic_audio_queue, config.SOURCE_LANGUAGE, config.SOURCE_COUNTRY) - message = self.mic_transcriber.getTranscript() - fnc(message) + res = self.mic_transcriber.transcribeAudioQueue(mic_audio_queue, config.SOURCE_LANGUAGE, config.SOURCE_COUNTRY) + if res: + message = self.mic_transcriber.getTranscript() + fnc(message) except Exception: pass @@ -425,9 +424,10 @@ class Model: def stopMicTranscript(self): if isinstance(self.mic_print_transcript, threadFnc): self.mic_print_transcript.stop() + self.mic_print_transcript.join() self.mic_print_transcript = None if isinstance(self.mic_audio_recorder, SelectedMicEnergyAndAudioRecorder): - self.mic_audio_recorder.stop(wait_for_stop=False, forced_stop=True) + self.mic_audio_recorder.stop() self.mic_audio_recorder = None # if isinstance(self.mic_get_energy, threadFnc): # self.mic_get_energy.stop() @@ -465,7 +465,7 @@ class Model: self.mic_energy_plot_progressbar.stop() self.mic_energy_plot_progressbar = None if isinstance(self.mic_energy_recorder, SelectedMicEnergyRecorder): - self.mic_energy_recorder.stop(wait_for_stop=False, forced_stop=True) + self.mic_energy_recorder.stop() self.mic_energy_recorder = None def startSpeakerTranscript(self, fnc, error_fnc=None): @@ -505,9 +505,10 @@ class Model: ) def sendSpeakerTranscript(): try: - self.speaker_transcriber.transcribeAudioQueue(speaker_audio_queue, config.TARGET_LANGUAGE, config.TARGET_COUNTRY) - message = self.speaker_transcriber.getTranscript() - fnc(message) + res = self.speaker_transcriber.transcribeAudioQueue(speaker_audio_queue, config.TARGET_LANGUAGE, config.TARGET_COUNTRY) + if res: + message = self.speaker_transcriber.getTranscript() + fnc(message) except Exception: pass @@ -538,9 +539,10 @@ class Model: def stopSpeakerTranscript(self): if isinstance(self.speaker_print_transcript, threadFnc): self.speaker_print_transcript.stop() + self.speaker_print_transcript.join() self.speaker_print_transcript = None if isinstance(self.speaker_audio_recorder, SelectedSpeakerEnergyAndAudioRecorder): - self.speaker_audio_recorder.stop(wait_for_stop=False, forced_stop=True) + self.speaker_audio_recorder.stop() self.speaker_audio_recorder = None # if isinstance(self.speaker_get_energy, threadFnc): # self.speaker_get_energy.stop() @@ -578,7 +580,7 @@ class Model: self.speaker_energy_plot_progressbar.stop() self.speaker_energy_plot_progressbar = None if isinstance(self.speaker_energy_recorder, SelectedSpeakerEnergyRecorder): - self.speaker_energy_recorder.stop(wait_for_stop=False, forced_stop=True) + self.speaker_energy_recorder.stop() self.speaker_energy_recorder = None def notificationXSOverlay(self, message): diff --git a/models/transcription/transcription_transcriber.py b/models/transcription/transcription_transcriber.py index c5a6cbff..56d9d979 100644 --- a/models/transcription/transcription_transcriber.py +++ b/models/transcription/transcription_transcriber.py @@ -1,3 +1,4 @@ +import time from io import BytesIO from threading import Event import wave @@ -38,6 +39,9 @@ class AudioTranscriber: self.transcription_engine = "Whisper" def transcribeAudioQueue(self, audio_queue, language, country): + if audio_queue.empty(): + time.sleep(0.01) + return False audio, time_spoken = audio_queue.get() self.updateLastSampleAndPhraseStatus(audio, time_spoken) @@ -75,6 +79,7 @@ class AudioTranscriber: if text != '': self.updateTranscript(text) + return True def updateLastSampleAndPhraseStatus(self, data, time_spoken): source_info = self.audio_sources diff --git a/requirements.txt b/requirements.txt index 14958d63..3e4c175b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -14,5 +14,5 @@ ctranslate2==4.1.0 faster-whisper==1.0.1 openvr==1.26.701 translators @ git+https://github.com/misyaguziya/translators@5.8.9 -SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.3 +SpeechRecognition @ git+https://github.com/misyaguziya/custom_speech_recognition@3.10.4 tinyoscquery @ git+https://github.com/cyberkitsune/tinyoscquery@0.1.2 \ No newline at end of file