Převod souborů titulků: nejlepší postupy pro přesnost, kompatibilitu a zpřístupnění
Soubory titulků jsou neviditelným mostem mezi mluveným obsahem a diváky, kteří potřebují titulky, překlady nebo vizuální nápovědy. Na rozdíl od video‑ nebo obrazových dat je titulky prostý text představující časování, dialog a občas i stylování. Převod tohoto textu mezi formáty může vypadat jako triviální úkol, ale nešetrný převod může posunout časové značky, poškodit kódování znaků, odstranit důležité stylování nebo porušit soulad s normami přístupnosti. Následující průvodce prochází technické nuance převodu titulků, ukazuje spolehlivé pracovní toky a zdůrazňuje opatření potřebná k tomu, aby titulky zůstaly užitečné a právně v pořádku.
Proč je převod titulků důležitý
Video platformy, vysílací systémy a e‑learningové portály each impose their own subtitle specifications. A YouTube upload expects WebVTT (.vtt), while many desktop media players still rely on SubRip (.srt). Broadcast environments may demand EBU‑STL (.stl) or TTML (.ttml). When a content library grows—think a multilingual series, a corporate training module, or an archive of conference talks—maintaining a single source file for each language quickly becomes unsustainable. Converting the master subtitle into the required formats is the only way to reuse the content efficiently.
Beyond technical compatibility, accessibility legislation (such as the Americans with Disabilities Act, the European Accessibility Act, or WCAG 2.1) often stipulates that captions be accurate to within a fraction of a second and include proper language markup. Errors introduced during conversion can render a video non‑compliant, expose an organization to legal risk, or simply frustrate viewers.
Přehled běžných formátů titulků
| Formát | Přípona | Typické použití | Klíčové vlastnosti |
|---|---|---|---|
| SubRip (SRT) | .srt | Široká kompatibilita, jednoduchá editace | Prostý text, ISO‑8859‑1 nebo UTF‑8, sekvenční číslování cue |
| WebVTT | .vtt | Webové streamování, HTML5 video | Přidává hlavičku (WEBVTT), podporuje nastavení cue (pozice, zarovnání), Unicode je výchozí |
| Advanced SubStation Alpha (ASS/SSA) | .ass / .ssa | Anime fansuby, vlastní stylování | Bohatý blok stylů, per‑cue přepsání, podporuje karaoke efekty |
| EBU‑STL | .stl | Vysílání, DVD autorství | Binární soubor, pevně‑definovaná pole, omezená znaková sada (často ISO‑6937) |
| TTML (Timed Text Markup Language) | .ttml | Streamingové služby, SMPTE‑compatible workflow | XML‑založený, expresivní metadata, podporuje více regionů |
| DFXP (Distribution Format Exchange Profile) | .dfxp | Netflix, Hulu | XML, odvozený od TTML, často zabalený v cc namespace |
Každý formát má odlišnou sadu omezení. Při převodu musíte mapovat schopnosti zdroje na limity cíle, aniž byste ztratili podstatná data.
Zachování časové přesnosti
Vědomí snímkové rychlosti
Titulky vyjadřují čas buď jako absolutní časové značky (hodiny:minuty:sekundy,milisekundy) nebo jako počty snímků (zejména ve vysílacích formátech). Převod ze zdroje založeného na snímcích (např. EBU‑STL) do časového formátu (SRT, VTT) vyžaduje přesnou snímkovou rychlost původního videa. Rozdíl i o 0,1 fps může během 30‑minutového programu vyústit v několik sekund driftu.
Praktický tip: Zaznamenejte snímkovou rychlost videa z jeho metadat (ffprobe nebo MediaInfo) před převodem. Když používáte nástroj, který přijímá argument snímkové rychlosti (např. ffmpeg -i input.stl -f srt output.srt -r 29.97), předávejte přesnou hodnotu.
Drop‑Frame vs. Non‑Drop‑Frame
NTSC video (≈29,97 fps) občas používá drop‑frame timecode, aby se hodiny udržely v souladu se skutečným časem. Převod takových časových značek do prostého textového formátu, který předpokládá non‑drop‑frame, způsobí systematický posun asi 3,6 sekundy za hodinu.
Řešení: Identifikujte, zda zdroj používá notaci drop‑frame (středník ; v SMPTE timecode). Pokud ano, nejprve převeďte časové značky na absolutní sekundy a poté je vykreslete ve stylu cílového formátu s čárkou oddělenými hodnotami.
Ověřovací nástroje
Po převodu spusťte subtitle diff, který porovná start/end čas cue v toleranci (např. ±0,02 s). Jednoduché Python skripty používající knihovnu pysrt mohou načíst oba soubory, projít cue a označit nesoulady. Pro velké dávky integrujte diff do CI kroku, aby byl jakýkoli drift zachycen včas.
Zpracování kódování znaků a směru jazyka
Většina moderních formátů titulků výchozí používá UTF‑8, ale legacy formáty jako EBU‑STL mohou obsahovat ISO‑6937 nebo ISO‑8859‑15. Při převodu musí enkodér detekovat kódování zdroje a správně ho přenkódovat.
Detekce kódování: Použijte chardet nebo enca k odhadu charsetu před převodem. Nesprávně detekované kódování se projeví jako špatné znaky (např. “é” místo “é”).
Jazyky zapisované zprava doleva: Arabština, hebrejština a perština vyžadují nejen správné kódování, ale i odpovídající bidi zpracování. WebVTT podporuje nastavení cue direction: rtl;; ASS podporuje přepis \R2. Během převodu přeneste tyto direktivy ze zdrojového markup (pokud existuje) do cílového.
Unicode normalizace: Některé platformy normalizují na NFC, jiné akceptují NFD. Pokud po převodu chybí diakritika, aplikujte unicodedata.normalize('NFC', text) před zápisem cílového souboru.
Zachování stylování a pozicování
Pouze podmnožina formátů titulků podporuje vizuální stylování. Převod z bohatě stylovaného zdroje (např. ASS) do prostého textu (SRT) nevyhnutelně ztrácí informace. Existují však strategie, jak si co nejvíce zachovat:
- Mapování základních stylů – barva, velikost písma a zarovnání lze vyjádřit v cue nastaveních WebVTT (
color:#ff0000,line:90%). Při přechodu do ASS generujte blok stylů, který odráží původní VTT cue nastavení. - Export stylových metadat – pokud cílový formát nedokáže styl vyjádřit, vložte komentářovou řádku (
NOTEve VTT), která popisuje zamýšlený vzhled. To se hodí pro pozdější editory. - Zachování pozicování – některé formáty dovolují absolutní pixelové pozicování (
position:10%). Zachovejte tato čísla během převodu; vyhněte se výchozímu umístění na spodní střed, které může zakrýt grafiku na obrazovce.
Když je směr převodu z jednoduchého formátu do složitějšího (např. SRT → ASS), můžete aplikovat výchozí stylový profil, který přidá čitelný font, poloprůhledné pozadí a mírný okraj. Tím zajistíte, že nově generované titulky budou použitelné bez ručního doladění.
Dávkový workflow pro velké knihovny
Zpracování jediného souboru titulků je přímočaré; zpracování celého katalogu multijazykových aktiv vyžaduje automatizaci. Níže je minimalistický, multiplatformní pipeline postavený na Pythonu a FFmpeg:
import os, subprocess, json, pathlib
from pathlib import Path
# Configuration ---------------------------------------------------
SOURCE_DIR = Path('raw_subtitles') # .ass, .stl, .ttml, etc.
TARGET_DIR = Path('converted')
TARGET_FORMAT = 'vtt' # Desired output format
FRAME_RATE = 23.976 # Required for frame‑based sources
# Helper: run a command and capture output ----------------------
def run_cmd(cmd):
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
raise RuntimeError(f"Command failed: {' '.join(cmd)}\n{result.stderr}")
return result.stdout
# Main loop ------------------------------------------------------
for src_file in SOURCE_DIR.rglob('*.*'):
rel = src_file.relative_to(SOURCE_DIR)
dest = TARGET_DIR / rel.with_suffix('.' + TARGET_FORMAT)
dest.parent.mkdir(parents=True, exist_ok=True)
cmd = [
'ffmpeg', '-y', '-i', str(src_file),
'-c:s', TARGET_FORMAT, '-r', str(FRAME_RATE),
str(dest)
]
print(f"Converting {src_file} → {dest}")
run_cmd(cmd)
Proč to funguje: FFmpeg rozumí většině kontejnerů titulků a automaticky provádí převod časových značek, správu znakových sad a základní překlad stylování. Skript projde strom zdrojů a zachová hierarchii adresářů, což je zásadní pro multijazykové nastavení, kde jsou jazykové kódy zakomponovány do cesty (en/episode01.srt).
Pro prostředí, kde FFmpeg postrádá potřebný codec (např. převod EBU‑STL na ASS), doplňte pipeline o nástroje specifické pro titulky, jako je subtitleedit (GUI) nebo stl2srt (CLI). Kombinujte je s Python skriptem pomocí volání subprocess.
Zajištění kvality: testování převedených titulků
Disciplínovaný QA proces zabraňuje chybám souvisejícím s titulky, aby se nedostaly k divákům.
- Porovnání kontrolních součtů – Vygenerujte MD5 hash textového obsahu zdroje (bez časových značek) a porovnejte jej s textem cíle po odstranění formátovacích tagů. Identické hashe ukazují, že dialog nebyl ztracen.
- Validace přehrávání – Použijte
ffprobek extrakci streamů titulků z finálního video kontejneru a ověřte, že očekávaný počet cue a jazyků je přítomen. - Vizuální kontrola – Vypusťte video s novou stopou titulků v reprezentativním přehrávači (např. VLC, webový prohlížeč) a ověřte, že klíčové momenty (rychlý dialog, překrývající se řeč) zůstávají synchronizované.
- Audit přístupnosti – Spusťte automatickou WCAG kontrolu (např. axe-core) na webové stránce, která embeduje video s WebVTT titulky. Nástroj upozorní na chybějící jazykové atributy (
lang="en"na elementu<track>) a porušení časování titulků.
V automatizované pipeline lze kroky 1‑3 skriptovat; krok 4 je nejlepší provést manuálně před uvolněním.
Ochrana soukromí při používání online převodníků
Mnoho organizací se vyhýbá cloudovým převodníkům titulků, protože zdrojové soubory mohou obsahovat proprietární dialog, důvěrné záznamy schůzek nebo osobní údaje. Když online služba takový text zpracuje, stává se potenciálním vektorem úniku dat.
Přístup orientovaný na soukromí dodržuje tři principy:
- Žádné trvalé úložiště – Služba by měla soubor po převodu okamžitě smazat.
- Šifrování přenosu – Používejte HTTPS (TLS 1.2+); ověřte otisk certifikátu.
- Zero‑knowledge zpracování – Server nesmí uchovávat žádnou čitelnou kopii obsahu titulků.
Pro týmy, které stále potřebují občasný převod na vyžádání bez instalace softwaru, webový nástroj na convertise.app zpracovává soubory výhradně v paměti a neukládá obsah do logů, což odpovídá soukromí‑prvnímu workflow.
Časté úskalí a jak se jim vyhnout
| Příznak | Příčina | Řešení |
|---|---|---|
| Překrývající se cue zmizí po převodu | Cílový formát nepodporuje více cue se stejným časovým razítkem (např. SRT) | Sloučte překrývající se cue do jedné řádky s oddělovačem nebo přejděte na formát, který překrytí podporuje (ASS, VTT). |
| Chybějící diakritické znaky | Nesprávná detekce charsetu zdroje | Explicitně uveďte -charset v nástrojích pro převod, nebo přidejte UTF‑8 BOM pro formáty, které to vyžadují. |
| Drift časování o 5 s+ během 30‑minutového videa | Špatná snímková rychlost použita při převodu ze snímkového zdroje | Získejte snímkovou rychlost z originálního videa a předávejte ji převodníku; ověřte na krátkém testovacím klipu. |
| Stylování ztraceno při přechodu z ASS na SRT | SRT neumí reprezentovat stylová metadata | Zachovejte podstatné styly v komentáři (NOTE) nebo zvažte zachování stylovaného formátu pro finální distribuci. |
| Pravotočtí jazyky vykreslené z levotočtě | RTL markup byl během převodu odstraněn | Mapujte RTL cue na cílový atribut směru (direction: rtl; ve VTT) a ujistěte se, že přehrávač ho respektuje. |
Tím, že každému symptomu přiřadíte kontrolní položku, můžete systematicky eliminovat chyby převodu.
Integrace převodu titulků do video pipeline
Moderní video produkční pipeline často spoléhají na FFmpeg, GStreamer nebo proprietární transkódovací enginy. Vložení převodu titulků jako samostatného kroku udržuje workflow modulární:
[Zdrojový mediální soubor] --> [Extrahovat audio] --> [Transkripce] --> [Vytvořit master SRT]
|
v
[Převod titulků] --> [Kódovat video s titulky]
Extrahovat audio může napojit službu speech‑to‑text, která vygeneruje master SRT. Převod titulků pak vytvoří VTT pro web, ASS pro vysílání a DFXP pro streamingové služby. Udržováním jediného master SRT zajistíte, že všechny downstream formáty zůstanou synchronizované.
Pokud používáte GStreamer, element subparse dokáže číst širokou škálu formátů titulků a vystavit je jako surový textový stream; element subtitleoverlay pak může titulky renderovat přímo do videa před kódováním. Pro dávkové zpracování napište launch pipeline, která projde playlist souborů.
Závěrečná kontrolní lista pro spolehlivý převod titulků
- Identifikujte zdrojový formát a jeho omezení (snímková rychlost, charset, stylování).
- Zaznamenejte požadovaný formát cílové platformy a jakékoli povinné metadata (kód jazyka, region).
- Ověřte kódování znaků před převodem; v případě potřeby převádějte na UTF‑8.
- Zachovejte časovou přesnost: použijte přesnou snímkovou rychlost, správně zacházejte s drop‑frame.
- Mapujte stylování, kde je to možné; jinak zdokumentujte ztracené styly v komentářích.
- Proveďte automatický diff časových značek a textového obsahu.
- Proveďte test přehrávání na reprezentativních zařízeních (desktop, mobil, asistivní technologie – screen readery).
- Proveďte audit přístupnosti pro jazykové atributy a časování cue.
- Zajistěte soukromí: použijte zpracování v paměti, HTTPS a žádné logy surových titulků.
- Dokumentujte jakékoli fallbacky (např. sloučení překrývajících se cue) pro budoucí referenci.
Dodržováním těchto postupů můžete převádět titulky ve velkém měřítku, aniž byste obětovali synchronizaci, čitelnost nebo právní soulad, na který se diváci spoléhají. Ať už připravujete vícejazyčný firemní webinář, archivujete konferenční sérii nebo dodáváte titulky pro streamingovou službu, disciplinovaný převodní workflow promění surový text v univerzální a přístupný zážitek ze sledování.