File size: 1,417 Bytes
e417aa9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
"""Audio transcription using faster-whisper (CPU-friendly)."""

import logging
import os
from typing import Optional

logger = logging.getLogger(__name__)

_model = None


def _get_model():
    """Load and cache the faster-whisper model (loaded once per process)."""
    global _model
    if _model is None:
        from faster_whisper import WhisperModel
        model_size = os.environ.get("WHISPER_MODEL", "base")
        logger.info("Loading faster-whisper model: %s", model_size)
        _model = WhisperModel(model_size, device="cpu", compute_type="int8")
        logger.info("faster-whisper model loaded")
    return _model


def transcribe_audio(audio_path: Optional[str]) -> list[dict]:
    """Transcribe an audio file and return timestamped segments.

    Returns a list of dicts with keys: start, end, text.
    Returns an empty list if audio_path is None.
    """
    if audio_path is None:
        logger.info("No audio path provided; skipping transcription")
        return []

    model = _get_model()
    logger.info("Transcribing %s", audio_path)
    segments_iter, _info = model.transcribe(audio_path, word_timestamps=True)

    segments = []
    for seg in segments_iter:
        segments.append({
            "start": seg.start,
            "end": seg.end,
            "text": seg.text.strip(),
        })

    logger.info("Transcription complete: %d segments", len(segments))
    return segments