Open Source Spracherkennung mit Vosk

Habt ihr auch schon einmal den Gedanken gehabt, Eure Audiodateien einfach automatisch transkribieren zu lassen? Dann seid ihr wahrscheinlich – wie ich – früher oder später über das Stichwort „Speech to Text“ gestolpert. „Speech to Text“ besagt im Endeffekt, dass eine Audiodatei in eine Software eingespielt wird und am Ende dann eine fertige Textdatei ausgegeben wird. Ich habe zwischenzeitlich mit Vosk und dem Github-Repository recasepunc“ eine Open Source Lösung dafür gefunden und mithilfe der Vorarbeit von John Singer auch eine kleine Nutzeroberfläche für die Textererkennung geschrieben und auf meinem codeberg-Account veröffentlicht.

Zu meiner Intention

Ärzte und Anwälte kennen das Problem, dass man für den Beruf sehr viele Schriftstücke anfertigen muss und nicht alles tippen will. Blogger und Journalisten schreiben ja auch häufig viel und haben dann entsprechend auch Bedarf an einer Vereinfachung des Prozesses. Generell spricht man ja eigentlich auch schneller, als man schreibt. Nur muss dann das Gesprochene irgendwie in Textform überführt werden, den man dann verschicken kann oder für andere Sachen nutzen kann. Häufig bedeutet das, dass eine Schreibkraft, oder man selbst, stundenlang die eigenen Monologe anhört und abtippt.

Wenn man jetzt – wie ich – niemanden hat oder anstellen will, der einem diese Arbeit abnimmt, dann wird das schon mal bisschen komplizierter. Noch vor ein paar Jahren waren die ersten Programme zur Audio-Erkennunge noch ziemlich rudimentär. Sie haben irgendwelche Sachen erkannt, nur meist nicht das, was man gesagt hatte. Das ist natürlich inzwischen viel besser geworden. Nicht zuletzt kennen ja auch viele Alexa oder Siri oder andere Sprachbefehl-Bots und -Dienste. Das heißt, das funktioniert inzwischen ganz gut. Auch Microsoft hat für Windows eine eigene Texterkennung, die mit Mikrofon ganz einfach gesteuert werden kann und dann direkt in Word schreibt.

Ich weiß, es gibt inzwischen auch für Handys kleine Apps die einem die Texterkennung abnehmen können. Allen Spracherkennungsdiensten ist natürlich gemein, dass immer die Frage mitschwingt, wie gut die spezifische Fachausdrücke erkannt werden. Vor allem Mediziner haben das Problem, dass viele Fachausdrücke in ihren Texten drin sind und natürlich auch erkannt werden müssen.

Warum Open Source?

Das Problem habe ich jetzt nicht, aber dafür habe ich ein Problem damit, wenn meine Audiodateien durch das Internet in irgendwelche Clouds geschickt werden – was bei den meisten dieser Dienste geschieht – und dann von irgendwelchen Firmen ausgewertet werden, ohne dass ich genau weiß, was mit meinen Daten passiert. Nun kann man sich für den Computer oder auch für sein Mobiltelefon eine Software kaufen, die dann offline die Texterkennung vornimmt.

Als Linux- und Sailfish-Nutzer ist das dann aber noch einmal etwas schwieriger, da meist keine native Software für diese Betriebssysteme existiert. Und klar kann man eine virtuelle Maschine aufsetzen und eine Offline-Software darin nutzen. Aber wenn es sich vermeiden lässt, tue ich das und hoffe – wie auch bei anderer Software – auf eine Open Source Lösung, die dann in Linux angewendet werden kann. Zudem hatte ich schon länger den Wunsch meine Blogbeiträge auch einzusprechen und nicht alles eintippen zu müssen. Nach etwas Recherche habe ich jetzt etwas gefunden, was diese Wünsche alle vereint. Es ist das Open Source Projekt Vosk, das über eine Python-Schnittstelle genutzt werden kann.

Was steckt eigentlich hinter einer Texterkennung?

Hinter einer Texterkennung steckt das sogenannte „Natural language processing“ (NLP). Das heißt, ein Algorithmus wurde mit so vielen Audiodateien wie möglich darauf trainiert, den unterschiedlichen Frequenzen in einer Audiodatei Wörter zuzuordnen. Dem maschinellen Lernalgorithmus werden also verschiedenste Audiodateien mit dem richtigen Endergebnis zu dieser Audioaufnahme übergeben. Zusätzlich wird die Anweisung gegeben, dass die fehlerhafte Zuordnung minimiert werden soll, sodass sich der Algorithmus in vielen Lernzyklen selbst trainieren kann. Einfach gesprochen: Die Maschine hört ganz viele Audiodateien und kriegt zusätzlich das Ergebnis mitgeteilt. So kann das Modell (maschinelles Lernen) Zusammenhänge zwischen Frequenzunterschieden und Buchstaben (bzw. Wörtern) erkennen lernen.

Um dieses Modell kontinuierlich zu trainieren, braucht es sehr viel Rechenleistung. Gleichzeitig will man verschiedene Modelle mit unterschiedlichen Einstellungen trainieren, um am Ende das beste Ergebnis aussuchen zu können. Das bedeutet, dass man noch mehr Rechenleistung und parallel arbeitende Systeme braucht. Das fertig trainierte Modell ist dann mit mehreren Gigabyte auch nicht gerade klein. Das sind die Gründe, warum die meisten Texterkennungs-Dienste auf eine Cloud beziehungsweise auf einen Server zurückgreifen. Dort wird dann der Text, den man eingesprochen hat zum Machine Learning Algorithmus geschickt und dieser gibt dann basierend auf seinem Erlernten eine Textdatei zurück.

Das heißt nicht nur wird die Quell-Datei verschickt, sondern es sind dann natürlich auch Firmen dabei, denen man jetzt vielleicht nicht unbedingt seine Audiodateien mitgeben möchte (Amazon ist mit AWS der größte Cloud-Hoster). Wer jetzt einen Amazon Echo Dot hat, für den ist das sicherlich kein Problem. Für mich, der so etwas nicht hat und auch gerne die Hoheit über seine Daten – ob Text oder Stimme und Sprache – behalten möchte, ist es eben bisschen schwieriger.

Der Open Source Ansatz von Vosk

Zu Weihnachten habe ich ein Diktiergerät geschenkt bekommen, so dass es jetzt konkreter wurde mit der Texterkennung. Nachdem das Machine Learning inzwischen auch durch den Fortschritt in der Computerhardware sehr weit fortgeschritten ist, wurden obige Probleme für Open Source Enthusiasten nun auch einfacher zu handhaben. Und mit Vosk wurde Texterkennung über eine Schnittstelle auch für andere zugänglich gemacht. Das heißt in mühevoller Kleinarbeit haben Freiwillige verschiedene Rechenmodelle trainiert. Die fertigen Modelle können ganz nach Belieben genutzt werden, ob offline auf dem Handy oder PC oder um einen eigenen Server damit zu bestücken, der dann von Apps angesprochen werden kann. Wer möchte, kann aber auch mit den Infos der Vosk-Entwickler sein ganz eigenes Modell mit dem Code und eigenen Audiodateien trainieren.

Mit dem fertigen Modell kann dann für eine beliebige Audiodatei eine Textvorhersage gemacht werden. Das klingt alles ein bisschen kompliziert. Es ist auch nicht ganz trivial, aber auch nicht so schwer, dass man es nicht verstehen kann. Das erste was man braucht ist ein Modell, das mit Audiodateien der gewünschten Sprache trainiert wurde. Es kann dann anhand der Frequenzunterschiede verschiedene Stimmen und Wörter unterscheiden, um das dann einem Text zuzuordnen. Dazu gibt es von Vosk die fertig trainierten Modelle und Schnittstellen in verschiedenen Programmiersprachen über die dieses Modell angesteuert werden kann. Wie gesagt ein Open Source Projekt und eben auch eine Schnittstelle für Python. Seit der Entwicklung von KYSA ist das ja meine Programmiersprache für eigentlich alles, was ich programmiere.

Der schöne Vorteil an dem Ganzen ist natürlich, dass es erstens Open Source ist und zweitens auch offline funktioniert. Das heißt, sobald ich das Modell auf meinen PC runtergeladen habe, brauche ich keine Verbindung mehr zum Internet und meine Daten bleiben auf meinem Computer. Das ist für mich ein sehr wichtiger Punkt. Zudem ist durch den Open Source Ansatz auch sichergestellt, dass alle diese Arbeit nutzen und verändern können. Natürlich hat das – wie immer bei Open Source Projekten – auch Nachteile. So zum Beispiel, dass aufgrund der begrenzten finanziellen und zeitlichen Mittel die Ergebnisse auch nicht ganz so intuitiv und genau ausfallen wie bei einem Spezialprogramm von einer Firma, die mit Hunderten von Mitarbeitern daran arbeitet. Das muss am Ende jeder für sich selbst abwägen.

Wie lässt sich Vosk nutzen?

Ich wollte es auf jeden Fall ausprobieren und habe mich mit dieser Vosk-Schnittstelle eingehender beschäftigt. Darüber und über Internetrecherchen bin ich auf den Blog von John Singer gestoßen. Er hatte scheinbar dasselbe Anliegen wie ich und war schon einen Schritt weiter: Er hat ein kleines Programm mit Nutzeroberfläche für diese Vosk-Schnittstelle geschrieben. Dort kann man das heruntergeladene Modell einbinden und für die Texterkennung einer Audiodatei (*.mp3 bzw. *.wav) nutzen. Als Ergebnis erhält man eine JSON-Datei mit den erkannten Wörtern. Da Mp3-Dateien ja komprimierte Audiodateien sind, muss zur Erkennung dieser Dateien zusätzlich das ffmpeg-Paket installiert sein. Wie sich das installieren und mit dem Python-Code verknüpfen lässt, erklärt John auf dieser Seite.

Ich habe das auch ausprobiert und es funktioniert ziemlich gut. Und es ist schon erstaunlich, wie viele Wörter richtig erkannt wurden, obwohl das Modell weder meine Stimme noch meinen Sprachgebrauch kannte. Vielmehr wurde es von anderen mit den unterschiedlichsten Audio-Schnipseln gefüttert und trainiert.

Zeichensetzung und Schreibung

Nur wollte ich natürlich keine JSON-Datei mit Einzelwörtern, sondern einen Fließtext und wenn möglich mit richtiger Zeichensetzung und Groß-/Kleinschreibung. Also habe ich den Code angepasst, um eine *.txt-Datei als Ergebnis zu erhalten und weiter recherchiert, wie ich die Schreibung und Zeichensetzung zusätzlich vorhersagen lassen könnte. So habe ich herausgefunden, dass es ein weiteres Modell gibt. Diese Modell verarbeitet unformatierten Text Zeichen für Zeichen, um die Zeichensetzung und die Groß- und Kleinschreibung zu berichtigen. Auch dieses Modell ist von Freiwilligen programmiert und trainiert worden. Es basiert maßgeblich auf der Arbeit von Benoit Favre, der den Code und Ergebnisse auf seinem Github anbietet. Gerade in der deutschen Sprache ist es ziemlich schwierig, herauszufinden, ob jetzt ein Punkt, Komma oder Fragezeichen zu dem Satz passt; und das, ohne dass man es einspricht. Erschwerend kommt dann auch noch die Großschreibung hinzu, die im Deutschen deutlich häufiger vorkommt als im Englischen. Man muss dieses Modell also schon mit sehr vielen Sätzen trainieren, um ein befriedigendes Ergebnis zu erhalten. Und auch hier war ich überrascht, wie gut die Ergebnisse von diesem Modell sind. Insgesamt war das Training beider Modell natürlich sehr viel Arbeit, wofür ich denjenigen, die das gemacht haben auch sehr dankbar bin.

Meine Weiterentwicklung zur Nutzung beider Modelle

Ich habe nun also die einzelnen Bestandteile für meine komplette Texterkennung kombiniert und in einer Fortentwicklung des kleinen Programms von John Singer verknüpft. Diesen Code findet Ihr auf meinem Codeberg-Profil. Zunächst wird also aus der ausgewählten Audio-Datei mit dem Vosk-Modell als Text erkannt, in einen zusammenhängende Text-Variable (string) formatiert und in das Zeichensetzungs-Modell basierend auf Benoit Favres Arbeit gespeist. Dieses berichtigt dann die Zeichensetzung und Großschreibung in der Text-Variable und am Ende wird eine fertige *.txt-Datei an den Ort, an dem sich die Audiodatei befindet, ausgegeben. Diese kann dann in einer beliebigen Textverarbeitungssoftware geöffnet und korrigiert werden.

Damit das ganze auch mit verschiedenen Sprachen und Modellen funktioniert, bietet das Programm die Möglichkeit, das jeweils gewünschte Modell sowohl für die Audioerkennung als auch für die korrekte Zeichenerkennung separat einzubinden. So kann man – je nach Bedarf – auch wechseln und gucken, welche Modell bessere Erkennung liefern. Voraussetzung ist aber natürlich, dass beide Modelle lokal auf dem PC gespeichert sind. Und wer nur die Spracherkennung ohne Zeichensetzung/Großschreibung ausprobieren will, hat die Möglichkeit die Nutzung des zweiten Modells über ein simples Häkchen abzuwählen. Dann gibt es als Endergebnis auch eine Textdatei, allerdings ohne Satzzeichen und in Kleinschreibung.

Bei alldem sollte man sich natürlich im Klaren sein, dass beide Modelle keine absolut korrekten Sätze erkennen. Nicht zuletzt hängt es auch von der eigenen Sprechweise ab, wie klar verständlich und damit erkennbar die Texte sind. Ich habe letzte Woche meinen ersten Text für Draußen tut gut eingesprochen und würde sagen, es hat zu neunzig Prozent gestimmt. Diesen Text, den ihr gerade lest, den habe ich auch eingesprochen und über neunzig Prozent stimmte insgesamt (also mit Zeichensetzung und Schreibung). Nichtsdestotrotz muss der Text am Ende noch einmal überarbeitet werden, aber dennoch ist es eine wahnsinnige Arbeitserleichterung.

Und damit das Ganze nicht nur von mir genutzt werden kann, sondern auch von alle Anderen, die sich dafür interessieren, gibt es den Code und eine kleine Anleitung zur Nutzung unter der oben genannten Codeberg-Quelle. Ein bisschen Ahnung von Python schadet dabei nicht, zur Einrichtung der nötigen Python-Umgebung gibt es aber von John Singer eine gute Schritt-für-Schritt Anleitung. Damit alles funktioniert müsst Ihr eine virtuelle Umgebung einrichten und die nötigen Pakete, die in der Textdatei „requirements.txt“ aufgelistet sind, installieren. Zusätzlich braucht Ihr auch das ffmpeg-Package, um Mp3-Dateien transkribieren zu können. Wenn das alles vorhanden ist und Ihr Euch die trainierten Modelle heruntergeladen und lokal gespeichert habt, ist der Rest über die Nutzeroberfläche sehr einfach. Je nach Größe der Audiodatei dauert der Transkriptions-Prozess dann nur einige Minuten.

Ich wünsche allen viel Spaß beim Transkribieren und freue mich natürlich auch über Feedback und Eure Erfahrungen; gerne auch im Kommentar!

In diesem Sinne: Mit Vosk gibt es für alle Interessierte eine super Open Source Sammlung für die Texterkennung. Mit den bereits vortrainierten und herunterladbaren Modellen in verschiedenen Sprachen steht der offline-Nutzung dann auch nichts mehr im Wege. Zusätzlich gibt es basierend auf der Arbeit von Benoit Favre weitere Modelle, die zur Erkennung der Satzzeichen und Schreibung genutzt werden können. Die beiden Modelle sind insgesamt ca. 2,5 GB groß; den Platz muss man auf jeden Fall haben. Dafür kann man dann aber seine Sprachdateien unabhängig vom Internet und irgendwelchen Cloud-Anbietern transkribieren. Mit dem kleinen Programm, das ich basierend auf der Vorarbeit von John Singer auf meinem Codeberg-Account bereitstelle, ist der eigentliche Transkriptions-Prozess dann auch mit wenigen Mausklicks angestoßen. Am Ende erhält man eine fertigen *.txt-Datei mit einem Fließtext und relativ akkurater Zeichensetzung.

10 Kommentare

  1. Hey Daniel nutze es auf windows bei der John Singer version werden ü ä ö nicht erkannt daher verwende ich deine.
    Ich glaube es ist wegen der Groß Kleinschreibung oder hast du eine trainierte Sprache?

    1. Hallo egger,
      ja wahrscheinlich liegt das am zweiten Modell. Ich nutze kein Windows und eine Exe ist nicht geplant; wäre ohnehin zu groß. Du kannst Dir Deine aber selbst mit pyinstaller machen.
      Das mit dem Prozessfehler liegt denke ich an der unterschiedlichen Prozesshandhabung bei der Wav-Umwandlung in Linux und Windows. Vielleicht habe ich nächste Woche Zeit nochmal nachzugucken, woran das liegen könnte.

      1. Hey danke das dur dir zeit nimmst und es mal anschaust.
        Ja mit py installer habe ich eine exe datei erstellt jedoch wird die exe nicht ausgeführt und es kommt eine fehlermeldung: file already exists but should not

        1. Hi,
          es hat etwas gedauert, aber ich habe jetzt nicht finden können, woran es in Windows hakt. Dafür habe ich das Programm um die Möglichkeit erweitert, mehrere Audio-Files auszuwählen und nacheinander zu prozessieren. Wenn Du magst, kannst Du es mal testen.

  2. Hey wenn ich eine wav datei konvertiere kommt eine fehler meldung:
    Windows: Object has no attribute ‚wavStereoFile‘
    bei einer mp3 geht es problemlos
    danke

    1. Hallo, danke für den Hinweis.
      Da war wohl ein kleiner Fehler in der Wav-Dateiumwandlung. Habe es angepasst und auf Codeberg upgedatet.
      Es sollte jetzt eigentlich gehen. Hoffe es klappt und wünsche viel Spaß damit!

          1. Hallo, ich kann den Fehler nicht reproduzieren. Bei mir funktioniert alles. Auf welchem System nutzt Du es? Exe kann nicht gemacht werden, dann müsste die PyTorch-Bibliothek integriert werden, die ist allein 400 MB groß. Du kannst die ursprüngliche Version von John Singer probieren, gibts auch als Exe.

Schreibe einen Kommentar zu Daniel Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht.

Cookie Consent mit Real Cookie Banner