Transkripte mit Mozilla DeepSpeech / Machine Learning

Hallo zusammen,

in Vorbereitung auf die anstehende SUBSCRIBE 18 in Köln habe ich mich gefragt, was ich zur Community beitragen könnte. Ich selbst arbeite schon seit einer ganzen Weile im Big Data und Data Science Umfeld, hab also mäßigen Plan, was Machine Learning & Co. angeht.

Nun ist mir aufgefallen, dass das “Wie bekommen wir Audio-Transkipte halbwegs automatisiert?”-Problem noch nicht gelöst ist. Weiterhin ist mir aufgefallen, dass Mozilla gerade an einer Open Source Speech-To-Text-Engine arbeitet (DeepSpeech: https://github.com/mozilla/DeepSpeech)
Außerdem hat Mozilla das Common Voices Projekt, welches einen entsprechenden Datensatz zum Erstellen eines Machine Learning Modells erzeugen soll, auch seit letztem Jahr auf die Sprache “Deutsch” ausgeweitet (Common Voices: https://voice.mozilla.org/de)

Frage: Hat schon jemand mal mit DeepSpeech experimentiert/Erfahrung gesammelt?

Idee: Wenn man es hin bekäme, einen entsprechend großen deutschen Datensatz zu erzeugen, könnte man ein deutsches Modell auf Basis von DeepSpeech erzeugen, welches man vielleicht mit jeder Ultraschall-Installation gleich mitliefert. Dann müsste man entsprechende Bindings von Reaper/Ultraschall bereitstellen, um das Modell anzusprechen. In Reaper/Ultraschall bräuchte man dann ein Script, welches jede Audiospur einzeln in kleine Teile mit max. 5 Sekunden Länge zerhackt, dann gegen das Modell wirft, dann das Ergebnis in eine Datei mit dem Timecode wirft. Das macht man dann per Audiospur einzeln, damit man kein “zwischengelaber” hat, womit das Modell sicher nicht klar käme. Zum Schluss müsste man die einzelnen Files/Timecodes noch mergen und eine einzige Datei erzeugen, die man dann irgendwo hin schreibt, damit der Kram dann weiter in den Podlove Publisher reinfließen kann.

Der deutsche Common Voice Datensatz ist aktuell nicht unfassbar groß, aber da man als Podcaster ja sowieso stark unter “Rededrang” leidet und wir alle entsprechendes Aufnahme-Equipment vorliegen haben, könnte man schon mal als Community-Projekt mit entsprechenden Daten beliefern. Den Rest müsste man sich dann halt mal ansehen.

Was meint ihr dazu? Klingt das aus eurer Sicht sinnvoll?

12 „Gefällt mir“

Das klingt schon nach einer sehr spannenden Idee, allerdings stellt sich mir die Frage ob man mit so lokalen Einzelintegrationen tatsächlich große Aggregatoren schlagen kann. Ich meine vermutlich hätte die geballte Podcastinglandschaft genügend Multitrack-Aufnahmen um da ne Menge Informationen einzupflegen, nur muss man das dann eben auch machen. Mich würde mal eine Pilotstudie interessieren, bei der man vielleicht mal eine überschaubare Menge Daten einträgt und dann guckt wie weit die Erkennungsraten kommen.

Vorteil wäre natürlich, dass man auch persönliche Aufnahmen dazuwerfen kann und dadurch vielleicht die individuelle Erkennung verbessern. Am Ende muss man dann halt nur schauen, ob man damit wirklich gegen die kommerziellen Anbieter ankommt …

Das was ich kompliziert finde ist die Kasache das man Wort genau trennen muss nicht das diese Audio schnipsel mitten im Wort wenn wohl möglich noch mitten in einen laut passieren wie will man da wissen was dann noch kommt oder beim folge teil den Anfang des ganzen.

Das kann Ultraschall/REAPER ganz gut. Nennt sich: Dynamic Split.

1 „Gefällt mir“

sicher das es nicht worte duchtrennt bei einen null duchgang ??? ich meine dazu gehört eine etwas AI zu erkennen das das ein wort ist.

Mein Vorschlag: Ich check erstmal das DeepSpeech aus und dann schaun wir weiter.

Nach allem was ich seit gestern gelesen hab, erkennen die ersten vier schichten des Neural Network eh nur einzelne „Buchstaben“ und setzt die dann hinten in der letzten Schicht des Netzwerkes wieder zu bereits bekannten Wörtern zusammen.
Falls wir dann irgendwo auf ein Problem laufen, können wir uns dann am konkreten Problem Gedanken machen, wie wir das fixen.

Ich hoffe, dass ich spätestens morgen mit den ersten Tests loslegen kann, eine kurze Zwischenberichterstattung werdet ihr dann hier finden. Bin schon gespannt! Danke schon mal für das viel Feedback!

4 „Gefällt mir“

Ja. Sehr sicher. Man kann es auch so parametrisieren, dass nur Sätze getrennt werden.

3 „Gefällt mir“

Da biste aber ein paar Jahre zu früh dran (ist erst Subscribe 10 :wink: )

Ja, ich warte auch schon seit Jahren auf ne Anständige Lösung. Mit Hand dauert einfach viel zu lange…

2 „Gefällt mir“

Erste Erkenntnisse

  1. Der offizielle Mozilla Common Voice Datensatz zum Trainieren eins möglichen Modells enthält derzeit nur die Sprache Englisch (ca. 12GB Audiodaten gepackt)
  2. Aaaaber wenn man etwas forscht, findet man auf einen Amazon S3-Storage ( https://common-voice-data-download.s3.amazonaws.com/ noch die internationlen Datensätze, welche derzeit nur Beta-Status haben.
  3. Der deutschsprachige Datensatz umfasst derzeit ca. 3GB Audiodateien (gepackt). Dies entspricht scheinbar ca. 125.000 einzelnen, validierten, unbereinigten Audiodateien mit entsprechender Transkiption.
  4. Der Datensatz wird scheinbar täglich neu erzeugt (ist schon mal sehr gut!)
  5. Nach einem von Mozilla bereitgestellten “Bereinigungsskript” bleieben nur noch jeweils ca. 2900 Datensätze zum Trainieren, Entwickeln und Validieren eines Modells übrig

Nächste Schritte

  1. Github-Repo aufsetzen, welches eine Analyse-Umgebung, Download- und Bereinigungsskripte der Daten enthält
  2. Verstehen, warum nur noch so wenige Datensätze übrig bleiben, ggf. erst einmal Bereinigung nicht vornehmen

Idee: Aufruf an Community starten, mehr Datensätze hinzuzusteuern.

  • Unter https://voice.mozilla.org/de kann jeder innerhalb von 2-3 Minuten ohne Account kurze, vorgegebene Sätze vorlesen und aufnehmen. Das Aufnehmen passiert direkt im Browser, ein hochladen von Files ist nicht notwendig.
  • Wer nicht aufnehmen kann/möchte, kann 2-3 Minuten beisteuern, um Datensätze zu validieren. Hierzu wird einem ein Audioclip von weniger als 5 Sek länge vorgespielt und der entsprechende vorgelesene Satz dargestellt. Anschließend muss man bestätigen, ob der vorgelesene Satz auch dem dargestellten Text entspricht.
2 „Gefällt mir“

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
4 „Gefällt mir“

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
5 „Gefällt mir“

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.

2 „Gefällt mir“

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!

2 „Gefällt mir“

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.
1 „Gefällt mir“

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.

1 „Gefällt mir“

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
6 „Gefällt mir“

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.

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

5 „Gefällt mir“

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).

5 „Gefällt mir“

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.

1 „Gefällt mir“