Maschinelle Sprachverarbeitung für Einsteiger

Maschinelle Sprachverarbeitung für Einsteiger: Wie Computer uns verstehen lernen
Keine Kommentare

Die automatische Spracherkennung und -analyse ist ein komplexes Themenfeld. Welche Prozesse liegen der maschinellen Emotionsanalyse zugrunde und womit kann diese Funktion selbst implementiert werden? Dieser Artikel gibt einen Überblick.

Technologien für die Erkennung und das Verstehen von menschlicher Sprache sind heute Bestandteil des Lebens und der Arbeit von Millionen von Menschen weltweit. Sie sind nicht nur die zentrale Komponente von Smart Devices wie Amazon Echo, sondern auch auf jedem Smartphone verfügbar. Aus Sicht des Anwenders scheint die Funktionalität dieser Systeme oft sehr simpel, sie beruhen jedoch auf technisch sehr komplexen Algorithmen und auf Forschungsergebnissen der letzten sechzig Jahre. Die automatische Spracherkennung und -analyse ist auch deshalb ein solch anspruchsvolles Problem, da für jede vorkommende Sprache und deren Dialekte eigene Modelle entwickelt bzw. trainiert werden müssen. Für ein vollwertiges System zur Mensch-Maschine-Interaktion ist allerdings auch die Erkennung weiterer Parameter notwendig, beispielsweise die Erkennung des emotionalen Zustands des Sprechers oder dessen Alter. Daneben kann auch die Diagnostik von Krankheiten aus der gesprochenen Sprache eine wichtige Anwendung der Sprachtechnologien sein, da sie nicht invasiv ist, den Anwender also nicht belastet und nicht der physischen Präsenz eines Arztes bedarf. Die meisten aktuellen Algorithmen beruhen dabei auf dem maschinellen Lernen, also der Modellbildung aus einer großen Anzahl von Beispieldaten.

Maschinelles Lernen steht prinzipiell für das Lernen aus Beispielen. Aktuelle Algorithmen zur automatischen Spracherkennung und zur Erkennung von paralinguistischen Parametern (wie Alter, Geschlecht, Gesundheitsoder emotionalem Zustand) beruhen zu einem großen Teil auf diesem Prinzip. Das erfordert die Verfügbarkeit einer großen Menge an Trainingsdaten, also Sprachaufnahmen mit den entsprechenden Annotationen. Im Fall der Spracherkennung bedeutet das, dass eine Transkription in geschriebenem Text vorliegen muss, im Fall der Emotionserkennung, dass die Angabe einer Emotion für jedes Zeitfenster einer Aufnahme verfügbar ist. Dadurch, dass sich die Eigenschaften, also u. a. der Klang der Stimme, die Sprechweise und der Ausdruck von Emotionen, stark von Sprecher zu Sprecher unterscheiden, sind Aufnahmen von einer Vielzahl von Sprechern notwendig, um sprecherunabhängige Systeme trainieren zu können. Sprecherunabhängige Systeme sind Spracherkenner, die auch von Personen verwendet werden können, von denen keine Aufnahmen in den Trainingsdaten vorhanden sind. Bei den meisten Tools zur Spracherkennung, die im Bürobetrieb, insbesondere für das Diktieren von Briefen eingesetzt werden, findet jedoch auch eine Feinjustierung statt, die das Modell an die Charakteristika des jeweiligen Nutzers adaptiert. Um moderne, sprecherunabhängige Systeme zu trainieren, sind in der Regel sehr große Datenmengen erforderlich: Der unter einer Creative-Commons-Lizenz veröffentlichte LibriSpeech-Corpus enthält insgesamt etwa 1 000 Stunden an englischen Sprachaufnahmen von mehr als 2 000 Sprechern. Datensätze, die zum Training kommerzieller Systeme verwendet werden, sind mitunter noch deutlich größer, allerdings halten die entsprechenden Unternehmen genauere Informationen darüber meist geheim. Im Jahr 2017 hat Mozilla das Projekt Common Voice gestartet, bei dem sowohl Sprachdaten, die Internetnutzer freiwillig zur Verfügung stellen, als auch damit trainierte Spracherkennungmodelle verfügbar gemacht werden.

Automatische Spracherkennung

Bis vor wenigen Jahren wurde automatische Spracherkennung (Sprache zu Text) meist durch sogenannte Hidden-Markov-Modelle (HMMs) realisiert. Das war der erste Ansatz, der Spracherkennung für verschiedene Anwendungszwecke verfügbar gemacht hat – vorherige Ansätze waren sowohl aufgrund der fehlenden Methodik als auch der fehlenden Rechenleistung meist nur für die Erkennung isolierter Schlagworte geeignet. HMMs sind stochastische Modelle, mit denen sprachliche Einheiten (Phoneme oder Wörter) als Folge von Zuständen modelliert werden, die nicht direkt bestimmt, sondern nur anhand der akustischen Emissionen geschätzt werden können. Phoneme sind die kleinsten lautlichen Einheiten einer Sprache (bspw. der Vokal /a/), die jedoch von verschiedenen Sprechern unterschiedlich ausgesprochen werden können. Die Realisierungen eines Phonems werden als Phon bezeichnet. Ein Vokal kann, auch im gleichen Wort, unterschiedlich lang gehalten werden. Ein HMM hat die Fähigkeit des dynamischen Time Warping, d. h. es kann Sequenzen wiedererkennen, auch wenn die Verweildauer in einem Zustand (beispielsweise dem Phonem /a/) verschieden ist. Außerdem unterscheidet sich jeder Sprecher hinsichtlich der Grundfrequenz seiner Stimme (quasi der Tonhöhe, in der gesprochen wird) und der genauen Lage der Formanten im Spektrum seiner Sprache. Formanten sind bei Betrachtung der spektralen Darstellung eines bestimmten Phons diejenigen Frequenzbereiche, die durch die Filterung im Vokaltrakt des Menschen (Hals und Mund) verstärkt werden und den Klang des jeweiligen Lauts ausmachen, sich jedoch auch zwischen Sprechern unterscheiden. Aus diesem Grund werden als Vorverarbeitungsschritt zeitabhängige Merkmalsvektoren, sogenannte Mel Frequency Cepstral Coefficients (MFCCs) aus dem Sprachsignal extrahiert. Diese enthalten eine komprimierte Darstellung des Spektrums, in denen der Anteil der Grundfrequenz und der Anteil des Vokaltraktfilters getrennt wurden. Die Folge der MFCCs sind dann die beobachteten akustischen Emissionen eines HMMs, wobei dessen Parameter aus den vorhandenen transkribierten Sprachdaten trainiert werden müssen.

Heutige Systeme zur automatischen Spracherkennung
verwenden normalerweise ausschließlich tiefe neuronale Netze (Deep Neural Networks). Für die Problemstellung der automatischen Spracherkennung, bei der eine Audiosequenz (Sprachsignal) in eine Sequenz von Wörtern übersetzt wird, eignen sich besonders rekurrente neuronale Netze (RNNs), genauer Long Short-Term Memory-RNNs (LSTM-RNNs). Diese sind dazu in der Lage, Informationen einer Sequenz über eine bestimmte Zeitdauer zu speichern und als Kontext für die Erkennung von Wörtern bzw. Sätzen zu verwenden. Als Eingabe können auch hier die oben beschriebenen MFCC-Sequenzen genutzt werden. Allerdings wird auch der Vorverarbeitungsschritt der Merkmalsextraktion zunehmend von neuronalen Netzen übernommen. Hierfür werden normalerweise sogenannte Convolutional Neural Networks (CNNs) benutzt, die als eine Menge von Filtern betrachtet werden können, mit denen die Eingangssequenz (das Audiosignal) verarbeitet wird, wobei jeder Filter für verschiedene Frequenzbereiche zuständig ist. Die Gewichte der einzelnen Filter werden jedoch – anders als in der klassischen Signalverarbeitung – nicht berechnet, sondern ebenfalls mit den gegebenen Daten trainiert. Das gesamte System der Spracherkennung inklusive Sprachmodellen wird also durch ein tiefes neuronales Netz dargestellt. Alle Teilmodelle werden damit zusammen trainiert, wobei die Grenzen zwischen ihnen zunehmend verschwimmen. In diesem Zusammenhang wird auch von End-to-End Learning gesprochen.

Es ist zu erkennen, dass maschinelles Lernen eine zentrale Komponente der heutigen Sprachtechnologien darstellt. Da gerade die automatische Spracherkennung allerdings eine sehr komplexe Problemstellung mit vielen Teilaspekten und hohem Datenbedarf ist, die eine Modellierung auf verschiedenen Ebenen erfordert, werden im Folgenden die Möglichkeiten des maschinellen Lernens an einem leichter zu demonstrierenden Beispiel erläutert: der Emotionserkennung aus der menschlichen Sprache.

Emotionserkennung

Automatische Emotionserkennung ist ein wesentlicher Forschungsgegenstand im Bereich des Affective Computing und unter anderem relevant für die Entwicklung von virtuellen Agenten, für die Robotik und die Marktforschung. Ein virtueller Agent sollte bspw. neben dem gesprochenen Wort auch den emotionalen Zustand seines menschlichen Gegenübers verstehen, um in bestimmten Situationen (Freude oder Langeweile) angemessen reagieren zu können. Automatische Emotionserkennung aus dem Sprachsignal ist längst keine Neuigkeit mehr. Während sich inzwischen auch hier End-to-End-Modelle durchsetzen, besteht die klassische Verarbeitungskette wie auch bei den Sprache-zu-Text-Systemen aus einem Schritt der Merkmalsextraktion und dem Decoding mittels eines auf maschinellem Lernen basierenden Modells.

Akustische Merkmale

Während für die meisten Sprache-zu-Text-Modelle ausschließlich die zuvor beschriebenen MFCC-Merkmale verwendet werden, kommen für die Emotionserkennung weitere akustische Merkmale in Betracht. Wie oben erwähnt, ist die Grundfrequenz der Stimme, oft als Fundamentalfrequenz (F0) bezeichnet, in den MFCCs nicht in einer präzisen Darstellung enthalten, da der Frequenzbereich stark komprimiert wird. Die Grundfrequenz, bzw. deren zeitlicher Verlauf, ist jedoch ein wichtiges Merkmal für die emotionale Färbung der Stimme und wird deshalb für die Emotionserkennung zumeist berücksichtigt. Die Schätzung von F0 ist eine komplizierte Problemstellung, da die Schwingung der Stimmbänder kein stationärer Prozess ist und eine Vielzahl an Algorithmen dafür existiert. Neben der Grundfrequenz zählen die zeitabhängige Energie des Signals und der Rhythmus der Sprache zu den prosodischen Merkmalen, die nicht von einem bestimmten Phonem abhängen. Während die Energie eines Signals relativ einfach zu berechnen ist, gibt es keine einheitliche Vorgehensweise für die Bestimmung rhythmischer Merkmale. Eine Möglichkeit besteht darin, die harmonischen Abschnitte (Zeitintervalle, in denen eine eindeutige Grundfrequenz detektiert wird) im Signal zu ermitteln und deren Länge bzw. die Pausen zwischen den Abschnitten als Merkmal zu verwenden. Relevant für die Emotionserkennung sind außerdem die sogenannten mikroprosodischen Merkmale Jitter und Shimmer, die auch für die Diagnostik von Kehlkopferkrankungen von Bedeutung sind. Sie beschreiben kurzzeitige Schwankungen der Grundfrequenz bezüglich der Periodendauer oder der Amplitude des Signals bei einer bestimmten Phase der Schwingung. Schließlich werden auch oft die Frequenzen der ersten drei Formanten und deren Bandbreiten bzw. Amplituden berücksichtigt. Alle beschriebenen Merkmale werden in kleinen überlappenden Zeitfenstern (normalerweise 20–60 ms Länge) aus dem Audiosignal extrahiert. In diesem Intervall wird das Sprachsignal als quasistationär angenommen, die Eigenschaften ändern sich also nicht signifikant.

Merkmalsvektoren

Für die Klassifikation einer kurzen Sprachaufnahme hinsichtlich der Emotion oder einer anderen paralinguistischen Information muss die Information aus den zeitabhängigen Merkmalen in einen Vektor fester Länge transformiert werden. Das geschieht häufig mittels stochastischer Maße, die auf jedes Merkmal (jeden MFCCKoeffizienten, die Grundfrequenz usw.) angewendet werden. In vielen Fällen werden durch Verwendung von Mittelwert und Varianz gute Ergebnisse erreicht, gebräuchlich sind jedoch auch Momente höherer Ordnung, Perzentile, die Steigung der Regressionsgeraden und weitere stochastische Maße. Somit wird schließlich unabhängig von der Länge des betrachteten Audiosegments ein Merkmalsvektor fester Länge erhalten. Die enthaltene Information ist auch invariant gegenüber zeitlichen Verschiebungen des Signals.

Alternativ dazu ist der sogenannte Bag-of-Audio-Words-Ansatz (BoAW) gebräuchlich, um die zeitabhängigen Merkmale in Vektoren fester Länge zu überführen. Hierbei werden Histogramme der Audiowörter gebildet, die im Audiosegment vorkommen. Da die zeitabhängigen Merkmalsvektoren keine diskreten, sondern kontinuierliche Werte annehmen, muss zunächst ein Wörterbuch definiert werden. Üblicherweise wird das mittels eines Clustering-Ansatzes (bspw. K-Means) auf einer Menge von Trainingsdaten bewerkstelligt, für die die entsprechenden Merkmale extrahiert wurden. Nun wird für alle zeitabhängigen Audiomerkmalsvektoren im zu klassifizierenden Audiosegment das (basierend auf der euklidischen Distanz) nächste Audiowort im Wörterbuch gesucht und der Zähler des entsprechenden Index im Histogramm inkrementiert. Schließlich werden die Werte des Histogramms normalerweise logarithmiert, um den Wertebereich zu komprimieren. Der resultierende Merkmalsvektor wird durch den Quantisierungsschritt als relativ robust gegenüber Störungen des Audiosignals betrachtet. Die Größe des Wörterbuchs ist dabei jedoch ein entscheidender Parameter. Je kleiner das Wörterbuch, desto robuster ist der Ansatz tendenziell gegenüber Störungen, allerdings ist die Genauigkeit dann meist geringer als bei einem umfangreichen Wörterbuch.

Der BoAW-Ansatz ist analog im Bereich der Bilderkennung gebräuchlich (Bag-of-Visual-Words). Die Idee stammt ursprünglich aus dem Bereich des Natural Language Processing, insbesondere für die Anwendung in der Textklassifikation. Hierbei wird ein Text (einer oder mehrere Sätze) anhand eines vordefinierten Wörterbuchs in ein Worthistogramm überführt. Die Reihenfolge der Wörter spielt erstmal keine Rolle, allerdings existiert hierfür mit N-Grammen eine Erweiterung des Ansatzes, bei denen das Wörterbuch nicht (nur) aus isolierten Wörtern, sondern (auch) aus Sequenzen von N-Tupeln, also häufig vorkommenden Kombinationen mehrerer Wörter besteht.

Der BoAW-Ansatz und der beschriebene Bag-of-Words-Ansatz zur Textklassifikation können für die Emotionsanalyse oder auch diagnostische Anwendungen sehr gut miteinander kombiniert werden, wie in Abbildung 1 gezeigt wird. Zunächst ist hierfür die Transkription der gesprochenen Sprache mittels eines zuvor beschriebenen Systems zur automatischen Spracherkennung notwendig. Die Histogramme aus der Audio- bzw. Textdomäne können dann einfach verkettet werden. Die Erkennung der Emotion geschieht dann mittels eines Modells, das mit einem maschinellen Lernalgorithmus, wie im folgenden Abschnitt beschrieben, trainiert wurde. Optional kann das Audiosignal vor der Merkmalsextraktion aufbereitet werden, um bspw. Rauschen oder Nachhall zu entfernen oder das Signal zu entzerren.

Abb. 1: Beispiel einer Verarbeitungskette mit dem Bag-of-Words-Ansatz zur Emotionserkennung aus einer Sprachaufnahme

Abb. 1: Beispiel einer Verarbeitungskette mit dem Bag-of-Words-Ansatz zur Emotionserkennung aus einer Sprachaufnahme

Maschinelles Lernen

Mithilfe eines maschinellen Lernverfahrens, genauer: eines überwachten Lernverfahrens, wird ein Modell trainiert, das eine möglichst genaue Klassifizierung einer Dateninstanz mit unbekannter Klasse vornimmt. Beim überwachten Lernen müssen, im Gegensatz zum halboder unüberwachten Lernen, neben den Merkmalsvektoren für alle Dateninstanzen auch die jeweiligen Klassen bekannt sein. Zu den gebräuchlichsten Algorithmen zählen das k-Nearest-Neighbor-Verfahren (kNN), Random Forests, Support Vector Machines (SVMs) und (tiefe) neuronale Netze. Beim kNN-Verfahren wird eine gegebene Instanz derjenigen Klasse zugeordnet, der die k am nächsten Instanzen in der Menge der Trainingsdaten angehören. Als Abstandsmaß wird hier normalerweise die euklidische Distanz zwischen den Merkmalsvektoren betrachtet. Allerdings können bestimmte Merkmale ein spezifisches Gewicht erhalten. kNN ist ein sehr einfaches, aber rechenaufwendiges Verfahren; die Modelle haben oft eine große Genauigkeit. Der Parameter k für die Anzahl der Nachbarn ist hier ein Hyperparameter, der bei der Modellentwicklung optimiert werden muss. SVMs hingegen sind in den 90er-Jahren sehr populär geworden und auch heute noch in manchen Bereichen des maschinellen Lernens Stand der Technik. Es werden Hyperebenen zwischen den Instanzen verschiedener Klassen gefunden, mit denen die Klassen möglichst gut voneinander getrennt werden.

Ein allgemeines Problem des maschinellen Lernens ist die Überanpassung (Overfitting) des Modells an die verwendeten Trainingsdaten. Die Lernalgorithmen neigen dazu, die Parameter zu stark an die Eigenschaften der gegebenen Daten anzupassen, sodass die Modelle nicht optimal generalisieren. Deshalb muss vor der Entwicklung stets eine Partitionierung der Daten in Trainings- und Testdaten vorgenommen werden. Das heißt, dass ein kleinerer Prozentsatz der vorliegenden Daten nicht zum Training verwendet wird, sondern nur zur Evaluierung des fertigen Modells. Bei den meisten Lernalgorithmen gibt es außerdem Hyperparameter (bspw. die Lernrate bei neuronalen Netzen), die optimiert werden müssen. Da auch bei den Hyperparametern die Gefahr der Überanpassung besteht, werden normalerweise drei Partitionen verwendet: Training, Validierung und Test. Das Modell, das auf den Validierungsdaten die besten Ergebnisse erzielt, wird dann schließlich auf den Testdaten evaluiert; nur dieses Ergebnis kann als zuverlässige Schätzung für die Genauigkeit des Modells auf unbekannten Daten dienen. Bei personenbezogenen Daten – wie Sprache – ist darüber hinaus darauf zu achten, dass die Partitionierung so vorgenommen wird, dass jeder Sprecher in nur einer Partition vorkommt. Andernfalls adaptiert sich der Algorithmus an die Eigenschaften eines bestimmten Sprechers und die Ergebnisse scheinen viel besser zu sein, als sie bei unbekannten Sprechern zu erwarten sind. Prinzipiell ist Überanpassung bei allen maschinellen Lernverfahren zu finden, insbesondere jedoch, wenn die Anzahl der Modellparameter groß und die Anzahl der Trainingsdaten gering ist.

Bei der SVM kann Overfitting mit einem Komplexitätsparameter gesteuert werden. Ist dieser groß, werden bei der Optimierung der Hyperebene nur sehr wenige Fehler (Ausreißer in den Daten) zugelassen. Wird der Komplexitätsparameter kleiner gewählt, werden hingegen zunehmend Ausreißer zugelassen, sodass die Hyperebene oft besser generalisiert. Bei einem zu kleinen Wert adaptiert die Hyperebene die Daten aber zu ungenau und es kommt zur Unteranpassung. Es muss also immer – mithilfe der Validierungsdaten – ein guter Kompromiss für die Komplexität gefunden werden. Insbesondere für die hochdimensionalen Merkmalsvektoren, die in der Audioverarbeitung üblich sind (>1 000 Merkmale pro Instanz), sind SVMs gut geeignet. Bei Merkmalsvektoren niedrigerer Dimension sind normalerweise sogenannte Kernels hilfreich, um eine implizite Transformation in einen höherdimensionalen Raum durchzuführen, in dem eine trennende Hyperebene einfacher gefunden werden kann.

Neuronale Netze und Deep Learning

In den letzten zehn Jahren ist das Gebiet des maschinellen Lernens von den neuronalen Netzen revolutioniert worden. Während die Grundlagen künstlicher neuronaler Netze bereits in den 40er Jahren des 20. Jahrhunderts mit der McCulloch-Pitts-Zelle gelegt worden sind und es im weiteren Verlauf des Jahrhunderts zu mehreren Wiederbelebungen des Forschungsgebiets kam, ist die Anzahl an Veröffentlichungen, Tools und Anwendungen basierend darauf erst vor weniger als zehn Jahren sprunghaft angestiegen. Das hat mehrere Gründe. Zum einen hat es vor allem in den 90er-Jahren, aber teilweise auch schon früher, mehrere wegweisende Forschungsarbeiten gegeben, die neuartige Architekturen von neuronalen Netzen ermöglichen. Dazu gehören insbesondere die oben beschriebenen CNNs und LSTM-RNNs, aber auch neuere Entwicklungen wie Generative Adversarial Networks (GANs), die u. a. interessante Möglichkeiten zur Datensynthese bieten. Zum anderen haben sich durch die einfache Verfügbarkeit von parallelverarbeitenden Rechenressourcen (Grafikprozessoren) und die große Menge an schnell zugänglichen Datensätzen auch die Rahmenbedingungen deutlich verbessert. Aufgrund der dadurch möglichen Kaskadierung vieler Schichten in neuronalen Netzen, die Aufgaben übernehmen, die bis vor wenigen Jahren noch handgestrickten Algorithmen vorbehalten waren (z. B. Merkmalsextraktion auf Ebene des Audiosignals), wird in diesem Zusammenhang von Deep Learning gesprochen.

In der Grundstruktur bestehen künstliche neuronale Netze aus einer Vielzahl an Neuronen, die meist in einer Struktur von mehreren Schichten angeordnet sind. Ein Neuron bildet dabei jeweils eine gewichtete Summe seiner Eingangsgrößen (plus einem Bias-Gewicht) und wendet eine nichtlineare Aktivierungsfunktion auf das Ergebnis an, bspw. eine Tangens-hyperbolicus-Funktion oder im Fall des tiefen Lernens oft eine sogenannte Rectified Linearfunktion. In der Ausgabeschicht des Netzes gibt es normalerweise so viele Neuronen wie Klassen. Bei der Eingabe der Merkmale bzw. des Signals einer Instanz einer Klasse soll die Ausgabe des entsprechenden Neurons möglichst groß und die der anderen möglichst klein sein. Während der Trainingsphase werden die Daten dann iterativ durch das Netz propagiert, der Fehler am Ausgang wird ermittelt und zurückpropagiert, d. h. Schicht für Schicht zurückberechnet. Schließlich werden die Gewichte jedes Neurons so adaptiert, dass der Fehler in der Ausgabeschicht geringer wird. Entscheidende Parameter sind hierbei die Lernrate, d. h. eine Konstante, mit der der Fehler in jeder Schicht multipliziert wird um die Gewichte anzupassen, und wie viele Daten in jedem Schritt berücksichtigt werden.

Neuronale Netze haben den Vorteil, dass sie sehr flexibel sind. Mehrere Klassifizierungsaufgaben können auf einmal trainiert und verschiedene Eingangsmerkmale sehr einfach fusioniert werden. Verschiedene Schichten (wie CNNs oder LSTM-RNNs) können einfach miteinander kombiniert werden. Allerdings gibt es dadurch für jede Aufgabenstellung eine große Anzahl an Hyperparametern und möglichen Netzarchitekturen (Anzahl der Neuronen oder LSTM-Einheiten in jeder Schicht, Aktivierungsfunktionen etc.), sodass der Entwickler über einige Erfahrung und Ressourcen verfügen muss, um ein optimales Modell trainieren zu können. Ein allgemeiner Vorteil im Vergleich mit statischen Verfahren wie den SVMs ist, dass mit den rekurrenten Architekturen (wie LSTM-RNNs) Sequenzen modelliert werden können wie bei den HMMs. Eine Berechnung von stochastischen Maßen oder bspw. BoAW, um einen Merkmalsvektor fester Länge zu erzeugen, ist also nicht erforderlich.

Beispiel einer Implementierung in Python

Schließlich möchten wir an einem einfachen Beispiel eine mögliche Implementierung eines Verfahrens zur automatischen Emotionserkennung aus Sprachdaten vermitteln. Der hier verwendete Ansatz verwendet einen vordefinierten Merkmalssatz und eine SVM als Klassifikator. Als Datensatz wird im Beispiel die Datenbank Emo-DB vorausgesetzt. Diese Datenbank besteht aus Sprachaufnahmen zehn verschiedener Sprecher (fünf männlich, fünf weiblich) in sechs verschiedenen emotionalen Zuständen (Angst, Ekel, Freude, Langeweile, Trauer, Wut) und einem neutralen Zustand. Alle Sprecher in der Datenbank sind Schauspieler und haben die Emotionen gezielt gespielt; die zu hörenden Emotionen sind also nicht unbedingt natürlich und oft übertrieben. Im Bereich des Affective Computing wird deshalb meist mit Datenbanken gearbeitet, bei denen in den Sprechern in einer natürlichen Weise Emotionen elizitiert wurden. Allerdings sind die Klassen in Emo-DB sehr leicht zu erkennen, daher ist die Datenbank für Demonstrationszwecke sehr gut geeignet. In derselben Weise wie im dargestellten Codebeispiel lassen sich natürlich auch Systeme für die Erkennung von Gesundheitsparametern oder allgemein Systeme zur Audioklassifikation implementieren.

ML Conference 2018

Making Enterprises Intelligent with Machine Learning

with Dr. Sebastian Wieczorek (SAP)

Machine Learning 101++ using Python

with Dr. Pieter Buteneers (Robovision)

Im Beispiel wird ein Modell betrachtet, das auf akustischen Merkmalsvektoren beruht, die mit dem Toolkit openSMILE extrahiert wurden. openSMILE ist ein in C++ geschriebenes Programm zur sehr schnellen Extraktion von Audiomerkmalen. Es kann auf verschiedenen Plattformen wie Windows, Linux und Android eingesetzt werden. Version 2.3 kann als Quellcode und als ausführbare Datei online heruntergeladen werden. Zudem wird für unser Codebeispiel eine Installation von Python einschließlich der Bibliothek scikit-learn und deren Abhängigkeiten benötigt. Die Bibliothek enthält Funktionen zum Training und zur Evaluierung vieler Modelle des maschinellen Lernens (u. a. kNN, SVM, Random Forest, einfache neuronale Netze) und zur Datenvorverarbeitung. Empfohlen wird die Verwendung der Distribution Anaconda (Python 2 oder 3), die alle notwendigen Pakete enthält.

Für das Modell werden in openSMILE zunächst 130 zeitabhängige Merkmale (u. a. MFCC, spektrale Deskriptoren, F0, Jitter, Shimmer) extrahiert (Listing 1) und aus diesen dann Statistiken auf Ebene der jeweiligen Audioinstanz berechnet, sodass wir für jede Audiodatei einen Merkmalsvektor der Länge 6 373 erhalten. Es kommt der Merkmalssatz ComParE zum Einsatz, der sich für viele Anwendungen der paralinguistischen Sprachanalyse (u. a. Emotion, Erkennung von Parkinson und Infektionen des Atemwegs) als geeignet erwiesen hat.

#!/usr/bin/python 
# Extraktion akustischer Merkmale fuer die Datenbank EmoDB mit openSMILE

import os

wavfolder = 'download/wav'  # Ordner mit allen EmoDB wav-Dateien.
# Emotions-Labels sind im Dateinamen kodiert.

# openSMILE Pfad und Konfigurationsdatei
SMILEpath = '/tools/opensmile-2.3.0/bin/linux_x64_standalone_static/SMILExtract'  
# Linux, bei Windows entsprechend: '/tools/opensmile-2.3.0/bin/Win32/SMILExtract_Release.exe'
SMILEconf = '/tools/opensmile-2.3.0/config/ComParE_2016.conf'

# Training
outfile_train = 'EmoDB_train.csv'
indexes_train = ['11','12','13','14','15','16']

# Test
outfile_test = 'EmoDB_test.csv'
indexes_test = ['03','08','09','10']

# Merkmalsdateien entfernen, falls vorhanden
if os.path.isfile(outfile_train):
  os.remove(outfile_train)
if os.path.isfile(outfile_test):
  os.remove(outfile_test)

# Extraktion der Merkmale
for fn in sorted(os.listdir(wavfolder)):
  fn_full = wavfolder + '/' + fn
  
  if fn[:2] in indexes_train:
    outfile = outfile_train
  elif fn[:2] in indexes_test:
    outfile = outfile_test
  
  os.system(SMILEpath + ' -C ' + SMILEconf + ' -I ' + fn_full + ' -instname ' + fn + \ 
' -csvoutput ' + outfile + ' -timestampcsv 0')

Als Klassifikator kommt eine SVM zum Einsatz, bei der der Komplexitätsparameter optimiert werden muss (Listing 2). Da wir insgesamt nur Daten von zehn verschiedenen Sprechern haben, wäre eine Aufteilung in drei Partitionen nur schwierig möglich. Von daher werden die Daten zunächst nur in eine Trainings- und eine Testpartition aufgeteilt. Alle Sprecher mit einer ID größer als 10 (sechs Sprecher) werden zum Trainieren verwendet, die übrigen (vier Sprecher) zum Testen. Zur Optimierung der Komplexität wird dann eine Kreuzvalidierung verwendet. Hierbei werden für jede Komplexität im untersuchten Bereich sechs verschiedene Modelle trainiert, wobei jeweils die Daten eines Sprechers im Trainingssatz zum Validieren, die der übrigen zum Trainieren verwendet werden. Als Maß für die Güte der Klassifizierung wird der Mittelwert des Recalls (auch: Trefferquote) für jede Klasse betrachtet, d. h. des Prozentsatzes der Instanzen jeder der sieben Klassen, die korrekt klassifiziert worden sind. Dieser Wert wird manchmal auch als Unweighted Average Recall (UAR) oder Macro-Average Recall bezeichnet. Es wird diejenige Komplexität ausgewählt, für die sich gemittelt über alle sechs Permutationen der größte UAR ergibt. Schließlich wird das Modell auf dem gesamten Trainingssatz nochmals mit der ausgewählten Komplexität trainiert und auf den Testdaten evaluiert.

#!/usr/bin/python
import numpy as np
import pandas as pd
from sklearn import svm
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import recall_score
from sklearn.metrics import confusion_matrix

# Emotionen
emodb_dict = {'A':'Angst', 'E':'Ekel', 'F':'Freude', 'L':'Langeweile', 'N':'Neutral', 'T':'Trauer', 'W':'Wut'}

# Sprecher-IDs in Trainingsset
speaker_folds = [11, 12, 13, 14, 15, 16]

# Lade beide Merkmalsdateien
data_train = pd.read_csv('EmoDB_train.csv', sep=';', header=0)
data_test  = pd.read_csv('EmoDB_test.csv',  sep=';', header=0)

# Merkmale
X_train = np.float64(data_train.values[:,1:])
X_test  = np.float64(data_test.values[:,1:])

# Dateinamen
fn_train = data_train.values[:,0]
fn_test  = data_test.values[:,0]

# Extrahiere Klassenlabel und Sprecher-IDs aus den Dateinamen
y_train   = np.array([])
y_test    = np.array([])
ids_train = np.array([], dtype=np.int)

for k in range(len(fn_train)):
  y_train   = np.append( y_train, emodb_dict[ fn_train[k].replace("'","")[5] ])
  ids_train = np.append( ids_train, int(fn_train[k].replace("'","")[:2]))
for k in range(len(fn_test)):
  y_test = np.append( y_test, emodb_dict[ fn_test[k].replace("'","")[5] ])


# Skalierung (Normalisierung) der Merkmale
scaler = MinMaxScaler(feature_range=(0,1))

# Optimierung des Complexity-Parameters der SVM mittels Leave-One-Speaker-Out Cross Validation (LOSO-CV)
print('\nOptimierung der Complexity')
mean_score_UAR = np.array([])
r_exp = range(-12,-2)

for m in r_exp:
  comp = 2**m
  clf = svm.LinearSVC(C=comp, random_state=0)  # SVM mit linearem Kernel
  
  scores_UAR = np.array([])
  
  for speaker in speaker_folds:  # Jeder Sprecher in den Trainingsdaten ist einmal Test-Fold
    X_test_fold = X_train[speaker==ids_train,:]
    y_test_fold = y_train[speaker==ids_train]
    X_train_fold = X_train[speaker!=ids_train,:]
    y_train_fold = y_train[speaker!=ids_train]
    
    X_train_fold = scaler.fit_transform(X_train_fold)  # Skalierung der Merkmale
    X_test_fold  = scaler.transform(X_test_fold)
    
    clf.fit(X_train_fold, y_train_fold)  # Training der SVM
    y_pred = clf.predict(X_test_fold)
    UAR = recall_score(y_test_fold, y_pred, average='macro')  # Unweighted Average Recall
    
    scores_UAR = np.append(scores_UAR, UAR)
  
  mean_score_UAR = np.append(mean_score_UAR, scores_UAR.mean())
  print('C=2^' + str(m) + ': UAR = ' + str(round(scores_UAR.mean()*100,2)) + ' %')

# Auswahl der Complexity mit optimalem UAR
comp_opt_UAR = 2**r_exp[np.argmax(mean_score_UAR)]


# Skalierung der gesamten Training- und Testdaten
X_train = scaler.fit_transform(X_train)
X_test  = scaler.transform(X_test)

# Training einer SVM auf den gesamten Testdaten mit der optimalen Complexity
clf = svm.LinearSVC(C=comp_opt_UAR, random_state=0)
clf.fit(X_train, y_train)

# Anwendung des Modells auf die Testdaten
y_pred   = clf.predict(X_test)
UAR_test = recall_score(y_test, y_pred, average='macro')  # Unweighted Average Recall
CM = confusion_matrix(y_test, y_pred, labels=emodb_dict.values())  # Konfusionsmatrix

# Ausgabe des UAR und der Konfusionsmatrix auf den Testdaten
print('\nUAR auf den Testdaten mit optimierter Complexity: ' + str(round(UAR_test*100,2)) + ' %')
print('\nKonfusionsmatrix (Praediktionen einer Klasse in jeweiliger Spalte ):')
print(emodb_dict.values())
print(CM)

Als Ergebnis erhält man ein UAR von fast 80 Prozent auf den Sprechern der Testdaten. Bei einem Zufallsklassifikator oder einem Klassifikator, der stets dieselbe Klasse prädiziert, würde man nur ein UAR von 1 geteilt durch die Anzahl der Klassen, hier also etwa 14 Prozent erhalten. Diesbezüglich ist das Ergebnis ansehnlich, allerdings ist zu bedenken, dass die Sprecher die Emotionen gespielt haben und die akustischen Aufnahmebedingungen sehr gut sind. Die Konfusionsmatrix, die zum Ende des Skripts berechnet wird, gibt schließlich an, zwischen welchen Klassen die Verwechslung am häufigsten besteht. Die meisten Verwechslungen gibt es im Beispiel zwischen Freude und Angst bzw. Wut, allesamt Emotionen mit einem hohen Erregungsgrad (Arousal) und einer typischerweise hohen Dynamik der Lautstärke. Die verwendete SVM kann einfach durch ein anderes maschinelles Lernverfahren aus der Bibliothek scikit-learn ersetzt werden. Die Onlinedokumentation ist hierfür sehr hilfreich.

Weitere Ansätze

Schließlich können auch andere akustische Merkmale bzw. Merkmalsdarstellungen ausprobiert werden. Die beschriebenen BoAW-Merkmale können einfach mit dem Toolkit openXBOW generiert werden. Diese beruhen auf den zeitabhängigen Merkmalen, die wiederum mit openSMILE extrahiert werden können. Die Dokumentation von openXBOW im GitHub Repository bietet ein Tutorial hierfür an. Des Weiteren gibt es auch fortgeschrittene Methoden zur Erzeugung von Merkmalen mittels unüberwachter Methoden des Deep Learning. Hierfür sei das Toolkit auDeep als Beispiel genannt, dessen Merkmale bereits sehr gute Ergebnisse für verschiedenste Bereiche der Audioklassifikation, u. a. Emotionserkennung, akustische Szenenerkennung und Klassifikation von Musikgenres, erzielt haben.

Für die Klassifikation bietet scikit-learn mit dem MLPClassifier (MLP: Multi-Layer Perceptron) auch einfache neuronale Netze an. Allerdings sind für weiterführende Architekturen wie die mit LSTM spezialisierte Frameworks notwendig. Eins der populärsten Frameworks hierfür ist TensorFlow, das von Google Brain entwickelt wurde und derzeit regelmäßig erweitert wird. Die parallelisierbaren Berechnungen werden bei Verfügbarkeit einer NVIDIA-CUDA-kompatiblen Grafikkarte automatisch auf diese ausgelagert. Das tiefere Verständnis der Funktionsweise von TensorFlow nimmt normalerweise etwas Zeit in Anspruch. Um den Einstieg zu erleichtern, kann das High-Level API Keras verwendet werden, das sowohl TensorFlow als auch alternativ dazu Theano verwenden kann. Alle beschriebenen APIs sind hauptsächlich für Python geschrieben. Auch das Exportieren von trainierten Modellen auf andere Plattformen ist mit TensorFlow relativ einfach. Insbesondere für die Integration in Android eignet sich TensorFlow Lite, eine schnelle Version zum Ausführen trainierter Modelle.

Fazit

Maschinelles Lernen und Deep Learning sind derzeit in aller Munde und haben die Bereiche der Datenanalyse, der Signal- und Sprachverarbeitung, der Computer Vision und der Robotik revolutioniert. Onlinekurse zu Deep Learning werden teilweise von mehr als 100 000 registrierten Nutzern verfolgt. Auf der Onlineplattform Kaggle mit mehr als einer halben Million Nutzern finden täglich Wettbewerbe statt, bei denen Unternehmen oder Behörden Daten hochladen und teilweise hochdotierte Modellierungsaufgaben definieren. Die Funktionsweise maschineller Lernverfahren, neuronaler Netzmodelle und Kenntnisse zur Implementierung dieser sind daher eine wichtige Grundlage für Anwendungen in den verschiedensten Bereichen.

Entwickler Magazin

Entwickler Magazin abonnierenDieser Artikel ist im Entwickler Magazin erschienen.

Natürlich können Sie das Entwickler Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -