Transkripte mit Mozilla DeepSpeech / Machine Learning


#10

Update

  • Scheinbar explodieren seit gestern auf mysteriöse Weise die Contribution-Zahlen für den deutschen Datensatz bei Mozilla Common Voice :slight_smile: :+1:

  • Es existiert jetzt ein rudientäres Github Repo (https://github.com/simnotes/transcripts/), was ich allerdings noch gründlich aufräumen muss. Wie so oft bei sowas ist es spannender, sich mit den Daten auseinander zu setzen, als Ordnung zu halten… Man kennt das :smiley:

  • Der Grund, warum im Deutschen nur noch so wenig Datensätze übrig bleiben ist folgender: In dem gesamten Datensatz gibt es zwar 127.997 valide Aufnahmen von mehreren Sprechern, allerdings wurden hierbei nur 7412 verschiedene Sätze eingesprochen. Diese werden dann noch etwas bereinigt und in drei relativ gleich große Datensätze aufgeteilt (Training: 2726, Dev: 2342, Test: 2342). Dies bedeutet auch, dass pro Satz nur eine Aufnahme benutzt wird, um das Neuronale Netzwerk zu trainieren.

  • Zum Vergleich: der im Englischen benutzt Trainingsdatensatz ist in etwas 3 mal so groß (6994 Sätze), die Dev und Test-Datensätze sind vergleichbar groß.

  • Die einzusprechenden Sätze wurden automatisiert aus verschiedenen Internet-Quellen extrahiert und enthalten daher auch viel Blödsinn, z.B. HTML-Tags, URL-Encodierungen, etc.
    Eine Liste aller zum Training verwendeter Sätze findet ihr hier (teil-bereinigt: https://github.com/simnotes/transcripts/blob/master/notebooks/de_sentences.csv)

Nächste Schritte

  1. Repo aufräumen
  2. Download des Deutschen Datensatzes weiter automatisieren
  3. Bereinigung für den Datensatz verbessern

#11

Vielleicht sollte ich einen Blog oder so woanders starten, damit ich hier niemanden über den Progress zuspamme (und ich ehrlich gesagt keine Ahnung habe, ob das hier jemanden interessiert), aber bis es soweit ist, hier die Fortschritte des Tages:

Update

  • Repo (https://github.com/simnotes/transcripts) etwas aufgeräumt
  • Download-Skript hinzugefügt, um die bereits erwähnten Mozilla Common Voice Daten automatisiert herunter zu laden
  • Dokumentation in README.md hinterlegt, sodass jeder in der Lage sein sollte, sich ebenfalls die gleiche Python-Umgebung aufzusetzen und die entsprechenden Daten herunter zu laden

#12

Ich finde das Thema sehr spannend. Von mir aus kannst du gerne zier berichten, wie es weiter geht.

Und für beta Test stehe ich gerne zur Verfügung, wenn es nicht hoch kompliziert ist. Bin kein Raketen Wissenschaftler.


#13

Ich finde es ganz ausgezeichnet, was hier gerade passiert! Vielen Dank Simon. Und die Up-Dates sind auch super. Ich verstehe zwar nur die Hälfte, aber ich lerne. Also: sehr geil!


#14

Update

  • Habe angefangen, mir die deutschen Texte etwas genauer anzusehen und diese zu bereinigen: z.B. gibt es Zeilen, die folgendes Pattern aufweisen “”“inhalt”“inhalt.” oder “inhalt”“inhalt”“inhalt”. Hier gibt es einen Pull-Request für das offizielle Mozilla CorporaCreator-Repo, welches ein Programm bereitstellt, um grundsätzliche Bereingiungen vorzunehmen und den Datensatz in Trainings-, Test- und Dev-Datensätze zu unterteilen: https://github.com/mozilla/CorporaCreator/pull/54
  • Angeblich ist es in dem CorpoaCreator noch angedacht bei der Aufteilung der Datensätze ich Training, Test und Dev sicherzustellen, das ein Sprecher eines Satzes nur in einer der drei Datensätze auftaucht und nicht in zweien oder allen dreien. Hintergrund ist, dass man beim Trainieren eines Machine Learning Modells die Trainingsmenge benutzt und mit einer komplett disjunkten Menge an Datensätzen anschließend das trainierte Modell validiert und überprüft. Wenn ich jetzt also mit einem Sprecher das Modell trainiere, und mit dem gleichen Sprecher das Modell validiere, dann ist die Wahrscheinlichkeit sehr hoch, dass das Modell gute Ergebnisse liefert und die Texterkennungsrate entsprechend hoch ist. Wenn jetzt aber ein anderer Sprecher “in das Modell spricht”, dann wird die Texterkennungsrate möglicherweise viel weiter darunter liegen. Um eben eine objektivere Aussage zu erhalten ist es daher notwendig, diese Unterteilung eben auch Sprecher-Abhängig vorzunehmen.
  • Ansonsten habe ich bei Google um ein Test-Budget gebeten, um auf deren Cloud Infrastruktur und deren Tensorflow Processing Units zurückgreifen zukönnen. Das sind im Prinzip spezialisierte Server, die auf das Trainieren von Neuronalen Netzwerken über das Tensorflow-Framework (welches ebenfalls von Google entwickelt wird) genau zugeschnitten sind. Damit hoffe ich beim Trainieren der Modelle deutlich an Zeit sparen zu können… keine Ahnung allerdings, ob mir das gelingt und ob ich das Budget zur Verfügung gestellt bekomme. Die Nutzung ist ansonsten recht teuer.

Nächste Schritte

  • Sicherstellen, dass Sprecher nur in einer der Datensätze (Training, Test, Dev) auftauchen und nicht in mehreren zugleich.

#15

Falls du Fragen hast - immer gerne! Dieses Data Science/Machine Learning-Zeugs ist, was die Mathematik dahinter angeht, oft ziemlich komplex, aber die Grundzüge eigentlich relativ schnell erklärt.


#16

Update

  • Der Pull-Request ist nach langer Diskussion, wie man genau die Daten um die Anführungszeichen bereinigen soll, nun durch. Zusammenfassend lässt sich sagen, dass man beim aktuellen Stand der Technik für das Training eines Neural Networks aktuell besser keine Anführungszeichen oder Interpunktion oder ähnliches in dem Datensatz lässt, da diese nicht explizit mitgesprochen werden. Daher ist es auch schwer für ein Neural Network diese Interpunktion mit aus dem Satz herauszuhören. Trotzdem haben wir uns entschieden, Anführungszeichen und Interpunktion in dem (Roh-)Common Voice Datensatz weiterhin drin zu lassen, da es nicht abwegig ist, dass Machine Learning Modelle in 1-2 Jahren diese ebenfalls korrekt berücksichtigen könnten.
  • Ich bin jetzt offiziell eingeladen worden, mit in dem Common Voice Repo mitzuarbeiten -> Erkenntnis: Open Source Entwicklung kann Spaß machen! :smile:
  • Das Problem mit der Aufteilung der Sprecher auf die Datenmengen Train, Dev und Test ist weitestgehend behoben. Allerdings ist der entsprechende Pull Request noch “under review”.

Nächste Schritte

  • Mozilla Deepspeech herunterladen, installieren
  • Common Voice Datensatz so transformieren, dass er als Input für DeepSpeech funktioniert

#17

Update

  • Der Pull-Request zur Aufteilung der Daten in Train, Dev und Test-Mengen ist durch. Es gibt nun keine Überschreidung an Sprechern mehr zwischen den einzelnen Datensätzen.
  • Das Repo unter https://github.com/simnotes/transcripts aktualisiert:
    • Installations/Gebrauchsanleitung geupdated.
    • Das Installieren aller benötigten Packages, Herunterladen der Daten, Extrahieren, Einteilen in Train, Dev, Test-Mengen, Umkodieren von mp3s in wav-files und erzeugen von DeepSpeech-Kompatiblen Eingangsdaten ist nun vollständig automatisiert (siehe: ./install_environment.sh und ./prepare_data.sh)
  • Mozilla DeepSpeech heruntergeladen, CUDA und cuDNN installiert. Erste Lauftests durchgeführt. (klappt :smiley:)

Nächste Schritte

  • Erzeugen eines binären Deutschen Language Models via kenLM (benötigt als Input für DeepSpeech)
  • Erzeugen eines “Alphabets” (benötigt als Input für DeepSpeech). Eigentlich könnte man hier auch eine statische Datei mit den Buchstaben von A-Z inkl. Umlaute und Space nehmen, allerdings find ichs schicker, wenn die auch automatisch basierend auf den Eingangsdaten erzeugt wird. Dann funktioniert das auch gleich für andere Sprachen mit.

#18

Stuff is happening!!! :exploding_head: :rocket: :smile: :exclamation:


#19

Nach einer längeren Pause, hier mal wieder ein

Update

  • Die ersten Testergebnisse waren erwartungsgemäß für die Tonne: Das vor 14 Tagen trainierte Modell hat den gesprochenen Satz “Papperlapapp sagte Erika” in den Satz “aber la ab, sa bla bär” transkribiert.
  • Nun beginnt die Phase des Modell-Tunings, es gibt zig Stellschrauben, wie man das Ganze verbessern kann: Anzahl der Trainings-Epochen-Verändern, Trainingsdatensatz vergrößern, Trainingsdaten besser aufräumen, Anzahl der Knoten im Netzwerk erhöhen… das einfachste und erfolgversprechenste ist aber vermutlich, erst einmal das zugrundeliegende Language Model zu verbessern.

Nächste Schritte

  • Textcorpus für Language Model Erstellung aufbauen
  • LM erzeugen

Background Wissen -> Was tut ein Language Model?

Innerhalb des Neuronalen Netzwerkes werden die Wahrscheinlichkeiten für einzelne gesprochene Buchstaben auf Basis von Lauten vorhergesagt. Heißt also, wenn man einen Audioschnipsel gegen das Modell wirft, wird dieser in einzelne noch kleinere Schnipsel unterteilt und diese einzeln “gescored”, d.h. für jeden Buchstaben im Alphabet wird ein Wahrscheinlichkeitswert vorhergesagt. Nun ist es aber so, dass wir ja komplette Wörter sprechen und nicht nur einzelne Buchstaben, es handelt sich daher um eine Sequenz von Buchstaben. Daher ist das Neuronale Netz bei Deep Speech so implementiert, dass die Wahrscheinlichkeit eines einzelnen vorherzusagenen Buchstabens von der Wahrscheinlichkeit der vorherigen und der nachfolgenden Buchstaben abhängt. Ein solches Neuronales Netz nennt sich Bidirectional Recurrent Neural Network. Soweit, so gut. Nun haben wir also ein einzelnes Wort vorhergesagt.

Um die Vorhersage-Wahrscheinlichkeit eines einzelnen Wortes noch einmal zu verbessern, könnte man nun noch einmal alle einzelnen Worte in einen größeren Kontext bringen und diese ebenfalls als Sequenz betrachten. Ähnlich wie bei den einzelnen Buchstaben hängt die Wahrscheinlichkeit eines einzelnen Wortes von der Wahrscheinlichkeit der nachfolgenden und vorherigen Worte ab. Genau an dieser Stelle setzt das Language-Model an. Dieses ist quasi ein “externes” oder “weiteres” Model, welches für eine Reihe von Worten eine Wahrscheinlichkeit für mögliche nachfolgenden Worte errechnet. In der Praxis sieht man das täglich beim Tippen auf einer Smartphone-Tastatur - genau für diesen Anwendungsfall kommen ebenfalls Language Models zum Einsatz.

Bei DeepSpeech wird die Language-Model-Implementierung “kenLM” (https://github.com/kpu/kenlm) genutzt. Um dieses zu trainieren, muss zunächst eine möglichst große Menge von möglichst unterschiedlichen Sätzen gesammelt werden. Würde man hierfür Beispielsweise ausschließlich die Menge aller in allen Harry Potter Romanen geschriebenen Sätzen benutzen, könnte man ein solches Language Model dafür nutzen, automatisch einen weiteren, neuen Harry Potter Roman schreiben zu lassen. Da jedoch unser Ziel ist, podcasts transkribieren zu lassen, müsste man einen Text-Corpus erzeugen, der möglichst dicht an unserem Podcast-Sprech dran ist. Vor allem müssten in einem solchen Text-Corpus auch Sätze mit entsprechrenden Fremdworden vorhanden sein (so zumindest meine aktuelle These).


#20

Klingt sehr spannend! Könnte mir vorstellen, das ein Interviewformat wohl gut zum Training beitragen würde, weil sich im Zweifel nur der Gast ändert. Evtl. könnte da der Forschergeist Podcast von Tim gutes Ausgangsmaterial liefern. Audio und Transkripte sind vorhanden und durch die unterschiedlichen Themen und Interviewpartner auch entsprechend viele Fremdwörter. Da der Podcast auch Kapitelmarker hat sind Audio und Text auch leicht in kleine Teile zerlegbar.


#21

Die Texte sind bearbeitet da ist oft nicht die wörtliche Sprache als Text sondern oft der Sinn und das wichtige inhaltlich zusammen gefasst.

Das wäre für eine “dumme” automatische Transkription die nicht den Sinn des Textes versteht nicht zu gebrachen.


#22

Mir ist das schon klar. Ich gehe davon aus, dass das Transkript wohl angepasst werden muss, aber der größte Teil ist bereits erstellt. Die erforderlichen Änderungen sollten entsprechend weniger zeitaufwändig sein.


#23

gut ich sage es mal anders… es geht darum einen netzwer bei zubringen sprache in einen text zu übersätzen dabei ist es wichtig das die inhalte zum üben identisch sind.

beispiel:

dies ist ein text zum üben des neurolalen netzwerkes

es ist wingen erforderlich das beides jleich ist sonst kann das netzwerk keinen bezug herstellen zwischen sprochenden wort und dem text wort.


#24

Hatte ich auch so verstanden. Trotzdem glaube ich, das es einfacher ist das vorhandene Transkript anzupassen, als von Null zu beginnen.
Natürlich muss alles gehört und bearbeitet werden, damit die „dumme“ Maschine damit umgehen kann.


#25

Ich denke, man sollte das eine machen, ohne das andere zu lassen. Heißt:

  • ich habe vorhin einfach mal @timpritlove angehauen, ob er mir die Audiospuren vom Forschergeist getrennt nach Sprechern und entsprechende Transkripte zur Verfügung stellen kann.
  • Darüber hinaus habe ich einen Datensatz mit angeblich knapp 8Mio. deutschen Sätzen drin gefunden, den ich jetzt erstmal als Grundlage für das Bauen eines Language Models nutzen werde: https://www.inf.uni-hamburg.de/en/inst/ab/lt/resources/data/acoustic-models.html (siehe unter “Downloads” -> “German_sentences_8mil_filtered_maryfied.txt.gz”)

Die Transkripte sollte man auf jeden Fall nutzen können, um sie in das Language Model einfließen zu lassen. Direkt mit dem gesprochenen müssen sie nicht zwangsweise zusammenhängen.


#26

Da verlangt du der intelligents echt was ab.


#27

Naja - naiv würde ich sagen: “Mehr Daten = Mehr Besser” (oder so ähnlich) :smiley:

Dieses Datascience-Zeugs hat viel mit ausprobieren oder “iterativen Vorgehen” zu tun. Wenns besser wird, wars wohl gut, wenn nicht, dann eben nicht.

Ich habe auch mal einen Datansatz mit gesprochenen Wikipedia-Artikeln gefunden, den man auch noch nehmen könnte… dummerweise haben die jeden Satz einzeln in XML-Dateien gespeichert, von daher müsste man das erst einmal zusammenführen. Fällt mir ein: mag jemand von euch eigentlich mit Programmieren? :smiley:


#28

wichtig ist auch das du viele sprecher hast.


#29

DATT stimmt allerdings :slight_smile: