align.py
Language Python1.2 KB34 lines
"""Word timestamps: WhisperX's wav2vec2 forced alignment.Runs on either engine's segments. Neither Whisper model returns reliable wordtiming on its own (DeepInfra returns none), and speaker assignment needs it.When no alignment model exists for the language, the result passes throughuntouched and shape.py interpolates sentence times across each segment."""from __future__ import annotationsfrom functools import lru_cachefrom pathlib import Pathfrom .audio import load_wav16k@lru_cache(maxsize=4)def _align_model(language: str, device: str):import whisperxreturn whisperx.load_align_model(language_code=language, device=device)def align(result: dict, wav: Path, device: str = "cpu", log=print) -> dict:import whisperxlanguage = result.get("language") or "en"try:model, metadata = _align_model(language, device)except ValueError as e: # no default alignment model for this languagelog(f" align: skipped ({e}); timestamps will be interpolated.")return resultaudio = load_wav16k(wav)aligned = whisperx.align(result["segments"], model, metadata, audio, device,return_char_alignments=False)return {**result, "segments": aligned["segments"], "aligned": True}