Ohrenschmaus

Sie spielen in jedem besseren Hollywood-Thriller mit und auch im wirklichen Leben: Vollautomatische Abhörstationen kontrollieren jedes verdächtige Telefongespräch, sobald sie Schlüsselbegriffe erkennen. Mit Perl läßt sich Ähnliches bauen.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 9 Min.
Von
  • Stephan Grell
  • Ramon Wartala
Inhaltsverzeichnis

Für zivile Zwecke kann es nützlich sein, aufgezeichnete Telefonate, VoiceMails, Radio- und Fernsehsendungen [1] vor der Ablage in einer Datenbank zu klassifizieren. Was für textuelle Informationen bei Suchmaschinen und Verlagen mittlerweile schon zum Alltag gehört, ist bei Audiodateien aber noch nicht selbstverständlich.

Fortschritte im Bereich der automatischen Erkennung natürlicher Sprache ermöglichen es heute schon für wenig Geld [2] gängigen Textverarbeitungen zu diktieren - hinreichend schnelle Hardware vorausgesetzt. Die gleiche Technik erlaubt mit relativ einfachen Mitteln ein inhaltsbezogenes Retrieval von Audiodaten.

Ein simples Programm läßt sich mit IBMs ViaVoice98 unter Windows 9x/NT erstellen. Es benutzt eine Perl-Erweiterung, um Nachrichtensendungen thematisch zu segmentieren. Die Entscheidung fiel auf ViaVoice, da man mit seinem separat zu beziehenden SDK (siehe Kasten Quellen und Voraussetzungen) die Spracherkennungstechniken in eigene Programme integrieren kann - etwas Geduld und C/C++-Kenntnisse vorausgesetzt.

Mehr Infos

Quellen und Voraussetzungen

Für die beschriebenen Beispiele ist sowohl die neueste Version von ViaVoice (getestet mit ViaVoice98 Executive) unter Windows 9x/NT als auch das passende SDK von IBM zu installieren. Eine Linux-Version von ViaVoice ist ebenfalls erhältlich. Für eigene Experimente empfiehlt sich des weiteren ein C++-Compiler (Visual C++ 5.0 Professional und Borlands C++ Builder 3.0 kommen nach IBM-Aussagen in Betracht) und die neueste Version von SWIG. Wer nur mit dem hier beschriebenen Skript erste Versuche starten möchte, benötigt die Dateien Wrap_S2T.dll, Warp_S2T.pm, Wav2.dll und audsampl.dll, eine geeignete Perl-Distribution für Win32, eine ODBC-fähige Datenbank, das ODBC-Perl-Modul von Dave Roth sowie die eigentlichen Perl-Skripte SMiner.pl und WavSearch.pl (zu beziehen über den Heise-FTP-Server. Dort findet sich auch eine Beispiel-Datenbank mit den Segmenten einer aufgenommenen Nachrichtensendung).

Allerdings erfordert kontinuierliche Spracherkennung einige Rechenleistung. Mit den von IBM angegebenen Mindestvoraussetzungen - einem Pentium 166 MHz, 32 MB Hauptspeicher - ist nur ein erstes Experimentieren möglich. Im täglichen Einsatz empfiehlt sich neben mehr Hauptspeicher und einer schnelleren CPU vor allen Dingen eine fixe Festplatte für komfortables Arbeiten. Den Zusammenhang der einzelnen Softwarekomponenten verdeutlicht Abbildung 1.

Die von uns geschriebenen Module Wrap_S2T (PM- und DLL-Datei) und Wav2.dll stellen die Verbindung zwischen Perl und ViaVoice her. Ersteres enthält von Perl aus benutzbare Funktionen. Die Zweiteilung dieser Bibliotheken hat folgenden Hintergrund: Da Perl nur mit Hilfe von C/C++-Konstrukten Erweiterungen ermöglicht, sind Dinge aus der Windows-Welt wie Message-Queues und AFX-Makros in der Schnittstellendefinition tabu. Deshalb enthält Wrap_S2T nur die Aufrufe der eigentlichen Methoden aus Wav2.dll, die zur Laufzeit dynamisch dazugelinkt werden. Das Modul Wrap_S2T stellt die Verbindung zwischen der Bibliothek Wav2.dll und Perl her. Bei seiner Erzeugung half das in [3] beschriebene SWIG (siehe ‘Von C++ nach Perl’). Ausführliche Beschreibungen zu den Grundlagen der automatischen Klassifizierung von Audiomaterialien enthalten [5] und [6]. Der Einfachheit halber sei hier nur kurz die allgemeine Vorgehensweise erläutert. Ein selbstgestrickter Segmentierer zerlegt die Audiodatei in einzelne Teile, im weiteren Segmente genannt. In der jetzigen Version von Wav2.dll müssen die Eingangsdaten mit 22 050 Hz gesampelt sein und im PCM-Format vorliegen. Der Segmentierer interpretiert Pausen bestimmter Länge, zum Beispiel das kurze Atemholen eines Nachrichtensprechers, als Themenwechsel (thematische Segmentierung). Diese Vorgehensweise funktioniert in der Praxis erstaunlich zuverlässig. Zusätzlich zu dem hier implementierten Algorithmus in Wav2.dll gibt es Möglichkeiten, den Segmentierer für bessere Ergebnisse zu verfeinern. Durch die Wahl kürzerer Pausen wäre eine Zerlegung der Sprachdateien bis auf die Satzebene möglich. Die Segmente speichert das Modul in einzelnen WAV-Dateien. Im Anschluß versucht ViaVoice durch Spracherkennung daraus Texte zu extrahieren, die man dann in separaten Textdateien ablegen kann. Details zu Verfahren der Spracherkennung enthält der Artikel ‘HAL, hörst Du mich?’ auf Seite 127.

SMiner.pl implementiert diese Überlegungen in einem kleinen Beispiel, das mit Hilfe von Wrap_S2T.pm einzelne Themensegmente aus der Audiodatei extrahiert und sie mitsamt der Liste erkannter Wörter via ODBC in einer Datenbank ablegt. Listing 2 demonstriert die Vorgehensweise. In Zeile 9 wird das Wrap_S2T-Modul in das Perl-Skript eingebunden. Der Code ab Zeile 89 kümmert sich um das Speichern der Segmente und Wörter in der Datenbank. Anschließend können sie mit einem Perl-CGI-Skript über ein HTML-Formular aus der Datenbank extrahiert werden. Die Datenbank AudioDB enthält die beiden Tabellen SegmentTabelle und WortTabelle mit der rechts wiedergegebenen Struktur.

SEGMENTTABELLE
Feldname Typ Länge Beschreibung
Nr. Long integer Fortlaufende Nummer
URL Char 255 Verweis auf die Segmentdatei
Original-URL Char 255 URL der ursprünglichen Audiodatei
WORTTABELLE
Feldname Typ Länge Beschreibung
Nr. Long integer Nummer des Wortes
SID Long integer Nummer des Segements
Wort Char 255 Erkanntes Wort
Mehr Infos

Listing 2

...
7 use Getopt::Std;
8 use Win32::ODBC;
9 use Wrap_S2T;
10 use strict;
...
89 #
90 # Ermittle den aktuellen Datensatzzeiger in ’WortTabelle’
91 #
92 if ($audioDB->Sql("SELECT MAX(ID) FROM WortTabelle")) {
93 #
94 # Ggf. neue ’WortTabelle’ anlegen
95 #
96 if ($audioDB->Sql("CREATE TABLE WortTabelle ".
97 "(Nr long integer not null, SID long integer, " .
98 "OriginalURL character(255))")) {
99 $audioDB->DumpError();
100 exit (-1);
101 } else {
102 $wortZeiger = 1;
103 }
104 } else {
105 $audioDB->FetchRow();
106 $wortZeiger = $audioDB->Data()
107 }
...
113 for ($index = 1; $index <= $anzahlsegmente;$index++) {
114 my $counter = $index < 10 ? "_0" : "_";
115 $counter .= $index; # anhaengsel fuer dateinamen
116 $segmenturl = $baseurl . $counter;
117 #
118 # segmente in ’segmenttabelle’ schreiben
119 #
120 $sqlstat = "INSERT INTO SegmentTabelle VALUES (".
121 "$index, ’$segmentURL’,’$wavURL’)";
122 $audiodb->Sql($sqlstat);
123 #
124 # Woerter aus erzeugter Textdatei in ’Worttabelle’ schreiben
125 #
126 $textDatei = $text . $counter . ".txt";
127
128 open(DATEI,$textDatei) or abort("Kann $textDatei nicht oeffnen!");
129 while () {
130 $zeile .= $_;
131 }
132 #
133 # Vorsicht! Zwischen den Woertern steht \0 und nicht ’ ’
134 #
135 @alleWoerter = split "\0",$zeile;
...
138 foreach $wort (@alleWoerter) {
139 #
140 # Fuege jedes Wort in ’WortTabelle’ ein
141 #
142 $sqlstat = "INSERT INTO WortTabelle VALUES (" .
143 "$wortZeiger , $index,’$wort ’)";
144 $audioDB->Sql($sqlstat);
145 $wortZeiger++;
146 print ".";
147 }
148 close DATEI;
149 }
...

Da nicht jede Datenbank BLOBs (Binary Large Objects) speichern kann, enthält WortTabelle alle Wörter einzeln; SID verweist auf die Nummer des jeweiligen Segments in SegmentTabelle.

Für die Verbindung zu ViaVoice sorgen die Funktionen SmOpen() und SmConnect() in der Bibliothek Wav2.dll. Sie wird beim Einbinden des Pakets mit use Wrap_S2T in Perl dynamisch in den Speicher geladen. Beide Funktionen erwarten ein Window-Handle, mit dem ViaVoice das Programm über den aktuellen Stand und die erzeugten Texte informieren kann. Aus diesem Grund muß Wav2.dll ein eigenes Fenster öffnen. Anschließend lädt es das Vokabular, das ViaVoice dem Einsatzort anpaßt. Zur Auswahl stehen spezialisierte Diktiervokabulare (zum Beispiel für Ärzte oder Rechtsanwälte) oder Befehlssätze zum Steuern von Oberfläche und ViaVoice. Wurde beim Laden von ViaVoice eine sprachverarbeitende Bibliothek übergeben (hier audsample.dll), akzeptiert ViaVoice WAV-Dateien. Wer andere Audioformate nutzen will, muß sie dem Programm mit Hilfe eigener Bibliotheken zugänglich machen. Eine genaue Beschreibung der Vorgehensweise findet sich im ViaVoice-SDK.

ViaVoice Trefferquote läßt sich mit drei Methoden verbessern. Am Anfang steht sicher immer das Training auf die eigene Stimme durch Vorlesen vorgegebener Sätze. Nach dieser Anpassung folgen tägliche Übungen. Immer wenn der Benutzer das Programm bei der Erkennung von Text korrigiert, lernt es dazu und paßt sich dadurch der Aussprache des Sprechers an. Dies ist beim Erkennen von Nachrichtensendungen nicht möglich. Hier hilft es nichts, ViaVoice auf die eigene Stimme zu trainieren, schlimmer noch, es könnte sogar schaden. Für solche Fälle sind nur mit der Vokabularerweiterung Verbesserungen zu erzielen. Diese analysiert vorgegebene Texte und ergänzt das Vokabular um die unbekannten Wörter. Solche, die nicht aus den vorhandenen abzuleiten sind, muß man mindestens einmal vorsprechen. Als zweites analysiert ViaVoice den Aufbau der Texte und paßt die internen Muster entsprechend an.

Professionelle Systeme, wie das unter http://www.de.ibm.com/service/wt/logik.html zu findende, bedienen sich neben den hier vorgestellten einfachen Methoden weiterer Tricks, um zum Beispiel die gefundenen Wörter in ihre Stammformen zu überführen (linguistische Analyse). Dazu dienen große Lexika. Heutzutage (er)findet man gleich auch noch die passenden Begriffe, um eine neue Entwicklung ins rechte Marketinglicht zu rücken. Deshalb heißt diese neue Technik der Audiosegmentierung ‘SpeechMining’ - nach DataMining und TextMining.

STEPHAN GRELL
studiert Medizinische Informatik an der Universität Heidelberg/Fachhochschule Heilbronn und hat sich während seiner Studienarbeit bei IBM mit dem Thema SpeechMining beschäftigt.

RAMON WARTALA
studiert Medizinische Informatik an der Fachhochschule Dortmund.

[1] Frank Fremerey; Der digitale Sender; Hörfunk und Fernsehen aus dem Computer; c’t 4/99, S. 98 ff.

[2] Ulrike Kuhlmann; Wie bitte?; Vier Diktiersysteme im Vergleich; c’t 3/99, S. 124 ff.

[3] Sriram Srinivasan; Advanced Perl Programming; Foundations and Techniques for Perl Application Developers; O’Reilly & Associates Inc. 1997; S. 290 ff.

[4] Andreas Geissel; Perl-Know-how; Durch die Hintertür; C und C++ von Perl aus nutzen

[5] Stephan Grell; Automatische Indexierung von Audiodateien; Studienarbeit im Studiengang Medizinische Informatik der Universität Heidelberg/Fachhochschule Heilbronn

[6] Michael J. Witbrock, Alexander G. Hauptmann; Speech Recognition and information retrieval: experiments in retrieving spoken documents