Seiteninhalt Home / Know-How / KI-Video-Upscaling + Audio-Syncronisation

KI-Video-Upscaling + Audio-Syncronisation

Was macht man, wenn eine vor ca. 25 Jahren sehr gern gesehene Zeichentrickserie heute weder gesendet, noch gestreamt wird und auch nicht auf DVD oder anderen Medien offiziell verfügbar ist? Man wird kreativ und anschließend fleißig. So ging es jedenfalls mir auf der Suche nach einer Zeichentrickserie aus Frankreich aus dem Jahr 1999, die im Jahr 2001 in Deutschland im Fernsehen lief und die ich damals mit Begeisterung sah. Die Serie hatte nur eine Staffel mit 26 Folgen und wurde seitdem nie fortgesetzt. Ausstrahlungen gab es 2001 und 2004 noch auf Toonami mit englischer Synchronisation. Die einzig offiziell herausgegebene DVD enthält lediglich die ersten 4 Folgen nur mit französischem Originalton. Die DVD konnte ich noch (gebraucht) erwerben und die restlichen Folgen findet man im "Internet Archive" (von einem Fan "irgendwie" aufgenommen von Toonami, mit englischer Synchronisation) sowie auf Youtube mit sämtlichen Folgen in angeblichen "Full HD" (was nie existierte) und dort wieder nur mit französischem Originalton.

Ursprünglich sind alle 26 Folgen im Format 4:3 und in üblicher PAL-SD-Auflösung 720x576 bzw. 720x540. Mir liegen nun die ersten 4 Folgen so "original" von DVD und mit französischem Ton vor, wobei das Videobild ziemlich "roh" daherkommt, oben, unten, rechts, links nicht sehr gut beschnitten. Die Toonami-Version hat eine Auflösung von 640x480 im Format 4:3 und einen englischen Ton (und das auch noch in 2x Stereo...), wurde aber in der Länge am Anfang und Ende beschnitten und (vermutlich) auch zumindest ein Werbeblock entfernt. Die Youtube-Version gibt es im Format 16:9 in unterschiedlichen Auflösungen, die vom Original skaliert sind und ich wählte daraus 1280x720 aus, weil dies am nächsten am Original erschien. Das Format 16:9 wurde erzeugt, indem links und rechts anstatt der schwarzen Balken das Video skaliert und weichgezeichnet ist. Ansonsten wurde es aber im Format 4:3 belassen, auch wenn das Videobild oben und unten minimal beschnitten wurde.

Mein Wunsch war es nun, eine deutlich bessere Videoqualität zu erreichen, dazu eine englische Tonspur und auch optional die französische Tonspur, zum Umschalten. Ich möchte kein Problem mit Urheberrechten, sodass ich hier bewusst keine Titel, Namen oder anderes zur Zeichentrickserie nennen will. Es sei nur soviel gesagt, dass leider einige wesentliche Personen, die damals die Idee zur Serie entwickelten, aus Altersgründen und wegen Krankheit in den letzten Jahren verstarben. Andere leben noch, aber offenbar haben die aktuellen Rechteinhaber kein Interesse am Wiederaufleben der Serie, oder an einer Wiederholung.

Nach längeren Recherchen wählte ich folgende Software:

  • ffmpeg, Version 7.1, als Basissoftware für jegliche Video- und Audiokonvertierungen
  • Video2x, Version 6.4.0, als Video-Upscaler mit KI-Modellen, speziell für Zeichentrick (Anime)
  • Audacity, Version 3.7.3, zur Synchronisation der englischen Tonspur auf Basis der französischen Tonspur vom Youtube-Video
  • Avidemux, Version 2.8.2, zum framegenauen Schneiden von Bild und Ton sowie zur exakten Analyse der Bildgrößen

Bis auf Audacity sowie Avidemux, was beides unter Windows 11 24H2 verwendet wurde, lief das Ganze auf der Kommandozeile eine Linux-PC unter Debian Bookworm, der (nur) für das Video-Upscaling eine relativ günstige Grafikkarte AMD Radeon RX6600 eingebaut hat. Natürlich wäre eine Grafikkarte von Nvidia für diese Zwecke sehr viel besser geeignet. Aber Grafikkarten mit Nvidia-GPUs waren einfach deutlich teurer. Außerdem ist die Treiberunterstützung unter Linux für AMD-GPUs besser. Erfreulich ist auch, dass Video2x auch AMD-GPUs zum Rechnen verwendet und die Vulkan-Treiber dafür verwendet. Das ist bei Upscaling-Software nicht selbstverständlich. Häufig wird hier AMD nicht unterstützt und stattdessen muss die CPU rechnen, was ganz erheblich länger dauert.

Aivdemux verwendete ich deswegen, weil ich erkennen musste, dass der Videoplayer VLC zwar im Alltag prima ist, aber doch recht ungenau das Bildformat ausgibt.

ffmpeg wurde aus den Quellen frisch kompiliert, wofür es eine prima Anleitung gibt. Mit ffmpeg führte ich folgende Schritte durch:

  1. Schneiden des Videos nach den bestimmten Timecodes aus Avidemux
  2. Scharfzeichnen des Videobildes
  3. "Delogo", d.h. Weichzeichnen eines störenden Logos aus den Youtube-Videoquellen
  4. Beschneiden des Videobildes links und rechts, um die weichgezeichneten farbigen "Balken" zu entfernen
  5. (Nur) bei den DVD-Quellen nur die Breite (X-Richtung) um plus 50 Pixel erhöhen bzw. skalieren (weil das DVD-Bild leider entsprechend zu schmal ist, wie ich erkennen musste...)
  6. Neuhinzufügen von schwarzen Balken links und rechts sowie oben und unten, um das Format auf exakt 4:3 zu ändern, und Einschreiben der Metainformation "-aspect 4:3" in den Videostream
  7. Skalieren des Videobilds auf 720x540 als Ausgangspunkt für das Upscaling
  8. Kodieren des Videos mit dem Codec x265, zuerst in höchstmöglicher Qualität als Ausgangspunkt für das Upscaling mit Video2x bzw. Anime4K
  9. Kodieren des Videos mit dem Codec x265, dann in immer noch hoher Qualität, ohne Tonspur, als Ergebnis des Upscaling mit Video2x bzw. Anime4K
  10. Konvertieren der aus Audacity erstellten verlustlos in FLAC abgespeicherten Tonspuren als (verlustbehaftetes) AAC (44.1 kHz, 320 kbit/s), für bessere Kompatibilität beim späteren Abspielen der Serie
  11. Kombinieren der synchron erstellten Tonspuren Englisch und Französisch mit dem neuen Video-Bild als MKV-Container in "Netto-Länge" der jeweiligen Folge, ohne Vorspann/Intro und Abspann/Outro
  12. Kombinieren der jeweiligen Folge mit den einmalig bearbeiteten MKV-Containern für Vorspann/Intro und Abspann/Outro zur "Brutto-Länge" der jeweiligen Folge als MKV-Container (Durchschnittsdateigröße ca. 435 MB bei einer Brutto-Länge je Folge von 22:30 min.)
  13. Einschreiben von Metainformationen zu den Tonspuren und zum Videobild

Beispielhaft sieht das dann so aus:

Schritte 1 bis 8 in einer einzigen Kommandozeile:
./ffmpeg -i "input.mp4" -c:v libx265 -ss 00:01:09.360 -to 00:23:09.320 -vf "cas=strength=0.9,delogo=x=108:y=556:w=142:h=104,crop=iw-330:ih:164:0,pad=iw+26:ih+12:13:2:color=black,scale=720:-2:flags=lanczos" -aspect 4:3 -preset slow -tune animation -x265-params "aq-mode=3:no-strong-intra-smoothing=1" -crf 3.0 -c:a copy "output01-netto.mp4"

Schritt 1 ist dabei der Parameter "-ss 00:01:09.360 -to 00:23:09.320" mit den Timecodes für Start und Ende der herauszuschneidenden Passage. Weiteres siehe bitte das Manual von ffmpeg dazu.
Schritt 2 bis 7 stecken in dem Parameter "-vf "cas=strength=0.9,delogo=x=108:y=556:w=142:h=104,crop=iw-330:ih:164:0,pad=iw+26:ih+12:13:2:color=black,scale=720:-2:flags=lanczos"" sowie in "-aspect 4:3" darauf folgend. "-vf" steht dabei für die Filterfunktion von ffmpeg und führt in der angegebenen Reihenfolge die Funktionen aus. "cas=strength=0.9" steht für Contrast Adaptive Sharpening in der Stärke 0.9 (Schärfen vor einem Downscaling ist immer eine gute Idee). "delogo=x=108:y=556:w=142:h=104" definiert die obere linke Ecke des zu entfernenden Logos und dessen Größe. "crop=iw-330:ih:164:0"Steht für das Beschneiden, hie lediglich in X-Richtung mit Gesamtschnittbreite (330) und Startpunkt bei 164. "pad=iw+26:ih+12:13:2:color=black" steht für das folgende Ergänzen von schwarzen Balken nach demselben Schema, mit Angabe der Farbe. Zum Schluss noch "scale=720:-2:flags=lanczos" für das Skalieren auf 720 Pixel Breite und die entsprechende Höhe mit gerader Pixelanzahl, falls gerundet werden muss (hier 540), "lanczos" steht dabei für die Skalierungsmethode für bestmögliche Qualität.
Schritt 8 ist der Rest der Zeile mit diversen Optimierungen des x265-Codecs ("-preset slow -tune animation -x265-params "aq-mode=3:no-strong-intra-smoothing=1""), speziell für Zeichentrick. "-crf 3.0" ist die zu codierende Qualitätstufe und ist hier absurd niedrig gesetzt, um auf dieser Zwischenstufe wenig Verlust zu haben. "-c:a copy" lässt die Audiodaten unprozessiert und kodiert die Audiodaten einfach mit in die Ergebnisdatei ein.

Schritt 9:
docker run --device=/dev/dri:/dev/dri -v [arbeitsverzeichnis-außen:arbeitsverzeichnis-innen] -v [ffmpegverzeichnis-außen:ffmpegverzeichnis-innen] -it ghcr.io/k4yt3x/video2x:6.4.0 -i "output01-netto.mp4" -o "output02-netto.mp4" -c libx265 --no-copy-streams -w 1440 -h 1080 -p libplacebo --libplacebo-shader anime4k-v4-a+a -e x265-params=preset=slow -e x265-params=tune=animation -e x265-params="lookahead-slices=4:rc-lookahead=25:ref=4:me=star:subme=3:rect=1:aq-mode=3:aq-strength=0.4:psy-rd=0.4:bframes=4:no-strong-intra-smoothing=1:crf=17.0"

Schritt 10 (beispielhaft):
./ffmpeg -i "input_eng.flac" -c:a libfdk_aac -b:a 320k -ar 44100 "output_eng.m4a"

Schritt 11:
./ffmpeg -i "output02-netto.mp4" -i "output_eng.m4a" -i "output_fra.m4a" -map 0:v -map 1:a -map 2:a -metadata:s:a:0 language=eng -metadata:s:a:0 title="English" -metadata:s:a:1 language=fra -metadata:s:a:1 title="French" -c copy output03-netto.mkv

Schritt 12:
./ffmpeg -f concat -safe 0 -i "concat.txt" -c copy output03-brutto.mkv

Schritt 11+13:
./ffmpeg -i "output03-brutto.mkv" -i "output_fra-brutto.m4a" -map 0 -map 1:a -metadata:s:a:0 language=eng -metadata:s:a:0 title="English" -metadata:s:a:1 language=fra -metadata:s:a:1 title="French" -disposition:a:0 default -disposition:a:1 0 -metadata title="Titel der jeweiligen Folge" -metadata artist="Studio oder Autor" -metadata date="1999" -metadata comments="Kommentar" -c copy output04-brutto.mkv

 

Video2x betrieb ich in einem Docker-Container, weil das Docker-Image fertig verfügbar ist. Video2x verfügt über mehrere KI-Modelle (Real-ESRGAN, Real-CUGAN, Anime4K, RIFE), von denen nach zahlreichen und sehr zeitintensiven Tests dann Anime4K in der Variante "a+a" ausgewählt wurde. Damit wurde nach diversen Vorbereitungen ein Videobild im Format 4:3 mit einer Auflösung von 1440x1080 erzeugt. Die Bildqualität ist aus meiner Sicht insbesondere auf einem modernen Fernseher atemberaubend gut und hat nichts mehr mit der oben erwähnten Qualität der DVD oder den anderen Quellen zu tun. Dazu ist dann die englische Tonspur synchron!

Jede Folge weist einen Vorspann und einen Abspann auf. In jeder Folge gibt es zudem zuerst einen kurzen Rückblick ("was bisher geschah") und auch noch einen kurzen Ausblick ("in der nächsten Folge"). Diese Rückblicke und Ausblicke habe ich entsprechend entfernt, da diese auch in der englischen Tonspur fehlten.

In Audacity führte ich folgende Schritte durch:

  1. Bringen der Tonspuren auf einheitliches und ausreichendes Lautstärke-Niveau mittels Loudness Normalization (RMS)
  2. Synchronisieren der englischen Tonspur auf Basis der französischen Tonspur
  3. Abspeichern in einheitlichem Format FLAC (verlustlos, 48 kHz, 24 Bit), als Netto-Länge und auch als Brutto-Länge (siehe oben) (Konvertieren in AAC dann mit ffmpeg, was sehr viel schneller als aus Audacity heraus funktioniert)

Die Arbeiten in Audacity, die im Vergleich zu den vorgenannten Schritten bzgl. Videobild zwar weniger anmuten, aber erheblich zeitaufwendiger waren, weil insbesondere das Synchronisieren als reine Handarbeit erfolgte und erfolgen musste Pro Folge waren das ca. 30 bis 45 min. Aufwand, weil der englische Ton durch irgendwelche Gründe im Laufe einer Folge leicht hinterher hinkt, sowie einen Versatz ungefähr in der Mitte jeder Folge nach einem Szenenwechsel, vermutlich durch das Herausnehmen einer Werbepause beim Aufnehmen.

Das Videobild konnte dagegen halbautomatisch als Shell-Skript mit einigen Parametern erfolgen und zeitlich auch etwas parallel zum Arbeiten in Audacity erledigt werden. Das Vorbereiten des Videos für das Upscaling und das Upscaling selbst, inkl. nachfolgendem Zusammenbauen dauerte pro Folge in etwa 45 min.