Přepis a strojový překlad titulků k filmu nebo seriálu
Motivace
K mému oblíbenému seriálu z roku 1983 jsem nedohledal anglické titulky. Vytvoříme je automaticky ze zvukové stopy; a když už budeme mít anglické titulky, tak je strojově přeložíme do češtiny.
Výsledek
Tři série seriálu Hardcaste and McCormick mají v součtu 54 hodin videa. Celý postup přepisu a překladu běžel asi trojnásobek tohoto času. Vše lokálně bez závislosti na cloudu a to mám jen starou NVIDIA Quadro RTX 4000. Oba použité AI modely se bez problému vejdou do 8GB.
Python skripty ke stažení
stáhnout z Google Disku
Slepá ulička
Zkusil jsem vygenerovat čtený překlad do audio stopy, ale výsledek byl tristní. Ne, že by to nefungovalo, ale titulky jsou jednoznačně lepší.
1. extrakce zvukové stopy z filmu
Z filmu uložíme zvuk. Umí to přehrávač VLC/dopravní kužel a umí to ze všech videí, které si dáme do playlistu. Nebo můžeme použít přiložený skript (používá ffmpeg), který ze všech filmů v aktuální složce uloží zvuk a výstup pojmenuje stejně jako film. Liší se pouze přípona.
film2wav.sh
2. převod angličtiny na text
Pokud by existovaly titulky .srt v angličtině, tento krok přeskočíme a ušetříme nemalé množství času, protože přesný přepis textu ze zvuku trvá asi 2,5 násobek délky audia.
Přepíše všechny .wav soubory v aktuální složce do podoby filmových titulků .srt
nahrát .wav soubory a spustit:
python3 wav_srt.py
3. překlad do češtiny
Samotný překlad běží svižně. Přeloží všechny .srt titulky v aktuální složce do češtiny a uloží je jako _cs.srt
CUDA nebo CPU ?
v programu srt_preloz.py je na výběr, jestli má překlad běžet akcelerovaně
NVIDIA_CUDA = True #False pro CPU
pak stačí spustit a všechny anglické titulky se přeloží do češtiny
python3 srt_preloz.py
Víc netřeba
- umíme vycucnout anglický zvuk z filmu, uložit ho jako
.wav - přepsat do textu a uložit jako titulky
.srt - přeložit anglické
.srttitulky do češtiny
Instalace potřebných knihoven
vytvořit prostředí:
python3 -m venv whisper_env
aktivovat prostředí:
source whisper_env/bin/activate
vybrat verzi knihovny
verze pro NVIDIA CUDA:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
verze pro CPU (univezální):
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
verze pro AMD karty, ale pouze Linux/WSL:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.1
verze pro macOS zapne hw akceleraci Apple Metal (MPS):
pip install torch torchvision torchaudio
dále potřebujeme instalovat knihovny
pip install -U openai-whisper pysrt "transformers==4.49.0" sentencepiece accelerate
Jak fedruje wav_srt.py
Tento program slouží k plně automatickému přepisu zvukových stop (.wav) do anglických titulků (.srt) s integrovaným systémem pro čištění chyb a opravu časování. Řeší typické neduhy AI přepisu, jako jsou “visící” titulky během dlouhých pasáží ticha nebo generování nesmyslných textů (halucinací).
Použitý AI model a jeho nastavení
Program využívá k přepisu mluveného slova model Whisper od OpenAI.
- Verze modelu:
large(největší a nejpřesnější dostupná verze, která minimalizuje chyby v porozumění). - Akcelerace: Model je natvrdo nastaven k běhu na grafické kartě (
device="cuda"), což zajišťuje několikanásobně rychlejší zpracování než přes procesor.
Konfigurace při samotném přepisu (funkce transcribe)
Aby model nevynechával věty v rozhovorech a zároveň si nevymýšlel texty v hudebních pasážích, je volán s těmito specifickými parametry:
language="en": Vynucuje rozpoznávání angličtiny (zabraňuje tomu, aby model začal náhodně překládat nebo detekovat jiný jazyk ze šumu).condition_on_previous_text=False: Zabraňuje modelu, aby se zacyklil. Pokud by tato hodnota bylaTrue, model by se mohl „zaseknout“ na jedné frázi a opakovat ji stále dokola.no_speech_threshold=0.6: Zpřísňuje toleranci pro ticho. Pokud má zvukový úsek nižší pravděpodobnost mluveného slova než 60 %, model jej ignoruje jako šum nebo hudbu.verbose=True: Zajišťuje, že program v terminálu průběžně vypisuje zachycené titulky v reálném čase.
Jak program funguje (Krok za krokem)
- Načtení modelu: Skript nejprve načte model Whisper do VRAM grafické karty.
- Hledání souborů: Prohledá aktuální složku a najde všechny soubory s koncovkou
.wav. Automaticky přitom ignoruje soubory končící na_cz_dabing.wav(aby nepřepisoval již hotový vygenerovaný český dabing). - Přepis zvuku: Pokud k
.wavsouboru ještě neexistuje.srtsoubor, spustí se AI přepis a výsledek se uloží do aktuální složky. - Čištění a oprava časů: Jakmile je soubor
.srtvytvořen (nebo pokud již existoval), program jej načte pomocí knihovnypysrta spustí sérii oprav (viz níže).
Mechanismus čištění a oprav (Post-processing)
Samotný výstup z Whisperu není pro přímé sledování ideální, proto skript provádí tři zásadní úpravy hotového textu:
1. Odstranění “halucinací” (Funkce is_hallucination)
Whisper se učil na televizních datech a v místech, kde je naprosté ticho nebo hraje pouze hudba, má tendenci vkládat vodoznaky nebo popisy hudby. Skript tyto řádky natvrdo maže:
- Maže texty obsahující hudební značky a tagy:
"¶","sólová kytara","solo guitar","bf-watch", atd. - Maže specifické 20–30vteřinové výkřiky do ticha na konci dílů (pokud titulek trvá déle než 20 sekund a obsahuje pouze
"thank you.","i'm sorry."nebo"uh-huh.").
2. Zkrácení zacyklených slov (Funkce clean_repeated_words)
Pokud postava křičí nebo koktá, AI občas vygeneruje nekonečnou smyčku (např. „No, no, no, no, no, no…“). Skript obsahuje regulární výraz, který podobná slova zkrátí maximálně na tři opakování („No, no, no.“).
3. Dynamická oprava časování (Funkce fix_srt_timings)
Toto je nejdůležitější opravný mechanismus skriptu. Řeší problém, kdy Whisper u slova, které následuje po dlouhé hudební scéně, nastaví začátek titulku na začátek hudby (titulek pak visí na obrazovce třeba 20 vteřin dříve, než postava vůbec promluví).
Logika opravy:
- Skript vezme délku textu (počet znaků) a spočítá, jak dlouho by měl titulek přirozeně svítit na obrazovce (minimálně 1,6 s, maximálně 4,8 s).
- Vzorec:
1100 ms + (počet znaků * 55 ms)
- Vzorec:
- Pokud titulek trvá na obrazovce déle než stanovený limit
MAX_ALLOWED_DURATION_MS(5,5 vteřiny) a zároveň je jeho trvání výrazně delší než spočítaná doba čtení, skript zasáhne. - Posun začátku: Protože Whisper určuje konec mluvení vždy naprosto přesně, skript ponechá koncový čas na místě a posune začátek titulku dopředu tak, aby odpovídal přirozené době čtení (čímž odstraní hluché místo před promluvou).
Nakonec skript titulky přečísluje a soubor .srt uloží zpět na disk. V terminálu pak vypíše souhrn – kolik dlouhých titulků zkrátil a kolik vymýšlených halucinací smazal.
Jak fedruje srt_preloz.py
Tento program slouží k plně offline automatickému překladu anglických filmových a seriálových titulků (.srt) do češtiny. Využívá k tomu dedikovanou umělou inteligenci navrženou speciálně pro vysoce kvalitní vícejazyčné překlady.
Použitý AI model a jeho parametry
Program ke své práci využívá open-source model NLLB-200 (No Language Left Behind) od společnosti Meta (Facebook).
- Verze modelu:
facebook/nllb-200-distilled-1.3B(Jedná se o odlehčenou „distilled“ verzi s 1,3 miliardami parametrů, která nabízí ideální poměr mezi špičkovou kvalitou překladu a paměťovou náročností, takže se bez problémů vejde např. do 8GB VRAM grafické karty). - Vstupní a výstupní jazyk: Tokenizér je nastaven na čtení angličtiny (
src_lang="eng_Latn") a model je při generování natvrdo nucen zahajovat větu tokenem pro češtinu (forced_bos_token_id=ces_token_id), což zajišťuje konzistentní český výstup.
Konfigurace a kvalita generování
Kvalitu a rychlost překladu řídí ve skriptu tyto klíčové parametry:
BATCH_SIZE = 16: Zapíná tzv. dávkové zpracování. Model nepřekládá věty jednu po druhé, ale vezme jich 16 najednou, zpracuje je paralelně a vrátí je zpět. To extrémně urychluje práci na grafických kartách (využívá se jejich masivní paralelní výkon).num_beams=4(Beam Search): Klíčový parametr pro kvalitu překladu. Místo toho, aby model překládal slovo od slova tak, jak ho napadne první možnost (Greedy Search), zvažuje souběžně 4 různé „větve“ překladu a na konci vybere tu, která dává z hlediska celkového českého slovosledu největší smysl. Zabraňuje to krkolomným strojovým překladům.max_length=256: Omezuje maximální délku přeložené repliky (v tokenech), čímž zamezuje tomu, aby se model u nějaké věty „zasekl“ a začal generovat nekonečný text.
Hardwarové nastavení (GPU vs. CPU)
Skript obsahuje manuální přepínač pro volbu výpočetní jednotky:
NVIDIA_CUDA = True (nebo False)
- Při zapnutí na True (pro grafické karty NVIDIA):
Model se přesune do VRAM karty (
.to("cuda")). Zásadní je parametrtorch_dtype=torch.float16(poloviční přesnost) – díky němu model zabere zhruba jen poloviční velikost paměti (cca 2,7 GB) a moderní Tensor jádra na NVIDIA kartách (jako je Quadro RTX) jej dokáží počítat několikanásobně rychleji bez viditelné ztráty kvality. - Při přepnutí na False (pro procesory):
Model běží ve standardní přesnosti
torch.float32a přesouvá se do RAM a procesoru (.to("cpu")). Tato cesta je výrazně pomalejší, ale funguje na jakémkoliv hardwaru bez ohledu na grafickou kartu.
Jak probíhá překlad (Krok za krokem)
- Vyhledání souborů: Skript si najde všechny
.srtsoubory ve složce. Pokud už u některého existuje český protějšek s koncovkou_cs.srt, rovnou jej přeskočí, aby nepřekládal totéž dvakrát. - Filtrace a spojování vět: Otevře anglický soubor pomocí knihovny
pysrt. Projde všechny titulky a:- Ignoruje prázdné titulky a titulky s halucinacemi/značkami hudby (obsahující
¶nebo©). - Zásadní oprava: Funkce
.replace("\n", " ")u platných titulků smaže odřádkování. Pokud Whisper rozdělil jednu anglickou větu do dvou řádků v jednom titulku, model ji díky tomuto spojení dostane celou, pochopí kontext a nepřeloží ji jako dvě nedávající smysl oddělené části.
- Ignoruje prázdné titulky a titulky s halucinacemi/značkami hudby (obsahující
- Dávkový překlad: Spojené texty se rozřežou po 16 (
BATCH_SIZE) a odesílají se na grafickou kartu. - Rekonstrukce a výpis: Hotové překlady se vkládají přesně na ta stejná místa, odkud byl vzat anglický originál. Tím zůstanou zachovány původní zlomky sekund v časování. Program zároveň do terminálu krásně pod sebe vypisuje časové okno, anglický originál a hotový český překlad.
- Uložení: Výsledek je uložen s koncovkou
_cs.srtv kódování UTF-8, aby se korektně zobrazovala česká diakritika.