Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ss20:song-generator

← Zurück zur Projektauswahl

Song-Generator (Charts Garantie) [SS20]


Projektteilnehmende: Daria, Lennart, Joshua & Niklas

Idee:

Wir wollen ein neuronales Netzwerk trainieren (Stil ist noch offen. zB. Klassik, Techno, Hip-Hop Beats, Lofi, oder bestimmten Künstlern) was aus verschieden Quellen einen Song/Beat generieren kann ggf. mit Songtext.

Projektplanung:

Ziele: Mit bestimmten Style ein Lied zu generieren ggf. mit Stimme

Zwischenziele: Sounds generieren

Neuronale Netze:

Ein neuronales Netz arbeitet anders als ein „normales“ Programm am Computer. Ein Programm gibt meistens für jeden möglichen Fall ein Szenario aus und wiederholt diesen Vorgang. Ein neuronales Netz dagegen bekommt ein Dataset, das für möglichst viele Fälle die Ausgangswerte und das erwünschte richtige Ergebnis hat. Das Dataset wird vorher in Trainings- und Testdateien aufgeteilt. Das neuronale Netz arbeitet dann mit den Trainingsdaten. Mithilfe einer oder mehrerer Funktionen versucht es dann so gut wie möglich diese Funktion(-en) für alle Trainingsdateien anzupassen, um so die Fehlerquote möglichst gering zu halten. Dazu werden werden die Parameter der Funktion bei jeder neuen Datei angepasst. Um zu testen, wie gut das neuronale Netz wirklich ist, können diesem im Anschluss die Testdateien übergeben werden. Der Output wird dann mit den echten Ergebnissen verglichen. Je geringer die Differenz, desto besser ist das neuronale Netz.

Was ist der Song-Generator:

Der Song-Generator ist ein mit unseren gesammelten Musikdateien trainiertes neuronales Netz, das einen Ton, eine Tonfolge oder auch ein Lied übergeben bekommt und daraus ein oder mehrere verschiedene Klavierlieder generiert, die im besten Fall gut klingen und zu der gegebenen Tonfolge oder dem gegebenen Ton passen.

Hilfsmittel: Magenta, Tensorflow

Basis-Musik (auf der Basis dieses Datensets haben wir Songs generiert):

https://drive.google.com/drive/folders/1JfRAdHkYw8F7b0mVlPqr_xQYgJ8_xpsO?usp=sharing

Projektablauf:

Als erstes braucht man für Machine Learning immer ein Dataset, also in unserem Fall möglichst viele Midi Dateien. Gemeinsam haben wir einige Songs zusammengetragen und daraus unser Dataset erstellt. Um unser neuronales Netz zu trainieren benutzen wir Magenta (baut auf Tensorflow und Keras auf). In Magenta können neuronale Netze aber meistens nicht direkt mit Midi Dateien trainiert werden. Deswegen haben wir anschließend alle Midi Dateien in eine .tfrecord Datei umgewandelt, dabei werden alle Midi Dateien in einer einzigen .tfrecord - Datei zusammengefasst. In der Magenta Dokumentation wird .tfrecord als effizienteres Dateiformat (im Vergleich zu Midi) beschrieben, auf das sich leichter zugreifen lässt. Die entstandene .tfrecord-Datei wird anschließend in Trainings- und Testdateien geteilt. Bei der Erstellung der .tfrecord-Datei muss bereits die Konfiguration, mit der später gearbeitet werden soll, angegeben werden, damit sie entsprechend formatiert wird. Magenta bietet die Konfigurationen Basic, Mono, Lookback und Attention an. Wir haben uns für Attention entschieden, weil mit Attention Muster besser erkannt werden und damit generierte Lieder mehr Struktur haben. Zu jeder Konfiguration gibt es auch bereits vortrainierte Modelle, so können die Modelle auch ohne Vorbereitung ausprobiert und miteinander verglichen werden.

Als nächstes haben wir also unser neuronales Netz trainiert, indem wir die Trainingsdateien dem neuronalen Netz übergeben haben und dieses daraus gelernt hat. Genauer gesagt geht das neuronale Netz ohne Informationen an diese Daten heran und arbeitet dann in dem gegebenen Rahmen. Wir haben den Hyperparameter „batch size“ auf 64 gesetzt, was in diesem Fall bedeutet, dass immer 64 Stücke gemeinsam angeguckt werden und ein Teil aus einer 64×64 Matrix besteht, die Größe der Matrix haben wir mit dem Hyperparameter „rnn_layer_sizes“ festgelegt. Je höher diese Zahl desto weiter ist der Rahmen, in dem das neuronale Netz arbeiten kann. Je weiter der Rahmen, desto eher neigen neuronale Netze zu Over Fitting, also fast perfekten Vorhersagen bei den Testdateien und sehr schlechten Vorhersagen bei nicht Testdateien. Wenn der Rahmen zu klein ist, werden die Vorhersagen auch schlecht. Eine gute Veranschaulichung dafür ist, wenn man sich Punkte auf einer Parabel vorstellt dafür eine Gerade zu finden, die alle Punkte möglichst gut trifft. Das kann nie wirklich genau werden, weil die Gerade keine Kurven hat.

Das neuronale Netz versucht eine Funktion zu finden, die mit gegebenen Daten möglichst nah an die gewünschten Daten herankommt. Das erfordert eine hohe PC-Leistung aufgrund der vielen Rechnungen, weshalb wir ab diesem Schritt mit Google-Colab gearbeitet haben, dort wird der Code über Google Rechner durchgeführt. Dieses Netzwerk haben wir ungefähr 20000 Durchläufe machen lassen, woraus dann unsere Endergebnisse entstanden sind.

Da mit unserer Methode immer nur ein Ton pro Zeitpunkt generiert wird (es also keine Akkorde entstehen), haben wir auch versucht mehrere generierte Midi Dateien übereinander zu legen. Die so entstandenen Lieder klingen spannender, aber oft auch sehr durcheinander. Das liegt daran, dass auch wenn das gleiche Netzwerk mehrere Midi Dateien mit dem gleichen Input generiert, diese generierten Dateien nicht aufeinander abgestimmt sind und verschiedene Muster haben können.

Journal

Code:

song-generator.ipynb.zip

Musikbeispiele (von uns generiert):

2020-07-13_162359_10.mid.zip

Danksagung:

Vielen lieben Dank an dieser Stelle an Andrea und Lysanne, dass ihr uns ein so cooles Projekt ermöglicht habt! Und auch danke an Stefan, der er uns das Grundprinzip von Machine Learning nochmal genauer erläutert hat, sowie ein von ihm erstelltes Jupyter-Notebook zu dem Thema zur Verfügung gestellt hat. Wir haben alle vier einiges aus dieser Zeit mitgenommen, auch wenn oder wahrscheinlich gerade weil es öfter mal ordentlich was zu knobeln gab!

Literatur:

ss20/song-generator.txt · Zuletzt geändert: 2020/08/27 14:19 von dahin