Teil 3: Verarbeitung von Audiodaten mit Kinect

Kinect hat Ohren (Teil 3)
Kommentare

Windows Developer

Der Artikel „Kinect hat Ohren“ von Tam Hanna ist erstmalig erschienen im Windows Developer 6.2012
Nach dem Initialisieren des Mikrofons und des Datenstroms müssen wir die Speech Recognition

Windows Developer

Der Artikel „Kinect hat Ohren“ von Tam Hanna ist erstmalig erschienen im Windows Developer 6.2012

Nach dem Initialisieren des Mikrofons und des Datenstroms müssen wir die Speech Recognition Engine anweisen, auf eingehende Tonsignale zu reagieren. Also legen wir als Erstes das Format der eingehenden Samples fest und starten dann die asynchrone Detektion von Sprache. Wie schon im vorigen Beispiel, erledigen wir auch diesmal das Abtragen der Engine nach dem Closing-Event des Formulars. Zusätzlich zu den schon bekannten Calls müssen wir jetzt zusätzlich die Speech Recognition Engine beenden, um das Programm komplett abzutragen:

void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
  myAudioSource.Stop();
  mySRE.RecognizeAsyncCancel();
  mySRE.RecognizeAsyncStop();
  myAudioSource.Dispose();
}
#  

Wenn die Engine ein Sprach-Sample definitiv erkennt, ruft sie die Methode SpeechRecognized auf. Ihr Handler sieht in unserem Beispiel aus wie in Listing 5.

Listing 5

void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
  String partialString="";

  if (e.Result.Confidence < 0.8)
    return;

  switch (e.Result.Text.ToLowerInvariant())
  {
    case "one":
      partialString = "1";
      break;
    case "two":
      partialString = "2";
      break;
    case "three":
      partialString = "3";
      break;
    case "four":
      partialString = "4";
      break;
    case "five":
      partialString = "5";
      break;
    case "six":
      partialString = "6";
      break;
    case "seven":
      partialString = "7";
      break;
    case "eight":
      partialString = "8";
      break;
    case "nine":
      partialString = "9";
      break;
    case "zero":
      partialString = "0";
      break;
  }

  Dispatcher.BeginInvoke(new Action(() =>
  {
    textBox1.Text = textBox1.Text + partialString;
  }), DispatcherPriority.Normal);
}  

Im Rahmen des Aufrufs der Methode SpeechRecognized übergibt das System auch ein Objekt vom Typ RecognitionResult. Dieses enthält diverse Informationen über das „erkannte“ Wort. Über die Eigenschaft Audio kann man sogar auf die Sprach-Samples zurückgreifen, um diese abzuspeichern oder von Hand auszuwerten.

In unserem Beispiel prüfen wir als Erstes, ob die Genauigkeit der Erkennung ausreichend hoch ist (Microsoft empfiehlt einen Wert größer als 0.8). Ist das Sample ausreichend genau erfasst, ermitteln wir als Nächstes den Sinn. Dazu verwenden wir die Eigenschaft text des RecognitionResult-Objekts und vergleichen den zurückgelieferten Wert mit den zum Erstellen der Grammatik verwendeten Strings. Gelingt uns ein „Match“, speichern wir das gefundene Zeichen in die Variable partialString. Zuletzt hängen wir das erkannte Zeichen an die Textbox an. Dazu müssen wir zwangsweise den Umweg über Dispatcher.BeginInvoke gehen, da die Callbacks der Speech Recognition Engine allesamt außerhalb des GUI-Threads abgearbeitet werden.

Wenn’s schnell gehen muss

Die Hypothesized-Methode wird von der SRE immer dann aufgerufen, wenn eine erste Hypothese über ein aufgenommenes Wort vorliegt. Das an sie übergebene Objekt ist dem soeben besprochenen Response-Objekt ähnlich:

void sre_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)
{
  Console.WriteLine("Speech Hypothesized: " + e.Result.Text + " " + e.Result.Confidence);
}  

Die Aufrufe dieser Methode sollte man sich am ehesten als „Preview“ auf das finale Resultat der SRE vorstellen. Es ist nämlich durchaus möglich, dass das System das Wort nach einiger weiterer Berechnung wieder verwirft. Die Verwendung von SpeechHypothesized ist also insbesondere dann sinnvoll, wenn es weniger auf Genauigkeit und mehr auf schnelle Erkennung ankommt. Sollte die SRE ein schon „hypothetisiertes“ Resultat zurückrufen wollen, wird die Methode SpeechRecognitionRejected aufgerufen. In unserem Beispiel „dumpt“ sie einige Inhalte des übergebenen Response-Objekts in die Debugger-Konsole:

Damit ist auch dieses Codebeispiel fertig und kann ausgeführt werden. Spricht man ihm englische Zahlen vor, erscheinen sie mehr oder minder zuverlässig in der Textbox am Bildschirm. In Tests des Autors war die dabei erreichte Genauigkeit relativ durchwachsen. Insbesondere beim Wort „two“ kam es regelmäßig zu (korrekten) Hypothesen, die danach aber mittels Rejected zurückgerufen wurden.

Komplexere Grammatiken

Obwohl man mit programmatisch erstellten Grammatiken durchaus beeindruckende Ergebnisse erzielen kann, werden derartige Strukturen im Laufe der Zeit lang und unhandlich. Aus diesem Grund erlaubt Microsoft auch das Laden von Grammatiken, die in einem an XML angelehnten Format für Sprachgrammatiken vorliegen. Einige Beispiele dafür finden sich im Ordner C:Program FilesMicrosoft Speech Platform SDKSamplesSample Grammars.

Fazit

Obwohl man es als Entwickler beim Betrachten von an einer XBox 360 spielenden Individuen nicht so recht glauben mag: Microsofts Kinect-Sensor hat das Potenzial, die Mensch-Maschine-Interaktion nachhaltig zu verändern.

Nachdem wir uns in den ersten beiden Teilen dieser Serie mit der spatialen Erfassung des Benutzers befasst haben, können wir nun auch auf gesprochene Eingaben reagieren.

Die dadurch erreichte Bereicherung der Interaktionsmöglichkeiten ist enorm. Setzen Sie sich einmal mit einem Interaction Designer, GUI-Designer oder notfalls einem Grafiker in einem Café zusammen – die Resultate könnten faszinierend sein.

void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
  Console.WriteLine("Speech Rejected: " + (e.Result == null ? "NULL string" : e.Result.Text + " " + e.Result.Confidence));
}  

Tam Hanna befasst sich seit der Zeit des Palm IIIc mit Programmierung und Anwendung von Handcomputern. Er entwickelt Programme für diverse Plattformen, betreibt Onlinenewsdienste zum Thema und steht unter tamhan@tamoggemon.com für Fragen, Trainings und Vorträge gern zur Verfügung.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -