Dienstag, 3. Januar 2017

Mein DeepBach Projekt (Teil 1)


Aufmerksam wurde ich auf das Thema DeepBach durch den folgenden Artikel im MIT Technology Review:

https://www.technologyreview.com/s/603137/deep-learning-machine-listens-to-bach-then-writes-its-own-music-in-the-same-style/

Und von dort aus zu diesem Papier:

DeepBach: a Steerable Model for Bach chorales generation, Gaëtan Hadjeres, François Pachet
https://arxiv.org/abs/1612.01010.

Hadjeres und Pachet stellen einen Deeplearning Modell vor, basierend auf neuronalen Neuronalen Netzen um aus Melodien 4-stimmige Choralsätze zu automatisch generieren, die "wie Bach" klingen.

Bach hat viele dieser 4-stimmigen Choral-Sätze auf Kirchenliedmelodien geschaffen und dabei immer ähnliche kompositorische Methoden verwendet. Der Text sollte transportiert werden und klar verständlich sein, weshalb alle Stimmen die Silben zur selben Zeit singen, es ist also homophone Musik. Die harmonischen Bewegungen sind aber so charakteristisch, das auch ein musikalischer Laie wie ich, einem Choral diesen Bachklang anhört, selbst wenn ich es nicht erklären kann.

Das eigentliche Problem, des Komponierens ist die wechselseitige Abhängigkeit der "Harmonischen Geschichte" die erzählt wird, durch die Alteration, die die vier Stimmen durchlaufen und die musikalische Eigenständigkeit und Lebendigkeit jeder einzelnen Stimme. Wie Bach das gemacht hat fasziniert mich immer wieder aufs Neue. Der Schmerz der Abwesenheit dieser Kunstfertigkeit kennt jeder Chorsänger heute bei Sätzen in denen die Altstimme z.B. manchmal viele Takte lang auf einem Terzton einschläft.

Sie haben dazu Ihr Modell "DeepBach" mit 389 Bachchorälen trainiert. Ihr Ansatz ist agnostisch, was meint, das hier nicht einer mathematische Repräsentation harmonische Satzregeln abgebildet werden oder dem Programm erklärt wird was eine Engführung ist oder das Quintparalellen böse sind, sondern neuronale Netze hören einfach zu wie Kinder, und erkennen dann - "das ist Bach", so wie ich es auch tue. Und das Modell setzt es dann auch noch um und macht aus einer Melodie einen Bach-Style-Choral.

In diesem Youtube wurde Deepbach die Melodie ”Wer nur den lieben Gott läßt walten” von Georg Neumark (1641) zugeworfen, die Johann Sebastian Bach  bekanntlich in einem Choral (BWV 434) bearbeitet hat, um DeepBach am Original zu messen.



Das ist eine völlig übliches Vorgehen des Deeplearning, die Qualität eines Modells an Echtdaten zu messen.

https://www.youtube.com/embed/QiBM7-5hA6o

Wer möchte kann auch diesen Test von den Autoren machen, den Sie verwenden um die Güte anhand von vielen musikalische Ohren zu quantifizieren:
http://www.flow-machines.com:3010/

Mich interessiert mehr, es selber auszuprobieren.


Das Projekt liegt auf github und kann hier heruntergeladen werden:
https://github.com/SonyCSL-Paris/DeepBach/blob/master/README.md

Es ist Python3 basiert und erfordert das nachinstallieren einiger Bibliotheken.

Mein erster Versuch mit Python 3.5.1 von https://www.python.org/downloads/ auf Windows 10 schlug sehr früh fehl. Die Komponente Numpy, benötigt einen C-Compiler den Windows erstmal nicht zur Verfügung hat. Da die Fehlermeldungen aber unübersichtlich sind habe ich schon eine halbe Stunde gebraucht um das Problem zu verstehen.

Mein zweiter Versuch mit einem vorkompilierten Python (Anaconda) führte zwar etwas weiter und nachdem ich den Paketinstaller pip upgedated hatte zog dieser auch sogenannte Wheels - für mein OS vorkompilierte Pakete, scheiterte dann aber doch an der Komponente Scipy, und zwar so das er die eigentlich als Wheel vorhanden Komponente nicht mehr sauer zurückrollen konnte.

Damit hatte ich dann genug und zog mit dem Projekt auf Ubuntu 14.4 LTS.
(Wenn das jemand unter Windows zum Laufen bringt, nehme ich gerne Hinweise entgegen.)

Hier gingen die Requirements auch relativ fix durch, allerdings habe ich ein -H hinzugefügt.

sudo -H pip3 install -r requirements.txt


Einziger Wermutstropfen ist, das pip eine zu alte Version ist sich aber nicht updaten läßt:

You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.




petra@petra-nuc:~/deepbach/DeepBach-master$ pip3 install --upgrade pipRequirement already up-to-date: pip in /home/petra/.local/lib/python3.5/site-packages

Und auch DeepBach redet nun mit mir:

petra@petra-nuc:~/deepbach/DeepBach-master$ python3 deepBach.py -l 100
Using Theano backend.
music21: Certain music21 functions might need the optional package matplotlib;
if you run into errors, install it by following the instructions at
http://mit.edu/music21/doc/installing/installAdditional.html
Namespace(batch_size_train=128, ext='', length=100, midi_file=None, name='deepbach', num_dense=200, num_iterations=20000, num_units_lstm=[200, 200], num_val_samples=1280, output_file='', overwrite=False, parallel=1, samples_per_epoch=89600, timesteps=16, train=0)
model models/deepbach_0 loaded
model models/deepbach_1 loaded
model models/deepbach_2 loaded
model models/deepbach_3 loaded
100%|███████████████████████████████████████| 5000/5000 [01:24<00:00, 59.09it/s]
Traceback (most recent call last):
  File "deepBach.py", line 900, in <module>
    output_file=output_file)
  File "deepBach.py", line 60, in generation
    score.show()
  File "/usr/local/lib/python3.5/dist-packages/music21/stream/__init__.py", line 257, in show
    return super(Stream, self).show(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/music21/base.py", line 2588, in show
    **keywords)
  File "/usr/local/lib/python3.5/dist-packages/music21/converter/subConverters.py", line 820, in show
    self.launch(returnedFilePath, fmt=fmt, app=app)
  File "/usr/local/lib/python3.5/dist-packages/music21/converter/subConverters.py", line 159, in launch
    fmt, launchKey))
music21.converter.subConverters.SubConverterException: Cannot find a valid application path for format musicxml. Specify this in your Environment by calling environment.set(None, '/path/to/application')


Das Environment für Music 21 einzustellen ist dann der Task für Teil 2.

[... to be continued ...]