Ako generovať a pridávať titulky k videám pomocou Pythonu, OpenAI Whisper a FFmpeg


Autor si vybral Open Source Initiative na získanie daru v rámci programu Write for DOnations.

Zavedenie

V tomto návode vytvoríte aplikáciu v jazyku Python schopnú extrahovať zvuk zo vstupného videa, prepísať extrahovaný zvuk, vygenerovať súbor s titulkami na základe prepisu a potom pridať titulky do kópie vstupného videa.

Na vytvorenie tejto aplikácie použijete FFmpeg na extrahovanie zvuku zo vstupného videa. Na vygenerovanie prepisu extrahovaného zvuku použijete Whisper od OpenAI a potom tento prepis použijete na vygenerovanie súboru s titulkami. Okrem toho použijete FFmpeg na pridanie vygenerovaného súboru titulkov do kópie vstupného videa.

FFmpeg je výkonný softvérový balík s otvoreným zdrojovým kódom na spracovanie multimediálnych údajov vrátane úloh spracovania zvuku a videa. Poskytuje nástroj príkazového riadka, ktorý používateľom umožňuje konvertovať, upravovať a manipulovať s multimediálnymi súbormi so širokou škálou formátov a kodekov.

Whisper od OpenAI je systém automatického rozpoznávania reči (ASR) určený na konverziu hovoreného jazyka na písaný text. Je vyškolený na obrovskom množstve viacjazyčných a multitaskingových údajov pod dohľadom a vyniká v prepise rôznorodého zvukového obsahu s vysokou presnosťou.

Na konci tohto tutoriálu budete mať k dispozícii aplikáciu schopnú pridať titulky k videu:

Predpoklady

Na sledovanie tohto návodu bude čitateľ potrebovať nasledujúce nástroje:

  • Nainštalovaný Python verzie 3.9+ a zodpovedajúci venv

  • FFmpeg nainštalovaný.

  • Základné znalosti jazyka Python. Môžete postupovať podľa tejto série kurzov a naučiť sa kódovať v jazyku Python.

Krok 1 – Vytvorenie koreňového adresára projektu

V tejto časti vytvoríte adresár projektu, stiahnete vstupné video, vytvoríte a aktivujete virtuálne prostredie a nainštalujete požadované balíky Pythonu.

Otvorte okno terminálu a prejdite na vhodné miesto pre váš projekt. Spustite nasledujúci príkaz na vytvorenie adresára projektu:

mkdir generate-subtitle

Prejdite do adresára projektu:

cd generate-subtitle

Stiahnite si toto upravené video a uložte ho do koreňového adresára projektu ako input.mp4. Video ukazuje dieťa menom Rushawn, ktoré spieva "Beautiful Day" od Jermaina Edwarda. Upravené video, ktoré použijete v tomto návode, bolo prevzaté z nasledujúceho videa YouTube:

Vytvorte nové virtuálne prostredie a pomenujte ho env:

python3 -m venv env

Aktivujte virtuálne prostredie:

source env/bin/activate

Teraz pomocou nasledujúceho príkazu nainštalujte balíky potrebné na zostavenie tejto aplikácie:

pip3 install faster-whisper ffmpeg-python

Pomocou príkazu vyššie ste nainštalovali nasledujúce knižnice:

  • rýchlejší šepot: je prepracovaná verzia modelu Whisper od OpenAI, ktorý využíva CTranslate2, vysokovýkonný inferenčný engine pre modely Transformer. Táto implementácia dosahuje až štyrikrát vyššiu rýchlosť ako openai/whisper s porovnateľnou presnosťou, a to všetko pri nižšej spotrebe pamäte.

  • ffmpeg-python: je knižnica Pythonu, ktorá poskytuje obal okolo nástroja FFmpeg a umožňuje používateľom jednoducho interagovať s funkciami FFmpeg v skriptoch Pythonu. Prostredníctvom rozhrania Pythonic umožňuje úlohy spracovania videa a zvuku, ako sú úpravy, konverzia a manipulácia.

Spustením nasledujúceho príkazu uložte balíky, ktoré boli nainštalované pomocou pip vo virtuálnom prostredí do súboru s názvom requirements.txt:

pip3 freeze > requirements.txt

Súbor requirements.txt by mal vyzerať takto:

av==10.0.0
certifi==2023.7.22
charset-normalizer==3.3.2
coloredlogs==15.0.1
ctranslate2==3.20.0
faster-whisper==0.9.0
ffmpeg-python==0.2.0
filelock==3.13.1
flatbuffers==23.5.26
fsspec==2023.10.0
future==0.18.3
huggingface-hub==0.17.3
humanfriendly==10.0
idna==3.4
mpmath==1.3.0
numpy==1.26.1
onnxruntime==1.16.1
packaging==23.2
protobuf==4.25.0
PyYAML==6.0.1
requests==2.31.0
sympy==1.12
tokenizers==0.14.1
tqdm==4.66.1
typing_extensions==4.8.0
urllib3==2.0.7

V tejto časti ste vytvorili adresár projektu, stiahli vstupné video, ktoré sa použije v tomto kurze, nastavili virtuálne prostredie, aktivovali ho a nainštalovali potrebné balíky jazyka Python. V ďalšej časti vygenerujete prepis vstupného videa.

Krok 2 – Generovanie prepisu videa

V tejto časti vytvoríte skript v jazyku Python, kde bude aplikácia žiť. V tomto skripte použijete knižnicu ffmpeg-python na extrahovanie zvukovej stopy zo vstupného videa stiahnutého v predchádzajúcej časti a jej uloženie ako súbor WAV. Ďalej použijete knižnicu rýchlejšieho šepotu na vygenerovanie prepisu extrahovaného zvuku.

V koreňovom adresári projektu vytvorte súbor s názvom main.py a pridajte doň nasledujúci kód:

import time
import math
import ffmpeg

from faster_whisper import WhisperModel

input_video = "input.mp4"
input_video_name = input_video.replace(".mp4", "")

Tu kód začína importom rôznych knižníc a modulov, vrátane time, math, ffmpeg z ffmpeg-python a vlastného modulu s názvom WhisperModel z faster_whisper. Tieto knižnice sa budú používať na spracovanie videa a zvuku, prepis a generovanie titulkov.

Ďalej kód nastaví názov vstupného video súboru, uloží ho do konštanty s názvom input_video a potom uloží názov video súboru bez prípony .mp4 do konštanty s názvom input_video_name. Nastavenie názvu vstupného súboru vám umožní pracovať na viacerých vstupných videách bez prepísania titulkov a výstupných video súborov, ktoré sú pre ne vygenerované.

Do spodnej časti main.py pridajte nasledujúci kód:

def extract_audio():
    extracted_audio = f"audio-{input_video_name}.wav"
    stream = ffmpeg.input(input_video)
    stream = ffmpeg.output(stream, extracted_audio)
    ffmpeg.run(stream, overwrite_output=True)
    return extracted_audio

Vyššie uvedený kód definuje funkciu s názvom extract_audio(), ktorá je zodpovedná za extrahovanie zvuku zo vstupného videa.

Najprv nastaví názov zvuku, ktorý sa extrahuje na názov vytvorený pripojením zvuku k základnému názvu vstupného videa s príponou .wav, a uloží tento názov do konštanty s názvom extracted_audio.

Ďalej kód zavolá metódu ffmpeg.input() knižnice ffmpeg na otvorenie vstupného videa a vytvorí objekt vstupného toku s názvom stream.

Kód potom zavolá metódu ffmpeg.output() na vytvorenie objektu výstupného prúdu so vstupným prúdom a definovaným názvom extrahovaného zvukového súboru.

Po nastavení výstupného prúdu kód zavolá metódu ffmpeg.run() a odovzdá výstupný stream ako parameter na spustenie procesu extrakcie zvuku a uloženie zvukového súboru extrahovaného do koreňového adresára projektu. Okrem toho je zahrnutý booleovský parameter overwrite_output=True, ktorý nahradí akýkoľvek už existujúci výstupný súbor novo vygenerovaným, ak takýto súbor už existuje.

Nakoniec kód vráti názov extrahovaného zvukového súboru.

Pod funkciu extract_audio() pridajte nasledujúci kód:

def run():

    extracted_audio = extract_audio()
run()

Tu kód definuje funkciu s názvom run() a potom ju zavolá. Táto funkcia volá všetky funkcie potrebné na generovanie a pridávanie titulkov k videu.

Vo vnútri funkcie kód volá funkciu extract_audio() na extrahovanie zvuku z videa a potom uloží názov zvukového súboru vrátený do premennej s názvom extracted_audio.

Vráťte sa do terminálu a vykonajte nasledujúci príkaz na spustenie main.py skriptu:

python3 main.py

Po vykonaní vyššie uvedeného príkazu sa v termináli zobrazí výstup FFmpeg a súbor s názvom audio-input.wav obsahujúci zvuk extrahovaný zo vstupného videa sa uloží do koreňového adresára vášho projektu.

Vráťte sa do súboru main.py a pridajte nasledujúci kód medzi funkcie extract_audio() a run():

def transcribe(audio):
    model = WhisperModel("small")
    segments, info = model.transcribe(audio)
    language = info[0]
    print("Transcription language", info[0])
    segments = list(segments)
    for segment in segments:
        # print(segment)
        print("[%.2fs -> %.2fs] %s" %
              (segment.start, segment.end, segment.text))
    return language, segments

Vyššie uvedený kód definuje funkciu s názvom transkrips zodpovednú za prepis zvukového súboru extrahovaného zo vstupného videa.

Najprv kód vytvorí inštanciu objektu WhisperModel a nastaví typ modelu na malý. Whisper od OpenAI má nasledujúce typy modelov: malý, základný, malý, stredný a veľký. Malý model je najmenší a najrýchlejší a veľký model je najväčší a najpomalší, ale najpresnejší.

Ďalej kód zavolá metódu model.transcribe() s extrahovaným zvukom ako argumentom na načítanie funkcie segments a zvukových informácií a uloží ich do premenných s názvom info a segmenty. Funkcia segmentov je generátor jazyka Python, takže prepis sa spustí až vtedy, keď ho kód iteruje. Prepis je možné spustiť až do konca zhromaždením segmentov v zozname alebo slučke for.

Ďalej kód uloží jazyk zistený vo zvuku do konštantnej pomenovanej informácie a vytlačí ho do konzoly.

Po vytlačení zisteného jazyka kód zhromaždí segmenty prepisu v zozname na spustenie prepisu a uloží segmenty zhromaždené do premennej, ktorá sa tiež nazýva segmenty. Kód potom prejde cez zoznam segmentov prepisu a vytlačí čas začiatku, čas ukončenia a text každého segmentu do konzoly.

Nakoniec kód vráti jazyk zistený v segmentoch zvuku a prepisu.

Do funkcie run() pridajte nasledujúci kód:

def run():

    extracted_audio = extract_audio()

    language, segments = transcribe(audio=extracted_audio)

Pridaný kód volá funkciu prepisu s extrahovaným zvukom ako argumentom a ukladá vrátené hodnoty v konštantách s názvom jazyk a segmenty.

Vráťte sa do terminálu a vykonajte nasledujúci príkaz na spustenie main.py skriptu:

python3 main.py

Pri prvom spustení tohto skriptu kód najskôr stiahne a uloží do vyrovnávacej pamäte model Whisper Small, ďalšie spustenia budú oveľa rýchlejšie.

Po vykonaní vyššie uvedeného príkazu by ste mali v konzole vidieť nasledujúci výstup:

…
Transcription language en
[0.00s -> 4.00s]  This morning I wake up and I look in the mirror
[4.00s -> 8.00s]  Every part of my body was in the place many people lie
[8.00s -> 11.00s]  I don't wanna act too high and mighty
[11.00s -> 15.00s]  Cause tomorrow I may fall down on my face
[15.00s -> 17.00s]  Lord I thank You for sunshine
[17.00s -> 19.00s]  Thank You for rain
[19.00s -> 20.00s]  Thank You for joy
[20.00s -> 22.00s]  Thank You for pain
[22.00s -> 25.00s]  It's a beautiful day
[25.00s -> 28.00s]  It's a beautiful day

Vyššie uvedený výstup ukazuje, že jazyk zistený vo zvuku je angličtina (en). Okrem toho zobrazuje čas začiatku a konca každého segmentu prepisu v sekundách a text.

Upozornenie: Hoci je rozpoznávanie reči Whisper od OpenAI veľmi presné, nie je 100% presné, môže podliehať obmedzeniam a občasným chybám, najmä v náročných jazykových alebo zvukových scenároch. Preto vždy skontrolujte prepis manuálne.

V tejto časti ste vytvorili skript v jazyku Python pre aplikáciu. Vo vnútri skriptu bol ffmpeg-python použitý na extrahovanie zvuku zo stiahnutého videa a jeho uloženie ako súboru WAV. Potom sa knižnica rýchlejšieho šepotu použila na vygenerovanie prepisu extrahovaného zvuku. V ďalšej časti vygenerujete súbor s titulkami na základe prepisu a potom pridáte titulky k videu.

Krok 3 - Generovanie a pridanie titulkov k videu

V tejto časti najprv pochopíte, čo je súbor s titulkami a ako je štruktúrovaný. Ďalej použijete segmenty prepisu vygenerované v predchádzajúcej časti na vytvorenie súboru s titulkami. Po vytvorení súboru s titulkami použijete knižnicu ffmpeg-python na pridanie súboru s titulkami do kópie vstupného videa.

Pochopenie titulkov: Štruktúra a typy

Súbor s titulkami je textový súbor, ktorý obsahuje načasované textové informácie zodpovedajúce hovorenému alebo písanému obsahu vo videu alebo filme. Zvyčajne obsahuje informácie o tom, kedy by sa jednotlivé titulky mali objaviť a zmiznúť na obrazovke. Existuje veľa formátov titulkov, v tomto tutoriále sa však zameriame na široko používaný formát s názvom SubRip (SRT).

Súbor s titulkami je usporiadaný do série položiek titulkov, z ktorých každá má zvyčajne špecifický formát. Spoločná štruktúra položky titulkov zahŕňa:

  1. Index titulkov: Poradové číslo označujúce poradie titulkov v súbore.

  2. Časové kódy: Značky času začiatku a konca, ktoré určujú, kedy sa má text titulkov zobraziť. Časové kódy sú zvyčajne formátované ako HH:MM:SS,sss (hodiny, minúty, sekundy, milisekundy).

  3. Text titulkov: Skutočný text položky titulkov, ktorý predstavuje hovorený alebo písaný obsah. Tento text sa zobrazí na obrazovke počas určeného časového intervalu.

Napríklad položka titulkov v súbore SRT môže vyzerať takto:

1
00:00:10,500 --> 00:00:15,000
This is an example subtitle.

V tomto príklade je index 1, časové kódy označujú, že titulky by sa mali zobrazovať od 10,5 sekundy do 15 sekúnd a text titulkov je Toto je príklad podnadpisu.

Titulky možno rozdeliť do dvoch základných typov:

  • Mäkké titulky: Známe aj ako skryté titulky, sú uložené externe ako samostatné súbory (napríklad SRT) a možno ich pridať alebo odstrániť nezávisle od videa. Poskytujú divákovi flexibilitu, umožňujú prepínanie, prepínanie jazykov a prispôsobenie nastavení. Ich účinnosť sa však spolieha na podporu prehrávača videa a nie všetky prehrávače univerzálne prispôsobujú mäkké titulky.

  • Tvrdé titulky: Počas úprav alebo kódovania sú natrvalo vložené do snímok videa a zostávajú pevnou súčasťou videa. Aj keď zabezpečujú stálu viditeľnosť, aj na prehrávačoch, ktorým chýba podpora externých súborov s titulkami, úpravy alebo ich vypnutie vyžadujú prekódovanie celého videa, čo obmedzuje kontrolu používateľa

Vytvorenie súboru s titulkami

Vráťte sa do súboru main.py a pridajte nasledujúci kód medzi funkcie transcribe() a run():

def format_time(seconds):

    hours = math.floor(seconds / 3600)
    seconds %= 3600
    minutes = math.floor(seconds / 60)
    seconds %= 60
    milliseconds = round((seconds - math.floor(seconds)) * 1000)
    seconds = math.floor(seconds)
    formatted_time = f"{hours:02d}:{minutes:02d}:{seconds:01d},{milliseconds:03d}"

    return formatted_time

Tu kód definuje funkciu s názvom format_time(), ktorá je zodpovedná za konverziu času začiatku a konca daného segmentu prepisu v sekundách do časového formátu kompatibilného s titulkami, ktorý zobrazuje hodiny, minúty, sekundy a milisekundy (HH:MM:SS,sss).

Kód najprv vypočíta hodiny, minúty, sekundy a milisekundy z daného času v sekundách, podľa toho ich naformátuje a potom vráti naformátovaný čas.

Pridajte nasledujúci kód medzi funkcie format_time() a run():

def generate_subtitle_file(language, segments):

    subtitle_file = f"sub-{input_video_name}.{language}.srt"
    text = ""
    for index, segment in enumerate(segments):
        segment_start = format_time(segment.start)
        segment_end = format_time(segment.end)
        text += f"{str(index+1)} \n"
        text += f"{segment_start} --> {segment_end} \n"
        text += f"{segment.text} \n"
        text += "\n"
        
    f = open(subtitle_file, "w")
    f.write(text)
    f.close()

    return subtitle_file

Pridaný kód definuje funkciu s názvom generate_subtitle_file(), ktorá berie ako parametre jazyk zistený v extrahovanom zvuku a segmentoch prepisu. Táto funkcia je zodpovedná za generovanie súboru titulkov SRT na základe jazyka a segmentov prepisu.

Najprv kód nastaví názov súboru s titulkami na názov vytvorený pripojením sub- a zisteného jazyka k základnému názvu vstupného videa s príponou ".srt" a uloží tento názov do konštanty s názvom subtitle_file. Okrem toho kód definuje premennú s názvom text, do ktorej budete ukladať položky titulkov.

Ďalej kód iteruje prepísané segmenty, formátuje čas začiatku a konca pomocou funkcie format_time(), použije tieto formátované hodnoty spolu s indexom segmentu a textom na vytvorenie položky titulkov a potom pridá prázdny riadok oddeľujúci každú položku titulkov.

Nakoniec kód vytvorí súbor s titulkami v koreňovom adresári projektu s názvom nastaveným skôr, pridá položky titulkov do súboru a vráti názov súboru s titulkami.

Pridajte nasledujúci kód do spodnej časti funkcie run():

def run():

    extracted_audio = extract_audio()
    language, segments = transcribe(audio=extracted_audio)
    subtitle_file = generate_subtitle_file(
    language=language,
    segments=segments
    )

Pridaný kód volá funkciu generate_subtitle_file() so zisteným jazykom a segmentmi prepisu ako argumentmi a uloží súbor s titulkami s názvom vrátený v konštante s názvom subtitle_file.

Vráťte sa do terminálu a vykonajte nasledujúci príkaz na spustenie main.py skriptu:

python3 main.py

Po spustení príkazu vyššie sa súbor s titulkami s názvom sub-input.en.srt uloží do koreňového adresára vášho projektu.

Otvorte súbor s titulkami sub-input.en.srt a mali by ste vidieť niečo podobné:

1
00:00:0,000 --> 00:00:4,000
 This morning I wake up and I look in the mirror

2
00:00:4,000 --> 00:00:8,000
 Every part of my body was in the place many people lie

3
00:00:8,000 --> 00:00:11,000
 I don't wanna act too high and mighty

4
00:00:11,000 --> 00:00:15,000
 Cause tomorrow I may fall down on my face

5
00:00:15,000 --> 00:00:17,000
 Lord I thank You for sunshine

6
00:00:17,000 --> 00:00:19,000
 Thank You for rain

7
00:00:19,000 --> 00:00:20,000
 Thank You for joy

8
00:00:20,000 --> 00:00:22,000
 Thank You for pain
 
9
00:00:22,000 --> 00:00:25,000
 It's a beautiful day

10
00:00:25,000 --> 00:00:28,000
 It's a beautiful day

Pridanie titulkov k videám

Pridajte nasledujúci kód medzi funkciu generate_subtitle_file() a run():

def add_subtitle_to_video(soft_subtitle, subtitle_file,  subtitle_language):

    video_input_stream = ffmpeg.input(input_video)
    subtitle_input_stream = ffmpeg.input(subtitle_file)
    output_video = f"output-{input_video_name}.mp4"
    subtitle_track_title = subtitle_file.replace(".srt", "")

    if soft_subtitle:
        stream = ffmpeg.output(
            video_input_stream, subtitle_input_stream, output_video, **{"c": "copy", "c:s": "mov_text"},
            **{"metadata:s:s:0": f"language={subtitle_language}",
            "metadata:s:s:0": f"title={subtitle_track_title}"}
        )
        ffmpeg.run(stream, overwrite_output=True)

Tu kód definuje funkciu s názvom add_subtitle_to_video(), ktorá berie ako parametre booleovskú hodnotu použitú na určenie, či má pridať mäkký nadpis alebo tvrdý nadpis, názov súboru s titulkami a jazyk zistený v prepise. Táto funkcia je zodpovedná za pridanie mäkkých alebo tvrdých titulkov do kópie vstupného videa.

Po prvé, kód používa metódu ffmpeg.input() so vstupným súborom videa a titulkov na vytvorenie objektov vstupného toku pre vstupné video a súbor titulkov a uloží ich do konštánt s názvami video_input_stream a subtitle_input_stream.

Po vytvorení vstupných tokov kód nastaví názov výstupného video súboru na názov vytvorený pripojením výstupného názvu k základnému názvu vstupného videa s príponou ".mp4" a uloží tento názov do konštanty s názvom output_video. Okrem toho nastaví názov stopy titulkov na názov súboru s titulkami bez prípony .srt a uloží tento názov do konštanty s názvom subtitle_track_title.

Ďalej kód skontroluje, či je booleovský soft_subtitle nastavený na hodnotu True, čo znamená, že by mal pridať mäkký titulok.

Ak je to tak, kód zavolá metódu ffmpeg.output() na vytvorenie objektu výstupného prúdu so vstupnými prúdmi, názvom výstupného video súboru a nasledujúcimi možnosťami výstupného videa:

  • "c": "copy": Určuje, že video kodek a ďalšie parametre videa by sa mali kopírovať priamo zo vstupu na výstup bez opätovného kódovania.

  • "c:s": "mov_text": Špecifikuje, že kodek a parametre titulkov by sa mali tiež kopírovať zo vstupu na výstup bez opätovného kódovania. mov_text je bežný kodek titulkov používaný v súboroch MP4/MOV.

  • "metadata:s:s:0 ": f"language={subtitle_language}": Nastavuje metadáta jazyka pre stream titulkov. Jazyk je nastavený na hodnotu uloženú v subtitle_language

  • "metadata:s:s:0": f"title={subtitle_track_title}": Nastavuje metaúdaje názvu pre stream titulkov. Názov je nastavený na hodnotu uloženú v subtitle_track_title

Nakoniec kód zavolá metódu ffmpeg.run() a odovzdá výstupný stream ako parameter na pridanie mäkkých titulkov do videa a uloženie výstupného video súboru do koreňového adresára vášho projektu.

Pridajte nasledujúci kód do spodnej časti funkcie add_subtitle_to_video():

def add_subtitle_to_video(soft_subtitle, subtitle_file,  subtitle_language):
    ...
    if soft_subtitle:
        ...
    else:
        stream = ffmpeg.output(video_input_stream, output_video,

                               vf=f"subtitles={subtitle_file}")

        ffmpeg.run(stream, overwrite_output=True)

Zvýraznený kód sa spustí, ak je booleovský soft_subtitle nastavený na hodnotu False, čo znamená, že by mal pridať pevný titulok.

Ak je to tak, najprv kód zavolá metódu ffmpeg.output() na vytvorenie objektu výstupného toku so vstupným video streamom, názvom výstupného video súboru a parametrom vf=f"subtitles={subtitle_file}". VF je skratka pre "video filter " a používa sa na použitie filtra na video stream. V tomto prípade je použitým filtrom pridanie titulku.

Nakoniec kód zavolá metódu ffmpeg.run() a odovzdá výstupný stream ako parameter na pridanie pevných titulkov do videa a uloženie výstupného video súboru do koreňového adresára vášho projektu.

Pridajte do funkcie run() nasledujúci zvýraznený kód:

def run():
    extracted_audio = extract_audio()
    language, segments = transcribe(audio=extracted_audio)
    subtitle_file = generate_subtitle_file(
        language=language,
        segments=segments
    )

    add_subtitle_to_video(
        soft_subtitle=True,
        subtitle_file=subtitle_file,
        subtitle_language=language
    )

Zvýraznený kód volá add_subtitle_to_video() s parametrom soft_subtitle nastaveným na hodnotu True, názov súboru s titulkami a jazyk titulkov na pridanie mäkkých titulkov do kópie vstupného videa.

Vráťte sa do terminálu a vykonajte nasledujúci príkaz na spustenie main.py skriptu:

python3 main.py

Po spustení príkazu vyššie sa výstupný video súbor s názvom output-input.mp4 uloží do koreňového adresára vášho projektu.

Otvorte video pomocou preferovaného prehrávača videa, vyberte titulky k videu a všimnite si, že sa titulky nezobrazia, kým ich nevyberiete:

Vráťte sa do main.py file, prejdite na funkciu run() a vo volaní funkcie add_subtitle_to_video() nastavte parameter soft_subtitle na False:

def run():
    …
    add_subtitle_to_video(
        soft_subtitle=False,
        subtitle_file=subtitle_file,
        subtitle_language=language
    )

Tu nastavíte parameter soft_subtitle na hodnotu False, aby ste do videa pridali tvrdé titulky.

Vráťte sa do terminálu a vykonajte nasledujúci príkaz na spustenie main.py skriptu:

python3 main.py

Po spustení príkazu nad ním sa prepíše output-input.mp4 video súbor umiestnený v koreňovom adresári vášho projektu.

Otvorte video pomocou preferovaného prehrávača videa, skúste vybrať titulky k videu a všimnite si, že nie sú k dispozícii, ale zobrazujú sa titulky:

V tejto časti ste pochopili štruktúru súboru titulkov SRT a na jeho vytvorenie ste použili segmenty prepisu z predchádzajúcej časti. Následne bola knižnica ffmpeg-python použitá na pridanie vygenerovaného súboru titulkov do videa.

Záver

V tomto kurze ste použili knižnice ffmpeg-python a rýchlejšie šepotné knižnice Python na vytvorenie aplikácie schopnej extrahovať zvuk zo vstupného videa, prepísať extrahovaný zvuk, vygenerovať súbor s titulkami na základe prepisu a pridať titulky do kópie vstupného videa.

Súvisiace články: