Transkripte mit Mozilla DeepSpeech / Machine Learning


#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:


#30

Habe gerade nicht viel Zeit, trotzdem hier ein lustiger Zwischenstand:

Update

  • Neues Language Model erzeugt
  • Neues DeepSpeech Model erzeugt

Aktuelle Erkennungsrate des Modells (basierend auf nur ca. 800 Audioclips):

Test - WER: 0.944711, CER: 25.562472, loss: 189.645233
--------------------------------------------------------------------------------
WER: 3.000000, CER: 8.000000, loss: 52.858353
 - src: "hinzufügen"
 - res: "en su fee"
--------------------------------------------------------------------------------
WER: 2.500000, CER: 13.000000, loss: 109.189522
 - src: "ventilator einschalten"
 - res: "um die aber reinschaut de"
--------------------------------------------------------------------------------
WER: 2.333333, CER: 20.000000, loss: 182.175934
 - src: "seid lieb zueinander"
 - res: "die ksa rendeler ire zen f der"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 9.000000, loss: 55.442699
 - src: "lesezeichen anzeigen"
 - res: "die reiche an eigenen"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 10.000000, loss: 56.983654
 - src: "programm öffnen"
 - res: "o kram er fern"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 10.000000, loss: 58.512329
 - src: "klimaanlage einschalten"
 - res: "die ma a nadler einschalten"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 10.000000, loss: 63.022354
 - src: "ein ausrufezeichen reicht"
 - res: "ein aus su e zehn e ich"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 10.000000, loss: 65.272552
 - src: "mit rindfleisch"
 - res: "we ren fern sh"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 10.000000, loss: 69.936279
 - src: "event erstellen"
 - res: "wie er der sten"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 12.000000, loss: 79.148705
 - src: "bitte wiederholen"
 - res: "wir wer die baule"
--------------------------------------------------------------------------------

#31

Yey! Endlich ist der komplette, aktuell verfügbare Datensatz veröffentlicht worden!

Jetzt kann ich wieder weiter rumschrauben…


#32

Update

  • Okay, die ersten Ergebnisse waren ernüchternd (siehe unten). Das Training eines Modells auf meinem Rechner mit einer aktuellen Grafikkarte (Geforce RTX 2060 - extra zu diesem Zweck angeschafft), dauert ca. 24h. Hierbei habe ich den kompletten derzeit erhältlichen Common Voice Datensatz verwendet.
  • Ich habe mich noch einmal an Mozilla gewendet und nachgefragt, wie sie ihr Modell konfiguriert haben und warum. Warte hier noch auf konkrete Anwort.
  • Trainiere in der Zwischenzeit noch einmal mit einer anderen Konfiguration (größerer Hidden-Layer, weniger Epochen) ein neues Modell und schaue, wie’s läuft.

Ergebnisse - Modell 2019-02-28

I FINISHED Optimization - training time: 21:40:06
D Epochs - running: 0, done: 50
100% (25627 of 25627) |####################################################| 
Elapsed Time: 0:25:55 Time:  0:25:55
Computing acoustic model predictions...
100% (8542 of 8542) |######################################################| 
Elapsed Time: 0:45:02 Time:  0:45:02
Test - WER: 0.351997, CER: 7.856708, loss: 37.732666
--------------------------------------------------------------------------------
WER: 3.000000, CER: 4.000000, loss: 5.312325
 - src: "weitermachen"
 - res: "bei der machen"
--------------------------------------------------------------------------------
WER: 3.000000, CER: 4.000000, loss: 16.388323
 - src: "weitermachen"
 - res: "bei der machen"
--------------------------------------------------------------------------------
WER: 3.000000, CER: 13.000000, loss: 68.673531
 - src: "knallharter bodycheck"
 - res: "kanal hat hat es die scheck"
--------------------------------------------------------------------------------
WER: 2.500000, CER: 9.000000, loss: 20.223913
 - src: "ventilator einschalten"
 - res: "wenn die nato ein schalten"
--------------------------------------------------------------------------------
WER: 2.500000, CER: 11.000000, loss: 20.648293
 - src: "batterieladestand anzeigen"
 - res: "das rila stand an sein"
--------------------------------------------------------------------------------
WER: 2.500000, CER: 14.000000, loss: 56.810741
 - src: "dialogstatus zurücksetzen"
 - res: "dialog status ecksätzen in wien"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 3.000000, loss: 5.428734
 - src: "verstanden"
 - res: "so standen"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 4.000000, loss: 9.225818
 - src: "servus"
 - res: "sehr wu"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 6.000000, loss: 10.352249
 - src: "kikeriki"
 - res: "die terek"
--------------------------------------------------------------------------------
WER: 2.000000, CER: 4.000000, loss: 12.535884
 - src: "weitermachen"
 - res: "bei vormachen"
--------------------------------------------------------------------------------
D Done.

Verwendete Konfiguration

--train_batch_size 3
--dev_batch_size 3
--test_batch_size 3
--n_hidden 512
--learning_rate 0.0001
--epoch 50

#33

Also vor der Subscribe werde ich wohl nicht mehr zu viel kommen, aber ich habe hier noch einmal ein kurzes

Update

Ich habe Forschergeist Folge FG60 Klimawandel anhand des von @timpritlove veröffentlichenten Transcripts und der entsprechenden Timecodes in viele kleine handliche wav Dateien zerschnipselt und einmal exemplarisch 5 davon gegen das Modell geworfen. Hier die derzeitigen Ergebnisse:

Input: Hallo und herzlich willkommen zu Forschergeist, dem Podcast des Stifterverbands für die deutsche Wissenschaft.
Output: alle unter sich wir kommen zu forschergeist fokas testit da verbands für die deutsche bissen schafft

Input: Da waren Sie dann auch unter anderem in Neuseeland glaube ich in der Ausbildung oder?
Output:die da man sie dann auch unter anderem binden wolle sie dank laubig

Input: Sind aber selber Ozeanograph und Paleoklimatologe, das sind natürlich tolle Namen.
Output: wer selber er ozeanograf und palkia tore das in das licht tolle name

Input: Deren Fläche schrumpft nicht oder nur sehr unwesentlich, weil diese Kontinentaleispanzer sind eben mehrere tausend Meter dick.
Output: deren fläche schrumpft nicht er wurde nur sehr unwesentlich weil diese kontinent hal eispanzer isen demen ehre tausend meter dick

Input: Was wird jetzt neu erforscht, was will man herausfinden, was ist noch unverstanden?
Output: wird jetzt neu erforschtes will was wir man heraus fin was es noch ohne verstanden

Erkenntnisse

  1. Interessanterweise wurden Worte, die garantiert NICHT vorher Trainiert worden oder im verwendeten Language Model enthalten sind, relativ gut erkannt. Beispiele sind “Ozeanograf” oder “Eispanzer”. Phrasen, die garantiert vorher schon mal Trainiert und im Language Model enthalten sind wie “unter anderem” oder “nur sehr unwesentlich” werden bereits sehr gut erkannt. Beides könnte darauf hinweisen, dass das erzeugte Modell derzeit “overfitted” ist (siehe hierzu https://en.wikipedia.org/wiki/Overfitting)
  2. Ein von DeepSpeech erzeugtes Modell lässt sich derzeit nicht “einfach so” verwenden. Es gibt sehr viele Abhängigkeiten zu Bibliotheken, die auf dem verwendenden System installiert sein müssen, bevor man damit Audio in Text umwandeln kann. @rstockm Den ursprünglichen Plan, das Modell “einfach so” in Reaper/Ultraschall zu integrieren (siehe Post GANZ OBEN), halte ich derzeit für nicht möglich. Nach allem, was ich von Mozilla aber gelesen/herausgefunden habe, wird derzeit daran gearbeitet, dies zu ändern und ein ein “praktikableres Modellformat” zu erzeugen.
  3. Der spaßige Teil ist vorüber, nun wird es ARBEIT. :slight_smile: Aber ich plane, trotzdem weiter am Ball zu bleiben. Dass wir aber DeepSpeech als Tool zur automatisierten Erstellung von Transkripten in naher Zukunft einsetzen können werden, davon ist nicht auszugehen.

Vielen Dank aber schon mal an alle, die den Thread hier bisher gelesen haben und für euer gezeigtes Interesse! Hoffe, man sieht sich auf der Subscribe!


#34

Hallo zusammen,

ich finde die Bemühungen hier sehr lobenswert. Ich habe diesbezüglich auch schon einige Recherchen angestellt und bin dabei auf etwas gestoßen, was auch noch interessant sein könnte, falls es nicht von jemandem hier ist:

Insbesondere das Sprachmodell und die Audiodaten sind vielleicht interessant…

Language model
For the language model a text corpus is used, also provided by the people of the " German speech data corpus" (https://www.inf.uni-hamburg.de/en/inst/ab/lt/resources/data/acoustic-models.html).

Speech data
http://www.repository.voxforge1.org/downloads/de/Trunk/Audio/Main/16kHz_16bit/ (~50h)
https://nats.gitlab.io/swc/ (~150h)

Darüber hinaus bin ich mit https://vorleser.net in Kontakt getreten und habe nachgefragt, ob die kostenlosen Hörbücher dort in Kombination mit den PDF-Dateien im Download irgendwie als Trainingsdaten vorliegen können…

Falls die Idee nicht zu abgefahren ist, könnte man auch die Hörproben von Audible “Transkribieren” und als Trainingsdaten verwenden. Hörbücher sind meistens sehr korrekt und deutlich gesprochen.

Was meint ihr?