Simas Razinskas

Kadrų tikslumo vaizdo įrašų lokalizavimas

DI įgarsinto vaizdo sinchronizavimas per ilgą trukmę: lygiavimas, balso klonavimas, laiko pritaikymas ir miksavimas, kad vertimas pataikytų į kadrą.

Paskelbta 2026-06-30Peržiūrėta 2026-07-02

Trumpai

Problema
Išversta kalba retai trunka tiek pat kiek originalas, todėl naivus DI įgarsinimas per kelias minutes nutolsta nuo vaizdo.
Apribojimas
Lokalizuotas garsas turėjo išlaikyti originalų laiką, foninį takelį, kalbėtojo tapatybę ir natūralumą be rankinio kadrų redagavimo.
Sukurta sistema
Medijos konvejeris, jungiantis priverstinį lygiavimą, diarizaciją, balso klonavimą, šaltinių atskyrimą, laiko tempimą ir FFmpeg kompoziciją.
Rezultatas
Ilgi klipai lieka pririšti prie šaltinio laiko žymų, o originalus nevokalinis garsas išlieka po sintezuotu įgarsinimu.
Kur tai pritaikoma
Aktualu DI medijos srautams, kuriuose modelio išvestis turi turėti deterministinį laiką, taisomus žingsnius ir gamybinį apdorojimą.
Technologijos
WhisperX · XTTS voice cloning · Demucs · FFmpeg · CTranslate2

Kodėl tai svarbu

Jei jūsų komanda planuoja sistemą su tais pačiais gedimo scenarijais — būtent nuo tokio mąstymo prasideda pirmas pokalbis.

Apžvalga

Apribojimas — visa užduotis: lokalizuotas takelis turi išlaikyti originalų laiką, originalų foninį takelį, originalaus kalbėtojo tapatybę ir natūralų skambesį — ir viską iš karto, niekam ranka nepajudinus nė vieno pjūvio taško. Ilgos trukmės vaizdas šiuo atžvilgiu negailestingas. Kelių šimtų milisekundžių nuokrypis vienoje eilutėje dešimties sekundžių klipe — nedidelis, lengvai nepastebimas trukdys; tas pats nuokrypis, susikaupęs per kelių minučių klipą, tampa takeliu, kuris pirma girdimai, o vėliau ir matomai atsilieka nuo vaizdo. Nei vertimo modelis, nei balso klonavimo modelis, nei kalbos sintezės modelis savaime negerbia šaltinio laiko žymų — kiekvienas jų apmokytas sukurti natūraliai skambantį ištarimą pagal savo paties logiką, o ne tokį, kuris tilptų į kažkieno kito jau apibrėžtą tarpsnį. Viskas, kas aprašyta toliau, egzistuoja tam, kad šis apribojimas būtų primestas modeliams, kurie jo iš prigimties neturi.

Diarizacija ir priverstinis sulygiavimas

Prieš pradedant versti ar sintetinti, šaltinio garsas transkribuojamas su WhisperX, kuris sujungia greitą, CTranslate2 pagreitintą Whisper modelį žaliai transkripcijai su priverstinio sulygiavimo etapu, iš naujo sulyginančiu kiekvieną žodį su garsu naudojant fonemų lygmens akustinį modelį, o ne pasikliaujant paties Whisper segmentų ribomis. Natūralios Whisper laiko žymos — autoregresinio dekodavimo šalutinis produktas, ir jos garsiai žinomos kaip netikslios: nuokrypis siekia šimtus milisekundžių, kartais ir daugiau, ypač ties sakinių ribomis. Priverstinis sulygiavimas tai ištaiso, tiesiogiai palygindamas garsą su žinomu transkripcijos tekstu fonema po fonemos ir nurodydamas tikrąją kiekvieno žodžio pradžią ir pabaigą. Kartu vykdoma diarizacija — kalbėtojų embedingų klasterizavimas per visą takelį, todėl kiekvienas sulygiuotas segmentas gauna ir kalbėtojo žymą; tai būtina, kai vaizde daugiau nei vienas balsas, nes segmentui su klaidinga kalbėtojo žyma keliais žingsniais vėliau bus klonuojamas ne tas balsas.

Šio etapo išvestis — ne garsas, o paprastas, patikrinamas sąrašas: kalbėtojas, pradžios laikas, pabaigos laikas ir tekstas, po eilutę kiekvienai frazei. Kiekvienas vėlesnis konvejerio etapas skaito ir rašo pagal šias laiko žymas, ir niekas žemiau jų iš naujo neišgalvoja — laiko griaučiai nusprendžiami vieną kartą, čia, ir daugiau nebekvestionuojami.

Kodėl neversti ir nesintetinti be kadro lygmens sulygiavimo

Naivi šio konvejerio versija visko šito atsisako: išverčia transkripciją, sintezuoja visą vertimą vienu ėjimu ir arba ištempia gautą vientisą klipą iki originalo bendros trukmės, arba tiesiog paleidžia jį nuosekliai, pjūvis po pjūvio. Tai sugriūva beveik iškart, nes sakinio trukmė tarp kalbų neišverčiama nuosekliai. Frazė tiksline kalba paprastai trunka trumpiau ar ilgiau nei jos atitikmuo šaltinio kalboje, ir skirtumas kiekvienoje eilutėje nenuspėjamas — jį lemia sintaksė ir žodžių pasirinkimas, o ne kažkas, ką iš anksto pasakytų šaltinio klipo bendra trukmė. Sujungiant vis kitokio ilgio segmentus, antra scenos eilutė jau atsilieka per taktą, penkta atsilieka pastebimai, o antroje ar trečioje minutėje žiūrovas girdi dialogą kadrui, kuris jau pasibaigęs. Prisirišus tik prie pradžios ir bendros trukmės, trumpas klipas gali atsitiktinai atrodyti tvarkingas, nors kiekvienas vidinis pjūvis vis tiek klaidingas — būtent todėl „kadrų tikslumas“ reiškia tikslą, išlaikomą ištisai, ties kiekviena segmento riba, o ne tik abiejuose klipo galuose. Priverstinis sulygiavimas čia svarbus todėl, kad jis konvejeriui duoda tikrą, žinomą tikslinę kiekvieno segmento pabaigos laiko žymą, į kurią sintezuoti, o ne judantį įvertį, kurio paklaidos tik tikimasi, kad kažkaip susividurkins.

Neuroninis balso klonavimas

Kai segmento kalbėtojas, laikas ir atskirai išverstas tekstas jau žinomi, XTTS sintezuoja šią eilutę tiksline kalba paties šaltinio kalbėtojo balsu, o ne vienu bendriniu diktoriaus balsu. XTTS klonuoja balsą iš trumpo pavyzdinio garso įrašo, o ne reikalauja atskirai apmokyto kiekvieno kalbėtojo modelio, todėl kiekvienam segmentui naudojamas pavyzdys — švarus to paties kalbėtojo fragmentas, paimtas iš kitos šaltinio takelio vietos; tai įmanoma tik dėl diarizacijos, nes būtent ji leidžia konvejeriui žinoti, kuris ankstesnis segmentas priklauso kuriam iš galimai kelių vaizde kalbančių žmonių. Du žmonės, kalbantys toje pačioje scenoje, iš šio etapo išeina kaip du skirtingi klonuoti balsai, o ne kaip vienas įgarsinimo aktorius, skaitantis abu vaidmenis.

Balso tapatybė ir laikas šiame etape sąmoningai laikomi atskirais dalykais. XTTS sintezuoja kiekvieną eilutę tokios trukmės, kuri natūrali tai frazei tiksline kalba — modelis neturi jokio supratimo apie tarpsnį, kurį jam reikės užpildyti, o priverstas jį žinoti prarastų natūralumą, kovodamas dėl tempo. Rezultatas laikomas laikinu (provizoriniu) garsu: teisingas balsu, teisingas žodžiais ir dar neteisingas ilgiu. Pritaikyti jį tarpsniui — atskiras, vėlesnis žingsnis, ir taip sumanyta iš anksto.

Šaltinio atskyrimas

Dar prieš sintezę, originalus mikšas praleidžiamas per Demucs, kuris jį padalija į izoliuotą vokalo takelį ir instrumentinį takelį — muziką, aplinkos garsą, garso efektus, viską, kas nėra dialogas. Tai turi įvykti prieš, o ne po įgarsinimo sudėjimo, nes visa esmė ta, kad įgarsinimas pakeičia tik vokalo takelį; instrumentinis takelis nepakitęs pereina tiesiai į galutinį mišinį, o konvejeris niekada iš naujo nesintetina ir neaproksimuoja originalios muzikos, patalpos garso ar garso apipavidalinimo. Kurti juos iš naujo ar bandyti priartėti prie jų — tai ir nereikalingas darbas, ir garantuotas kokybės praradimas, palyginti su tiesiog originalių baitų išsaugojimu.

Šaltinio atskyrimas tankiame mikše iš tikrųjų sudėtingas, ir Demucs jo nedaro tobulai — tai matysis vėliau, kompromisų skyriuje. Bet vykdant jį anksti, kaip izoliuotą, vienos paskirties žingsnį, bet kokia šio etapo netobulybė lieka apribota jo sukuriamame instrumentinio takelio faile: patikrinama ir pataisoma atskirai, o ne išsiliejusi per visos scenos monolitinį atkūrimą iš naujo.

Laiko tempimas, kad tilptų į originalų tarpsnį

Priverstinis sulygiavimas nustatė, kur kiekvienas segmentas priklauso; balso klonavimas nustatė, kaip jis turėtų skambėti. Nė vienas iš jų neišsprendžia, kiek laiko sintezuotas klipas trunka, o natūrali XTTS išvestis beveik niekada tiksliai neatitinka tarpsnio pločio. Šis etapas užpildo šį paskutinį tarpą: kiekvienas sintezuotas segmentas ištempiamas laike — suspaudžiamas arba pratęsiamas — kad tiksliai užpildytų savo sulygiuotą pradžios–pabaigos langą, nekeičiant tono, nes tono pasikeitęs klonas nustoja skambėti kaip klonuotas kalbėtojas.

# sintezuotas segmentas truko 2.77s; jo sulygiuotas tarpsnis — 2.35s
# tempimo koeficientas = sintezuota_trukmė / tikslinė_trukmė = 1.18
ffmpeg -i segment_042.wav -filter:a "atempo=1.18" segment_042_fit.wav

Vieno sintezuoto segmento pritaikymas jo sulygiuotam tarpsniui

FFmpeg atempo filtras vienu praėjimu priima tik ribotą tempimo koeficientą, todėl segmentui, kuriam reikia kraštutinesnio santykio, tai pasiekiama grandinėje sujungiant kelis atempo etapus, o ne vienu ribas peržengiančiu iškvietimu; pats filtras naudoja laiko srities algoritmą, sukurtą išlaikyti toną ir tembrą, o ne naivų perdiskretizavimą, kuris tono aukštį pakeistų kartu su greičiu. Rezultatas — klipas, tiksliai tokios trukmės, kokios reikia jo tarpsniui, tinkamu balsu, sakantis tinkamus žodžius — trys savybės, kurios pačios savaime retai atsiranda kartu be šio etapo, suderinančio jas tarpusavyje.

Kompozicija nuo pradžios iki galo

Kiekvienas ankstesnis etapas sukuria paprastą, patikrinamą artefaktą, o ne neskaidrų tarpinį tensorių: sulygiuotų segmentų sąrašą, klonuotų ir ištemptų balso įrašų rinkinį, izoliuotą instrumentinį takelį. Kompozicijos etape jie vėl sujungiami į vieną visumą.

source.mp4
  -> demucs      vocal.wav, instrumental.wav
  -> whisperx    sulygiuoti segmentai (kalbėtojas, pradžia, pabaiga, tekstas)
  -> vertimas    tikslinės kalbos tekstas kiekvienam segmentui
  -> xtts        klonuota kalba kiekvienam segmentui (laikina trukmė)
  -> tempimas    kalba pritaikyta sulygiuotam tarpsniui
  -> ffmpeg      ištempti segmentai + instrumental.wav -> galutinis mišinys -> sujungiama su šaltinio vaizdu

Konvejeris nuo pradžios iki galo

Kiekvienas laike ištemptas segmentas dedamas lygiai į tą laiko žymą, kurią jam priskyrė priverstinis sulygiavimas, sumiksuojamas su nepaliestu instrumentiniu takeliu, o rezultatas sujungiamas su originaliu vaizdo srautu — pats vaizdas niekada neliečiamas. Čia svarbiausia tai, kad trys pagrindiniai mechanizmai taiso tris skirtingas, nepriklausomas klaidų rūšis, o ne kad vienas mechanizmas bando atlikti visų kitų darbą: sulygiavimas nustato, kur eilutė atsiduria, laiko tempimas — kiek ji ten trunka, o šaltinio atskyrimas išlaiko viską, kas nėra įgarsintas balsas, nepaliestą ir švarų. Nė vienas iš trijų neužglaisto kito klaidos; kiekvienas apibrėžtas pakankamai siaurai, kad būtų atskirai teisingas, atskirai patikrinamas ir atskirai pataisomas, jei vienas segmentas išeina blogai, nereikalaujant iš naujo vykdyti ar iš naujo pasitikėti kitais dviem. Būtent todėl kelių minučių klipas išlaiko sinchroniją per visą savo trukmę, o ne nuslysta taip, kaip nuslystų naivus sujungimas — kompozicijos žingsniui niekas neprašo kompensuoti nuokrypio, nes joks ankstesnis žingsnis jo ir neįveda.

Kompromisai ir apribojimai

  • Laiko tempimas turi girdimas ribas. Neįprastai gausus, palyginti su šaltinio eilute, vertimas vis tiek įtempia tarpsnį iki ribos, ir peržengus tam tikrą santykį, tempas ima skambėti nenatūraliai gerokai anksčiau, nei tai išduoda bet koks tono artefaktas.
  • Balso klonavimo kokybė ribojama pavyzdinio garso įrašo. Triukšmingas, stipriai suspaustas ar persidengiantis šaltinio fragmentas duoda XTTS mažesnės kokybės pavyzdį, ir klonuotas balsas nutolsta nuo originalaus kalbėtojo labiau, nei nutoltų nuo švaraus pavyzdžio.
  • Šaltinio atskyrimas nėra tobulas. Demucs tankiuose mikšuose gali palikti girdimą prasiskverbimą ar artefaktų instrumentiniame takelyje — sunkiausias atvejis yra muzika po intensyviu dialogu — ir bet kokia netobulybė, išlikusi po šio žingsnio, patenka tiesiai į galutinį mišinį.
  • Diarizacijos klaidos persidengiančių ar greitai kintančių kalbėtojų atvejais persiduoda toliau. Klaidingai priskirtam segmentui klonuojamas ne tas balsas, ir joks vėlesnis žingsnis nėra pajėgus to pastebėti ar ištaisyti savarankiškai.
  • Konvejeris optimizuoja laiką, tapatybę ir švarą, o ne paties vertimo kokybę. Nevykęs ar netikslus vertimas ištempiamas pagal grafiką lygiai taip pat sąžiningai, kaip ir geras; niekas čia nevertina, ar žodžiai iš tikrųjų tinkami.

Šaltiniai ir tolesnis skaitymas

Susijusios atvejų analizės

Sistemos, kurias su šia sieja bendras apribojimas — pakartojimai, izoliacija, kaina, atkūrimas.

Technologijos: WhisperX · XTTS voice cloning · Demucs · FFmpeg · CTranslate2← Visos atvejų analizės

Turite sistemą, kuri privalo veikti?

Rezervuokite pokalbį — susidėliosime, ką ji turi daryti, kur ji lūš ir kokią mažiausią versiją verta kurti pirmiausia.