Post processing videozáznamů z konference jOpenSpace
V dnešním článku bych se s vámi rád podělil o své zkušenosti se zpracováním videozáznamů z konference jOpenSpace. Videozáznamy z konference připravujeme už řadu let a postupně se nám práci s tím podařilo zásadně zjednodušit a zefektivnit. Ještě před pár lety nám trvalo i víc než měsíc, než se nám podařilo záznamy zveřejnit a příprava popisků a zveřejnění na webu byla celkem pracná ruční práce. Už vloni se podařilo videa zveřejnit do týdne a letos nebýt mého vytížení v práci bychom to stihli do pár dnů. A ano, hádáte správně, za vším stojí automatizace a vibe coding.
Natáčení
Velkým objevem bylo objevení kameramana Josefa Maška, který by má neuvěřitelný poměr cena/výkon. Spolupracujeme s ním už několik let a i na jeho práci je rok od roku vidět pokrok. Na letošním ročníku jsme testovali robotickou kameru, která sama sleduje řečníka a samozřejmostí je live stream a prolínání záběrů na řečníka a na slajdy. Prakticky ještě v neděli večer máme všechny 10-minutové přednášky nastříhané včetně úvodní a závěrečné obrazovky a nahrané na našem kanálu na YouTube (a že jich je poměrně dost - letos přes 40 takových záznamů). Do budoucna musíme ještě provést nějakou edukaci přednášejících a vyhradit jim ideální “operační prostor”, aby byl záběr z kamer optimální. Někteří (jako třeba já) mají tendenci šňěrovat po pódiu ze strany na stranu, otáčet se zády ke kameře (publiku) a provádět další vylomeniny, které na pódium nepatří.
Titulky
Už vloni jsme objevili, že YouTube k videům automaticky generuje titulky v češtině a kvalita je celkem obstojná. Doposud jsem vždy prosil účastníky ne-konference, aby připravovali sdílené zápisy, ze kterých jsem následně vytvářel abstrakty k videím nejen u samotného videa, ale i v archívu přednášek na https://www.jopenspace.cz, což mj. umožňuje vyhledávačům lépe najít jejich přednášky. Kvalita společných zápisků byla rok od roku proměnlivá a hlavně jsem cítil, že to lidi moc nebaví. Vloni jsem tedy zkusil požádat ChatGPT o vygenerování abstraktů z automaticky generovaných titulků a výsledek byl překvapivě dobrý.
Letos jsem postup chtěl zopakovat a zkusit automatizovat - koneckonců máme rok “vibe-codingu”, tak to nemusím programovat sám a požádám o to Junie, zatímco se budu věnovat úklidu domácnosti, která je po konferenci v troskách. A to jsem ještě nevěděl, že mě čeká zajímavé dobrodružství.
YouTube poskytuje dvě různá API:
- jedno pro veřejná data - k tomu stačí API klíč
- druhé pro správu vlastních dat - k tomu je potřeba OAuth2 autorizace
Paradoxně pro získání vygenerovaných titulků je potřeba použít to druhé API. A bohužel, proklikání peklem Google Developer Console za vás zatím žádné AI nástroje neudělají. Takže tohle utrpení musíte pěkně absolvovat sami. Asi po hodině boje se mi podařilo vše správně nastavit, povolit ten správný účet na testování a vygenerovat client id a secret. Ke stažení titulků byl už jen kousek.
Junie mi krásně navajbila třídu PlaylistCaptionsDownloader, kerý mi stáhne české titulky pro všechna videa z konkrétního playlistu. Jenže ouha než jsem skript doladil, přišel jsem o celou denní kvótu 10 tisíc requesty na YouTube API, protože Google evidentě pro některé requesty čerpá kvótu rychleji a my těch videí máme hodně. Ok, zkouším zažádat Google o vyšší kvótu a zatím se spokojím s použitím volně dostupných nástrojů na stahování titulků a postahuji je ručně. Příští rok už to snad bude fungovat.
Chybějící titulky
Dalším zajímavým problémem je, že k některým videím YouTube titulky nevygeneroval - nevím, co má proti přednáškám Tomuchy, Ondry Nekoly nebo Vondry. Podle mě to jsou fajn kluci a přednes mají hezký. Ale YouTube to vidí jinak. Titulky prostě nejsou a mě chybí takto asi 6 otitulkovaných videí. Naštěstí AI pokročilo, tak jsem požádal Junie, aby mi navajbila třídu SubtitleTranscriber a chybějící titulky si necháme vygenerovat přes OpenAI speech-to-text API.
Chvíli nám to spolu trvalo, protože JUnie se rozhodla použít model gpt-4o-transcribe
místo whisper-1
, který je pro tento účel vhodnější a levnější. Ale nakonec se nám to podařilo a z videí jsme dostali rovnou textové přepisy s časovými značkami ve formátu SRT.
Generování abstraktů
Nyní už máme všechny titulky a přepisy pohromadě a můžeme se pustit do generování abstraktů. Opět jsem požádal Junie, aby mi navajbila třídu SubtitleAbstractor a abstrakty si necháme vygenerovat přes OpenAI text-to-text API i s nějakým vlastním úvodním promptem.
Publikování
Ve chvíli, kdy jsou abstrakty hotové, stačí je vložit zpátky do videí jako jejich popisky. K tomu jsem si nechal od JUnie udělat třídu VideoDescriptionsUpdater, což bylo už velmi triviální, když jsme měli prostřelenou cestu přes YouTube API. Samozřejmě moje kvóta byla už vyčerpaná, takže letos jsem skript nevyužil a popisky musel navkládat ručně. Ale příští rok, to už bude skvělé (pokud Google zase nezmění pravidla hry).
A nakonec s popisky na web
Posledním krokem je skript CsvSyncer, který do CSV souboru, který používáme jako zdroj dat pro Hugo, který generuje statický obsah našeho webu, doplní nové popisky a odkazy na videa. Základ CSV si připravím v OpenOffice - vykopíruju jména přednášejících, názvy přednášek, odkazy na jejich sociální sítě a odkazy na slajdy přednášek z naší organizační tabulky a skript pak přes YouTube API (tentokrát veřejné) identifikuje správné video a podle ID videa doplní odpovídající abstrakt a také odkaz na video. Názvy videí nejsou úplně totožné s názvem přednášky, takže používáme Jaro-Winkler distance algoritmus pro nalezení nejpodobnějšího názvu videa.
Výsledný CSV soubor už pak stačí jen pushnout a CI se postará o nasazení na web.
A je to. Videozáznamy jsou hotové, otitulkované, popsané a zveřejněné na webu. A to vše během pár dnů od konference. Už se těším na příští ročník, kde to snad bude ještě rychlejší a lepší.