import io import threading from multiprocessing import Queue from queue import Empty from faster_whisper import WhisperModel import logging import sys # Configure logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", handlers=[logging.StreamHandler(sys.stdout)], ) # Get a logger for your app logger = logging.getLogger(__name__) class AudioTranscriber(threading.Thread): def __init__(self, audio_queue: "Queue[io.BytesIO]", text_queue: "Queue[str]"): super().__init__() self.audio_queue = audio_queue self.action_queue = text_queue self.daemon = True # Thread will exit when main program exits self.transcriber = WhisperModel( "large", device="cuda", compute_type="int8", ) def run(self): while True: try: # Wait for 1 second before timing out and checking again audio_chunk = self.audio_queue.get(timeout=1) # Process the audio chunk using the faster-whisper implementation segments, info = self.transcriber.transcribe(audio_chunk, language="fr") # Put the transcription results in the output queue for segment in segments: self.action_queue.put(segment.text) # Still print for debugging logger.info( f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}" ) except Empty: continue # If queue is empty, continue waiting except Exception as e: logger.error(f"Error processing audio chunk: {e}")