Spaces:
Running
on
A10G
Running
on
A10G
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}") | |