Eines Abends kam mir die Idee: "Hey, wenn heutzutage Machine Learning so zugänglich wie noch nie ist und ich auch passende Rechenpower dazu habe, warum nicht einfach mal selbst was ausprobieren?"
Direkt im Anschluss kam der Plan: "Es hat noch keiner einen Audio Restorer gebastelt? Dann mach ich den selbst!"
Konkret war es mein Ziel, aus einem Free-Streaming-Abo-üblichen 16bit 128kbp/s .mp3 ein vollwertiges 24 bit 176Khz HiRes .flac zu generieren - oder besser gesagt wiederherstellen/hochskalieren. Und das natürlich nicht, indem ich einfach das Format umwandle, sondern es sollen tatsächlich bestmöglich verlorene Daten wiederhergestellt werden. Warum nicht 196 Khz? Dazu weiter unten mehr.
Dazu habe ich die Heilige Dreieinigkeit des Machine Learnings eingesetzt: Python, Tensorflow und Keras.
-------------------------------------------------------------------------
Für alle, die noch nie von Machine Learning gehört haben, das geht ganz grob so:
- 1. Man definiert ein Netzwerk aus Eingang, versteckten Schichten und Ausgang. Ähnlich wie beim Gehirn, wo auch Synapsen miteinander in mehreren Schichten verknüpft sind, sind in den versteckten Schichten - den Hidden Layer - mehrere Schichten an Neuronen komplett miteinander verbunden.
2. Man zeigt diesem Netzwerk nun die Eingangsdaten - ein Bild, ein Stück Audio, einen Text, etc. - und die Zieldaten - also das, was das Netzwerk aus den Eingangsdaten machen soll.
3. In unzähligen Berechnungen passt das Netzwerk nun während des "Trainings" die Stärke der Verbindungen - die Gewichte - zwischen den Neuronen an. Das können oft mehrere Millionen sein. Dabei wird bei jedem Durchgang der Abstand zwischen dem Ausgang des Netzwerks und den Zieldaten verglichen und anhand dieser "Fehlerquote" das Netzwerk neu eingestellt.
4. Das ganze geht so lange, bis keine Verbesserung mehr möglich ist und das Netzwerk trainiert ist, um die Eingangsdaten wie gewünscht zu verarbeiten.
Das und nichts anderes ist Machine Learning, blos halt mit tausenden Parametern pro Sekunde.Stell dir vor, du bist DJ, und weißt nicht, ob dem Publikum die Musik zu laut ist oder zu leise ist. Deine Rückmeldung sind die Anzahl der Leute. Wenn die Leute weggehen, drehe die Lautstärke lauter oder leiser. Wenn du leiser drehst und die Leute wiederkommen, drehst du etwas weiter und schaust, ob nicht vielleicht noch mehr Leute auf die Tanzfläche kommen könnten. Wenn stattdessen die Leute gehen, drehst du wieder lauter, und guckst, ob sie wiederkommen. Das ganze macht man so lange, bis man den Sweet Spot gefunden hat.
-------------------------------------------------------------------------
So, nun zu meinem Projekt. Nach mehreren Experimenten mit verschiedenen Netzwerk-Architekturen, habe ich mit einem CNN - einem Convolutional Neural Network - die besten Ergebnisse erzielt. Diese Art von Netzwerk schaut sich nicht nur die blanken Daten an, sondern versucht Muster in diesen Daten zu finden.
Die Ergebnisse sind eigentlich ziemlich gut. Es kann natürlich unmöglich jedes Detail wiederhergestellt werden.
Die orangene Linie sind meine Originaldaten. Ich hab hier weißes Rauschen generiert - ungefiltert, und theoretisch maximale Frequenz von ca. 88200 Hz - und als Zieldaten verwendet. Dieselben Daten habe ich dann mittels LAME MP3 Encoder auf 128 kbp/s 16 bit herunterkodiert und als Eingangsdaten verwendet.
Wie gesagt, es ist nicht perfekt und ich bezweifle auch, dass man da ohne massive deep dives und mathematische Tricks noch viel rausholen kann. Ich habe auch mit einem GAN herumgespielt, aber noch keine guten Ergebnisse erreicht. Ich melde mich, wenn ich in dieser Richtung fortschritte mache. GAN ist diese gruselige Trainingsmethode, die Deep Fakes erst ermöglicht hat...
Ein Problem ist auch, dass Audio fortlaufende Daten sind. Das CNN, was ich angewendet habe, ist eigentlich auf separate Datenblöcke wie Bilder ausgelegt. Dadurch entsteht das Problem, dass jedes Stück Audiodaten, was verarbeitet wird, nicht mehr "weiß", wo es wieder beim nächsten Stück ansetzen muss. Das führt unweigerlich zu knacken und ploppen, da die Datenlinie immer einen Knick hat. Ich versuche das demnächst zu lösen, indem ich diesen Knick mathematisch Glattbügele, aber es ist relativ fummelig zu implementieren.
Die Lösung für diese Problem wäre es, ein Netzwerk nicht nur mit Audioschnipseln zu füttern, sondern mit der kompletten Datei. Nur würden damit 99,9% aller Computer dieser Welt noch massiv überfordert sein, weil ein lomplexes Netzwerk dann gerne mehrere 1000 GB GPU-Speicher haben wollen würde.
Ich tobe mich weiter in der Richtung aus. Wo ein Wille ist, ist ein Weg!
Bei Interesse kann ich gerne meinen Code hochladen und auch einige Testdateien präsentieren. Nur ist das natürlich mit dem Urheberrecht bei Musikdateien immer so eine Sache.
Edit: Ich habe nun meine Experimentierumgebung aus dem Jupyter Notebook hochgeladen. Feedback willkommen. Ich habe das meiste kommentiert und sollte verständlich zu lesen sein.
Edit 2: Da Nubert leider sehr restriktiv mit Dateien ist (nicht einmal ein .zip geht?!), hier der Link zu meiner privaten Cloud. Unbedingt die .HTML Datei downloaden, da die Online-Vorschau auf meiner Cloud es nicht richtig darstellt.
https://anphex.one/index.php/s/dq6reCdC8wZqZ9p