Alexa, mach das Licht an!

Doch wie funktioniert Alexa überhaupt?

Genau diese Frage stellen sich bestimmt einige Menschen heutzutage. Damit Alexa, Google Assistant, Siri, MyCroft oder andere Sprachassistenten funktionieren, wie wir es gewohnt sind, spielen einige höchst innovative Prozesse zusammen. Um dies auf die wesentlichen und für Data Science relevanten herunterzubrechen, könnte man sagen, dass Sprachassistenten aus einer Spracherkennung (STT - Speech to Text), je nach Anwendungsbereich einer Echtsprachverarbeitung (NLP - Natural Language Processing) oder einem Echtsprachverständnis Algorithmus (NLU - Natural Language Understanding) und einer Sprachausgabe (TTS - Text to Speech) bestehen.

In diesem Beitrag werden wir uns aber nur mit dem ersten Teil eines Sprachassistenten, der Spracherkennung beschäftigen.

Vergangene Entwicklungsschritte

Zuerst ein kleiner Abstecher, wie sich die Spracherkennung bisher entwickelt hat, um zu verstehen, welche Hürden es gab und worin die Eigenheiten der Spracherkennung liegen.

Die ersten Spracherkennungsapparate konnten nur einzelne Wörter erkennen (null bis neun, ...) und dies nur in einem sehr eingeschränkten Maß. Einige dieser Implementationen waren im Gegensatz zu den heutigen Lösungen sogar noch hardwarebasiert (sie versuchten, Muster der elektronischen Impulse, die vom Mikrofon erzeugt wurden, zu deuten). Ein großes Problem für diese Eingeschränktheit war unter anderem auch die niedrige Rechenleistung in den 1950iger Jahren.

Generell waren die Spracherkennungsapparate zu dieser Zeit sozusagen eher Audiowörterbuchabgleiche, d.h. diese konnten nur einzelne Wörter identifizieren. Auch in den kommenden Jahren beschäftigte man sich zumeist nur damit, dieses Wörterbuch noch größer und performanter zu machen.

Erst in den 1990igern gab es die ersten Spracherkennungsalgorithmen, die auch fortlaufende Sprache transkribieren konnten. Durch diesen Fortschritt wurde die Spracherkennung auch immer mehr zu einer Standardfunktion, da Microsoft sie in den 2000ern in den Office Produkten integrierte und Google Ende der 2000er ihr sogenanntes Voice Search veröffentlichte.

Zum Ende der 2000er hin bekam der Bereich der Spracherkennung einen großen Boost durch den Einsatz von maschinellem Lernen, welches man auch schon in Googles Voice Search fand.

Eben diese, auf maschinellem Lernen (inkl. Deep Learning) basierende Spracherkennung werden wir in diesem Beitrag intensiver behandeln. Die Entwicklung dieser Spracherkennungsmodelle ermöglichte die Einführung von diversen Sprachassistenten in den 2010ern.

Fazit Entwicklungsschritte

Anhand der vergangenen Entwicklungsschritte kann man klar sehen, dass die fehlende Rechenleistung und vollprogrammierte Herangehensweise die größten Zurückhalter der Technologie waren. Durch die heutige Verfügbarkeit enormer Rechenleistung und den Fortschritten im maschinellen Lernen konnte sich die Spracherkennungstechnologie in den letzten Jahren wesentlich verbessern. Dadurch stellen heutzutage die größten Hürden ein gutes Modell und gute Trainingsdaten dar, um eine möglichst präzise und für diverse Akzente passende Lösung zu finden, die zudem eine möglichst geringe Word Error Rate (WER) hat.

Funktionsweise

Für die Funktionsweise eines Spracherkennungsmodells werden wir uns hier an dem von Dariu Amodei et al. von Baidu Research veröffentlichtem Paper DeepSpeech (Version 1) orientieren. Es ist nicht mehr ganz State of the Art mit einer WER von 7.6% (Mozilla's Implementation) beim LibriSpeech clean test Datenset, aber dennoch ein sehr gutes Modell für sehr rauschige oder akzentbehaftete Spracherkennung, erst recht in seiner Version 2 (DeepSpeech 2).

Das DeepSpeech Modell basiert auf einem Recurrent Neural Network (RNN), das Spektrogramme der Tonaufnahmen analysiert und daraus Transcriptionen erstellt. Dieses Model wird dabei mit einer Dropoutrate von 5 - 10% (nur für die feed-forward Schichten gültig) betrieben, was bedeutet, dass 5 - 10 % der Neuronen im Netzwerk zufällig ausgewählt werden und im Trainingsschritt ignoriert werden. Da dies ein iterativer Vorgang ist, werden bei jedem Trainingsschritt andere Neuronen zufällig ausgewählt und ignoriert, während die vorher ignorierten Neuronen wieder mitarbeiten dürfen. Diese Technik hilft, dass Neuronale Netze nicht zu spezifisch für die Trainingsdaten werden (also ein besser generalisiertes Netzwerk darstellen) und einzelne Neuronen unabhängig werden (sich somit nicht auf ihre Nachbarneuronen verlassen).

Das RNN funktioniert schon sehr gut, aber doch noch nicht perfekt, da gewisse phonetisch-gleichklingende Silben falsch transkribiert werden können. Um hier Abhilfe zu schaffen, wird danach ein N-gram Language Mode verwendet, welches aus dem Output des RNN einen korrekten Text macht.

Damit dieses Model auch so gute Ergebnisse erzielt, wurden die 5000 Stunden an Trainingsdaten von 9600 verschiedenen Sprecher*innen künstlich mit Hintergrundgeräuschen, Nachhall und Echos kombiniert. Dieses Verfahren hat zwei Vorteile: Es macht das Modell robuster im Erkennen von Sprache in lauten Umgebungen und erhöht die Anzahl an Trainingsdaten wesentlich.

Tutorial

Mit Mozilla's DeepSpeech werden wir nun unsere eigene Spracherkennung einrichten.

DeepSpeech von Mozilla basiert auf dem von Baidu entwickelten DeepSpeech Model (Version 1), wessen Funktion wir in der vorherigen Sektion behandelt haben. In diesem Beitrag wird die Version 0.9.3 verwendet.
Die Version 0.9.3 von Mozilla's DeepSpeech ist ident mit der Version 0.9.3 von Coqui's STT. Dieses Tutorial sollte eigentlich auf der Version 0.9.3 von Coqui beruhen, da Coqui's STT im Gegensatz zu Mozilla's DeepSpeech viel aktiver weiterentwickelt wird. Leider funktionierte dies aber nicht so wie erhofft.

Wir testeten dieses Tutorial auf einem Windows 10 System (Update 2004). Es sollte aber auf Linux genau gleich funktionieren. Die einzige Voraussetzung für das Tutorial ist eine Python 3 Installation.
Nun einfach die Windows PowerShell in einem Ordner deiner Wahl öffnen und los geht's.

Das Tutorial basiert auf dem Quickstart von Mozilla's DeepSpeech Dokumentation
TIPP: Ganz einfach und ohne Setup geht es mit unserem Python Notebook auf Github, welches sich per Knopfdruck direkt in Google Colab starten lässt.

  1. Installiere DeepSpeech
    pip3 install deepspeech

  2. Downloade die vortrainierten Modeldaten für Englisch

    wget "https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/deepspeech-0.9.3-models.pbmm" -outfile "deepspeech-0.9.3-models.pbmm"

    wget "https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/deepspeech-0.9.3-models.scorer" -outfile "deepspeech-0.9.3-models.scorer"

  3. Downloade die Beispielaudiodatein

    wget "https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/audio-0.9.3.tar.gz" -outfile "audio-0.9.3.tar.gz"

  4. Entpacke das Beispielaudioarchiv

    tar xvf audio-0.9.3.tar.gz

  5. Transkribiere eine Audiodatei

    deepspeech --model deepspeech-0.9.3-models.pbmm --scorer deepspeech-0.9.3-models.scorer --audio audio/2830-3980-0043.wav

Hier noch ein iPython Notebook, welches das Tutorial noch einmal komplett für Linux enthält:

Wie geht es weiter?

Man kann nun entweder das vorgefertigte Model mit eigenen Daten verbessern - dieses Verfahren nennt sich Fine-Tuning - oder sich ein eigenes Modell, welches nur auf eigenen Daten basiert, erstellen.

Aber ich will Deutsch transkribieren können, nicht Englisch!

Das ist auch möglich. Man kann entweder ein eigenes Modell für deutsche Sprache von Grund auf trainieren oder man macht es sich leicht, und nimmt das vorhandene englische Modell und lässt es für Deutsch umlernen. Dieser Prozess nennt sich Transfer Learning und ist möglich, da das Modell ja schon prinzipiell erlernt hat, Sprache zu erkennen. Nun lässt man das Modell eben nur ein neues "Alphabet" und gesprochenes Deutsch erlernen. Der Prozess des Transfer Learnings hilft, einiges an Zeit zu sparen und braucht weniger Daten zum Lernen. Dies liegt daran, da ein Modell von Grund auf zu trainieren eine Menge Zeit und Rechenpower sowie eine dementsprechende Fülle an Beispieldaten braucht.

Für den Anfang empfehlen wir das Common Voice DE Package von Mozilla zu nutzen.

Dieses Datenset muss aber zu Beginn ordentlich gecleant werden und ins richtige Format gebracht werden. Einer dieser Schritte bleibt aber erspart, da Mozilla ein Vorverarbeitungsskript im DeepSpeech Repository inkludiert hat, um Common Voice ins richtige Format zu bringen.

Hier noch die weiterführenden Links für Fine-Tuning und Transfer Learning:

Fine-Tuning

Transfer Learning

Referenzen

„The History of Voice Recognition Technology“, Blog, Sep. 06, 2018. https://www.condecosoftware.com/blog/a-history-of-voice-recognition-technology/ (zugegriffen Aug. 09, 2021).

„Papers with Code - Deep Speech 2: End-to-End Speech Recognition in English and Mandarin“. https://paperswithcode.com/paper/deep-speech-2-end-to-end-speech-recognition (zugegriffen Aug. 09, 2021).

A. Hannun et al., „Deep Speech: Scaling up end-to-end speech recognition“, arXiv:1412.5567 [cs], Dez. 2014, Zugegriffen: Aug. 09, 2021. [Online]. Verfügbar unter: http://arxiv.org/abs/1412.5567

J. Brownlee, „Dropout Regularization in Deep Learning Models With Keras“, Machine Learning Mastery, Juni 19, 2016. https://machinelearningmastery.com/dropout-regularization-deep-learning-models-keras/ (zugegriffen Aug. 09, 2021).

Fabian Fiedler studiert Data Science an der FH St. Pölten.