Kinect

Kontextabhängiger Dialog mit Kinect

Leland Holmquest

Ich möchte Ihnen Lily vorstellen, meine Büroassistentin. Wir sprechen oft miteinander und Lily führt allgemeine Büroarbeiten nach meinen Anweisungen aus – sie sucht z. B. Informationen und arbeitet mit Microsoft Office-Dokumenten. Was aber noch wichtiger ist, Lily ist eine virtuelle Büroassistentin, eine Kinect-fähige Windows Presentation Foundation (WPF)-Anwendung. Diese Anwendung ist Teil eines Projekts, das die Möglichkeiten kontextabhängiger Dialoge und multimodaler Kommunikation in der Vordergrund rücken möchte.

Bevor wir uns mit den praktischen Aspekten des Codes meiner Anwendung befassen, die ich als Teil meiner Abschlussarbeit an der George Mason University entwickelte, erkläre ich, was unter kontextabhängigen Dialogen und multimodaler Kommunikation zu verstehen ist.

Kontextabhängiger Dialog und multimodale Kommunikation

Als menschliche Wesen verfügen wir über vielfältige Formen der Kommunikation. Betrachten Sie das folgende Szenario: Ein Baby fängt zu weinen an. Wenn das Kind bemerkt, dass seine Mutter hersieht, deutet es auf einen Keks, der am Boden liegt. Die Mutter lächelt auf eine wohlwollende, mütterliche Art, bückt sich, hebt den Keks auf und gibt ihn dem Baby zurück. Vor lauter Freude über den wiedererlangten Schatz quietscht das Baby und klatscht schnell in die Hände, bevor es gierig nach dem Keks greift.

Diese Szene beschreibt eine einfache Folge von Ereignissen. Wir wollen dies aber näher betrachten. Untersuchen Sie die verschiedenen Arten der Kommunikation, die stattgefunden haben. Stellen Sie sich vor, ein Softwaresystem zu implementieren, aus dem entweder das Baby oder die Mutter entfernt wird und die Kommunikation über das System ermöglicht wird. Sie werden schnell feststellen, wie komplex und kompliziert die Kommunikationsmethoden der beiden Beteiligten wirklich sind. Es wird Audioverarbeitung benötigt, um das Weinen des Babys, das Freudenquietschen und das Klatschen der Hände zu verstehen. Es wird eine visuelle Analyse benötigt, um die Gesten des Babys zu verstehen, das auf den Keks zeigt, und den leichten Vorwurf aus dem wohlwollenden Lächeln der Mutter abzuleiten. Bei alltäglichen Aktionen wie diesen nehmen wir häufig den Grad an Komplexität solange als selbstverständlich hin, bis wir den selben Erfahrungsgrad durch einen Computer ausdrücken müssen.

Fügen wir den Kommunikationsmethoden noch mehr Komplexität hinzu. Betrachten Sie das folgende Szenario. Sie betreten einen Raum, in dem mehrere Menschen mitten in einem Gespräch sind. Sie hören ein einzelnes Wort: „Cool‟. Die anderen im Raum warten auf Ihren Gesprächsbeitrag. Was könnten Sie beitragen? „Cool‟ kann alles Mögliche bedeuten. Die Person könnte z. B. über die Raumtemperatur gesprochen haben. Der Sprecher könnte auch Anerkennung für etwas ausgedrückt haben („dieses Auto ist cool‟). Die Person könnte auch über die Beziehung zwischen zwei Ländern gesprochen haben („die Verhandlungen kühlen sich ab‟). Ohne den Gesprächskontext hat man fast keine Möglichkeit, die Bedeutung eines Worts zum Zeitpunkt der Äußerung zu verstehen. Es muss ein bestimmtes Level an semantischem Verständnis bestehen, um die beabsichtigte Bedeutung zu verstehen. Dieses Konzept ist das Kernthema meines Artikels.

Projekt Lily

Ich habe Projekt Lily als Abschlussprojekt für CS895 erstellt: Software für kontextabhängige Multiuser-Systeme an der George Mason University, unterrichtet von Dr. João Pedro Sousa. Wie gesagt, Lily ist eine virtuelle Assistentin in einer typischen Büroumgebung. Ich habe das Kinect-Gerät und Kinect for Windows SDK Beta 2 verwendet. Kinect stellt eine Farbkamera, eine Kamera mit Tiefensensor, ein Array von vier Mikrofonen und eine komfortable API zur Erstellung natürlicher Benutzeroberflächen zur Verfügung. Es gibt auch auf der Website von Microsoft Kinect for Windows (microsoft.com/en-us/kinectforwindows) und auf Kanal 9 (bit.ly/zD15UR) eine Menge praktischer Beispiele zum Thema. Kinect bietet Entwicklern mit einem (relativ) preiswerten Paket außerordentliche Möglichkeiten. Den Beweis liefert Kinect mit dem Brechen des Guinness Weltrekords für das „sich am schnellsten verkaufende Verbrauchergerät“ (on.mash.to/hVbZOA). Die technischen Spezifikationen von Kinect (dokumentiert auf bit.ly/zZ1PN7) enthalten:

  • Farb-VGA-Bewegungskamera: 640x480 Pixel Auflösung bei 30 Frames pro Sekunde (fps)
  • Tiefenkamera: 640x480 Pixel Auflösung bei 30 fps
  • Ein Array von vier Mikrofonen
  • Sichtfeld
    • Horizontales Sichtfeld: 57 Grad
    • Vertikales Sichtfeld: 43 Grad
    • Physischer Kippbereich: ± 27 Grad
    • Tiefensensorbereich: 1,2 m - 3,5 m
  • Skeletal Tracking-System
    • Bis zu sechs Personen, einschließlich zwei aktive Beteiligte, können erfasst werden
    • 20 Gelenke pro aktivem Beteiligten können erfasst werden
  • Ein Echounterdrückungssystem, das die Spracheingabe optimiert
  • Spracherkennung

Kinect-Architektur

Microsoft bietet auch eine Erklärung der Architektur, auf der Kinect basiert, wie in Abbildung 1 gezeigt wird.

Kinect for Windows ArchitectureAbbildung 1 Architektur von Kinect for Windows

Die eingekreisten Zahlen in Abbildung 1 beziehen sich auf Folgendes:

  1. Kinect-Hardware: Die Hardwarekomponenten, einschließlich Kinect-Sensor und USB-Hub, über die der Sensor mit dem Computer verbunden ist.
  2. Microsoft Kinect-Treiber: Die Windows 7-Treiber für den Kinect-Sensor werden als Teil des Beta-SDK-Installationsprozesses installiert, wie in diesem Dokument beschrieben. Support für Microsoft Kinect-Treiber:
    • Das Mikrofonarray des Kinect-Sensors ist ein Audiogerät im Kernelmodus, auf das über die Standardaudio-APIs in Windows zugegriffen werden kann.
    • Bild- und Tiefendaten beim Streaming.
    • Gerätenummerierungsfunktionen ermöglichen der Anwendung, mehr als einen mit dem Computer verbundenen Kinect-Sensor zu verwenden.
  3. NUI API: Ein Satz APIs, die Daten von den Bildsensoren abrufen und die Kinect-Geräte steuern.
  4. KinectAudio-DMO: Das Kinect-DMO, das den Support des Mikrofonarrays in Windows 7 erweitert, sodass Beamforming und Positionsbestimmung möglich sind.
  5. Windows 7 Standard-APIs: Die Audio-, Sprach- und Medien-APIs in Windows 7, wie im Windows 7 SDK beschrieben und das Microsoft Speech SDK (Kinect for Windows SDK Beta Programming Guide).

In diesem Artikel wird die Verwendung des Mikrofonarray und der Spracherkennungsengine (SRE) zur Erstellung von kontextabhängigen Wörterverzeichnissen erläutert. Anders ausgedrückt, die Wörter, die Kinect hört, sind abhängig vom Kontext, den der Benutzer erzeugt. Ich werde ein Bezugssystem darstellen, in dem die Anwendung die Aktionen des Benutzers überwacht und die Grammar-Objekte je nach Kontext in der SRE austauscht. Auf diese Art kann der Benutzer auf natürliche und intuitive Weise mit Lily kommunizieren und muss sich keine besonderen Befehle und Verwendungsmuster merken.

Die SpeechTracker-Klasse

Für Projekt Lily wurde eine separate SpeechTracker-Klasse für die Sprachverarbeitung verwendet. Die SpeechTracker-Klasse wurde so entwickelt, dass es auf einem von der Benutzeroberfläche unabhängigen Thread ausgeführt werden kann. Dadurch erhöht sich die Reaktionszeit – ein kritischer Aspekt bei dieser Anwendung. Wozu braucht man eine Assistentin, die nie zuhört?

Bevor wir uns ins Zentrum des SpeechTracker-Objekts begeben, müssen noch ein paar Dinge bedacht werden. Als Erstes müssen die Inhalte festgelegt werden, bei denen die Anwendung zuhören muss. Lily bekommt einen „Research“-Kontext zugeordnet, der alle Aktionen, die in Zusammenhang mit dem Suchen von Daten und Informationen stehen, bearbeitet werden; einen „Office“-Kontext, der Vorgänge wie das Öffnen von Word-Dokumenten oder PowerPoint-Präsentationen sowie andere Bürovorgänge bearbeitet; einen „Operations“-Kontext, über den der Benutzer Anpassungen am Kinect-Gerät vornehmen kann; einen „General“-Kontext, der all die Kleinigkeiten bearbeitet, die kontextunabhängig auftauchen können (z. B. „Wie spät ist es?“, „Herunterfahren“ oder Feedback an das System). In meinem Beispiel wurden noch einige andere Kontexte erstellt, wobei der „Context“-Kontext recht wichtig ist. Dieser Kontext wird verwendet, um zu kommunizieren, in welchem Referenzrahmen sich Lily befinden soll. Anders ausgedrückt, der „Context“-Enumerator wird zur Bestimmung des Kontexts verwendet, in dem das System zuhören soll. Auf dieses Thema wird zu einem späteren Zeitpunkt näher eingegangen.

Jeder Kontext wird dann durch die Verwendung von Enumeratoren abgebildet, wie in Abbildung 2 zu sehen ist.

Example of ContextAbbildung 2 Kontextbeispiel

Nachdem die Kontexte abgebildet sind, muss als nächstes vermittelt werden, welchen Zweck ein Benutzer in einem definierten Kontext verfolgt. Um das zu erreichen, wurde ein Konstrukt verwendet, das einfach einen Behälter für jeden Kontext und einen Bool-Operator enthält:

struct Intention
{
  public Context context;
  public General general;
  public Research research;
  public Office office;
  public Operations kinnyops;
  public Meeting meeting;
  public Translate translate;
  public Entertain entertain;
  public bool contextOnly;
}

Der Bool-Operator ist wichtig. Wenn die „Intention“ darin besteht, nur eine Änderung des Kontexts auszuführen, dann ist „contextOnly“ „true“, sonst „false“. Der Nutzen dieser Aktion wird später noch klarer; für den Moment belassen wir es dabei, dass es ein erforderliches Kennzeichen ist.

Welche Intention verfolgt der Benutzer?

Da Projekt Lily jetzt die Möglichkeit hat, eine Intention zu kommunizieren, muss es wissen, wann welche Intention zur Laufzeit zu verwenden ist. Zu diesem Zweck wurde ein System.Collections.Generic.Dictionary<TKey, TValue>-Wörterbuch erstellt, in dem der Schlüssel ein gesprochenes Wort oder ein Ausdruck ist und der Wert die zugeordnete Intention ist. In Microsoft .NET Framework 3.0 können wir auf prägnante Weise Objekte erstellen und Eigenschaften initialisieren, wie Abbildung 3 zeigt.

The ContextPhrases Dictionary
Abbildung 3 Das ContextPhrases-Wörterbuch

In diesem besonderen Wörterbuch sind die Context-Ausdrücke definiert. Schlüssel sind die Wörter und Ausdrücke, die der Benutzer ausspricht, denen dann eine Intention zugeordnet wird. In einer einzelnen Zeile wird jede Intention deklariert und ihre Eigenschaften festgelegt. Bitte beachten Sie, dass eine einzelne Intention (z. B. „Research“) mehreren einzelnen Wörtern und Ausdrücken zugeordnet werden kann. So besteht die Möglichkeit, umfangreiche Wörterverzeichnisse zu erstellen, die die spezifische Sprache und das aktuelle Thema des Definitionsbereichs abbilden können. (Hier ist ein wichtiger Hinweis zu den ContextPhrases: Die contextOnly-Eigenschaft wird auf „true“ festgelegt. Das sagt dem System, dass diese Aktion nur dazu verwendet wird, den aktiven Kontext auszutauschen. Es versetzt das System in die Lage, die zugrundeliegende Logik der Verarbeitung von gesprochenen Ereignissen zu umgehen).

Zur besseren Veranschaulichung sehen Sie sich den Ausschnitt aus dem GeneralPhrases-Wörterbuch in Abbildung 4 an.

The GeneralPhrases Dictionary
Abbildung 4 Das GeneralPhrases-Wörterbuch

Beachten Sie, dass in mehreren Fällen dieselbe Intention durch verschiedene Ausdrücke abgebildet wird, sodass das System Dialoge mit dem Benutzer auf eine ausdrucksstarke, menschliche Art führen kann. Sie sollten auch beachten, dass die von SRE verwendeten Wörterbücher auf 300 Einträge beschränkt sind. Deshalb ist es sinnvoll, Wörtersammlungen und Grammar-Objekte sorgfältig zu gestalten. Auch ohne diese Beschränkung ist es sinnvoll, die Wörterbücher im Hinblick auf die Leistungsstärke so schlank wie möglich zu halten.

Nachdem jetzt die Wörtersammlungen den Intentionen zugeordnet sind, kann es unterhaltsamer weitergehen. Zuerst benötigt das System einen Handle für die SpeechRecognitionEngine:

ri = SpeechRecognitionEngine.InstalledRecognizers()
    .Where(r => r.Id ==  RecognizerId).FirstOrDefault();
if (ri == null)
{
  // No RecognizerInfo => bail
  return;
}
sre = new SpeechRecognitionEngine(ri.Id);

Jetzt werden die zuvor entwickelten Ausdrücke in Choices umgewandelt:

// Build our categories of Choices
var contextPhrases = new Choices();
foreach (var phrase in ContextPhrases)
  contextPhrases.Add(phrase.Key);

Dieser Vorgang wird für alle zuvor entwickelten Ausdrücke wiederholt. Die Choices werden an die Append-Methode mit einem GrammarBuilder weitergegeben. Zuletzt werden die Grammar-Objekte erstellt und in das SRE geladen. Dazu wird einfach ein neues Grammar-Objekt erstellt, das an den GrammarBuilder weitergegeben wird und die gewünschte Grammatik wie in Abbildung 5 abbildet.

Abbildung 5 Erstellen von Grammar-Objekten und Laden des Spracherkennungsmoduls

// And finally create our Grammars
gContext = new Grammar(gbContext);
gGeneral = new Grammar(gbGeneral);
gResearch = new Grammar(gbResearch);
gOffice = new Grammar(gbOffice);
gOperations = new Grammar(gbOperations);
gMeeting = new Grammar(gbMeeting);
gTranslation = new Grammar(gbTranslation);
gEntertain = new Grammar(gbEntertain);
// We're only going to load the Context and General grammars at this point
sre.LoadGrammar(gContext);
sre.LoadGrammar(gGeneral);
allDicts = new List<Dictionary<string, 
    Intention>>() { ContextPhrases,
                    GeneralPhrases,
                    ResearchPhrases,
                    OfficePhrases,
                    OperationsPhrases,
                    MeetingPhrases,
                    TranslationPhrases,
                    EntertainPhrases };

Bitte beachten Sie, das nur die beiden Grammar-Objekte gContext und gGeneral in das SRE geladen wurden, dass aber alle Grammar-Objekte einer Liste von Ausdrücken hinzugefügt wurden. Auf diese Art kann der kontextabhängige Teil des Zuhörens beeinflusst werden. Allgemeine Ausdrücke und Kontextausdrücke müssen in der SRE immer vorhanden sein, weil sie jederzeit ausgesprochen werden könnten, auch ohne vorbestimmtes Muster. Ein zusätzliches Grammar-Objekt wird jedoch immer dann geladen, wenn ein Kontextausdruck identifiziert wird. Um diesen Teil der Anwendung abzuschließen, wird das SpeechRecognized-Ereignis im SRE bearbeitet. Das SpeechRecognizedEventArgs-Argument wird verwendet, um auszuwerten, was gesprochen wurde. Wenn dem Argument eine Intention mit der Kennzeichnung „contextOnly“ zugeordnet ist, muss das System das dritte Grammar-Objekt (falls vorhanden) aus der SRE entfernen und dafür das neu definierte Grammar-Objekt laden, wie in Abbildung4 gezeigt wird. So ist die Anwendung in der Lage, dem Vokabular aus verschiedenen Wörtersammlungen und Lexika zuzuhören, je nach dem aktuell fokussierten Kontext.

Das Wörterbuch (siehe Abbildung 4) verfügt über einen Schlüssel vom Typ Zeichenfolge, der den gesprochenen Ausdruck darstellt und als Wert den Typ Intention zugeordnet hat, wodurch angezeigt wird, welche Aktionen das System ausführen soll, um den Anforderungen des Benutzers gerecht zu werden. Innerhalb jedes hinzugefügten Wörterbucheintrags befindet sich der Konstruktor für die Intention, der typischerweise aus drei Komponenten besteht: die Kontextzuordnung; ob es sich um ein den Kontext veränderndes Ereignis handelt; und (falls sich der Kontext nicht ändert), welche Aktion beabsichtigt ist.

Wenn alle Wörterbücher mit den unterstützten Ausdrücken definiert sind, werden diese Informationen der von der Kinect-Einheit bereitgestellten SRE hinzugefügt, wie in Abbildung 6 gezeigt wird.

Speech Recognition Engine
Abbildung 6 Spracherkennungsmodul (SRE)

Dies teilt dem SRE mit, auf was zu hören ist und wie die gehörten Informationen zu kennzeichnen sind. Bei dem Versuch, das System intelligenter und benutzerfreundlicher zu gestalten, wurde das System jedoch auf drei Kontexte mit den zugehörigen Ausdruckswörterbüchern limitiert, die zu jedem gegebenen Zeitpunkt im SRE geladen sein können. Die Ausdrücke der Kategorien „Context“ und „General“ werden wegen ihrer Allgemeingültigkeit immer geladen. Die dritte Kategorie von Kontext und Ausdrücken werden von der Interaktion mit dem Endbenutzer bestimmt. Während Lily der Umgebung zuhört, reagiert „sie“ auf Schlüsselwörter und Ausdrücke und entfernt im SRE einen Satz Ausdrücke und ersetzt ihn durch einen anderen. Ein Beispiel verdeutlicht dies.

Funktionsweise

Wenn Lily gestartet wird, werden ContextPhrases und GeneralPhrases in das SRE geladen. So kann das System Befehle hören, die entweder eine Kontextänderung zur Folge haben oder allgemeine Aktionen auslösen. Wenn der Benutzer z. B. nach der Initialisierung fragt: „Wie spät ist es?“, „versteht“ Lily das (die Frage ist Teil der GeneralPhrases), und antwortet mit der aktuellen Uhrzeit. Ähnlich ist es bei der Aussage des Benutzers: „Ich benötige Informationen“. Lily versteht, dass dies ein Kennzeichen zum Laden der ResearchPhrases in das SRE ist und beginnt dann, auf Intentionen zu hören, die dem „Research“-Kontext zugeordnet sind. Dadurch kann Lily drei wichtige Ziele erreichen:

  1. Lilys Leistung wird dadurch gesteigert, dass sie nur auf die minimale Anzahl von Ausdrücken hört, die relevant sein könnten.
  2. Die Verwendung von Sprache, die aufgrund unterschiedlicher Bedeutungen in verschiedenen Kontexten mehrdeutig sein kann, wird durch die exklusive Verwendung des Lexikons für den angegebenen Kontext ermöglicht.
  3. Das System soll mehrere unterschiedliche Ausdrücke hören können, aber verschiedene Ausdrücke derselben Aktion zuordnen können (z. B. „Lily, wie spät ist es?”, „Wie viel Uhr ist es?” und „Weißt du, wie spät es ist?” können alle derselben Aktion zugeordnet werden, nämlich dem Benutzer die Uhrzeit zu nennen). So wird ein potenziell umfangreiches Lexikon für kontextspezifische Dialoge mit dem System aktiviert. Durch die Zuordnung beabsichtigter Aktionen zu einem Befehl kann der Designer den Ausdruck derselben Aktion auf mehrere verschiedene, allgemeine Arten abbilden. Der Benutzer ist nicht mehr gezwungen, sich Schlüsselwörter oder Ausdrücke 1:1 zu merken. Der Benutzer ist dadurch flexibel und kann alles normal und zwanglos aussprechen. Ein Ziel der universellen Arbeit mit Computern ist, dass die Geräte in den Hintergrund treten sollen. Die Erstellung von kontextabhängigen Dialogsystemen wie Lily hilft dem Benutzer, den Computer nicht mehr so bewusst wahrzunehmen – es wird zum Assistenten und ist nicht nur eine Anwendung.

Ausgerüstet mit dem erforderlichen Wissen, kann Lily jetzt zuhören und mit Aktionen antworten, die dem Kontext entsprechen. Zum Schluss muss noch das KinectAudioSource-Objekt instanziiert und seine Parameter definiert werden. Für Projekt Lily wurde die gesamte Audioverarbeitung in die SpeechTracker-Klasse eingegliedert. Dann wird die BeginListening-Methode auf einem neuen Thread aufgerufen, der vom UI-Thread getrennt ist. Abbildung 7 zeigt diese Methode.

Abbildung 7 KinectAudioSource

private void BeginListening()
{
  kinectSource = new KinectAudioSource());
  kinectSource.SystemMode = SystemMode.OptibeamArrayOnly;
  kinectSource.FeatureMode = true;
  kinectSource.AutomaticGainControl = true;
  kinectSource.MicArrayMode = MicArrayMode.MicArrayAdaptiveBeam;
  var kinectStream = kinectSource.Start();
  sre.SetInputToAudioStream(kinectStream,
       new SpeechAudioFormatInfo(EncodingFormat.Pcm,
       16000,
       16,
       1,
       32000,
       2,
       null));
sre.RecognizeAsync(RecognizeMode.Multiple);
}

Abhängig von der zu erstellenden Anwendung können mehrere Parameter festgelegt werden. Details zu diesen Optionen erhalten Sie im Kinect for Windows SDK Programming Guide. Es muss jetzt nur noch die WPF-Anwendung bei dem SpeechTracker-SpeechDetected-Ereignis registriert werden. Das ist im Wesentlichen eine Durchleitung des SRE-SpeechRecognized-Ereignisses, verwendet aber die Intention als Teil der Ereignisargumente. Wenn das SRE eine Übereinstimmung mit einem der geladenen Kontextausdrücke findet, löst es das SpeechRecognized-Ereignis aus. Das SpeechTracker-Objekt bearbeitet das Ereignis und bewertet, ob die Intention eine Kontextänderung anzeigt. Falls dies zutrifft, veranlasst das SpeechTracker-Objekt das Entladen und Laden der passenden Grammar-Objekte und löst das SpeechContextChanged-Ereignis aus. Falls dies nicht zutrifft, löst das SpeechTracker-Objekt das Speech­Detected-Ereignis aus und erlaubt allen Elementen, die dieses Ereignis überwachen, es zu bearbeiten.

Die Confidence-Eigenschaft

Noch eine Anmerkung: Ich habe im Internet eine Bemerkung gefunden, dass die Confidence-Eigenschaft im SpeechRecognizedEventArgs-Objekt nicht zuverlässig funktioniert, und deshalb nicht verwendet werden sollte (anders als in der SDK-Dokumentation angegeben). Wenn ich diese Eigenschaft nicht verwendet habe, ist das SpeechRecognized-Ereignis fast durchweg ausgelöst worden, auch wenn nicht gesprochen worden ist. Deshalb überprüfe ich als Erstes die Confidence-Eigenschaft im SpeechRecognized-Ereignishandler. Falls die Eigenschaft nicht mindestens einen Wert von 95 Prozent hat, werden die Ergebnisse ignoriert. (Die Zahl 95 ergab sich durch Ausprobieren – ich habe keinen gültigen Wert aus Analysen gewonnen. 95 Prozent stellte für mich die Ergebnismenge dar, die ich suchte. Im SDK wird geraten, diesen Wert von Fall zu Fall zu testen und auszuwerten.) Nachdem ich so vorgegangen war, reduzierten sich die falschen Positivdiagnosen auf Null. Ich empfehle daher, Bemerkungen und Lösungen aus dem Internet sorgfältig zu überprüfen. Meiner Erfahrung nach ist die SDK-Dokumentation sehr wertvoll und korrekt. Das trifft auch für die Beispiele zu, die Microsoft auf der Website „Kinect for Windows“ bereitstellt.

Folgende Fragen werden mir häufig gestellt: Wie viel Spracherkennungstraining benötigt Kinect? Meiner Erfahrung nach wird kein Training benötigt. Nachdem der Confidence-Wert festgelegt war, hat Kinect perfekt ohne Training, Optimierung usw. funktioniert. Ich habe mich selbst als Haupttestperson zur Verfügung gestellt, aber auch meine 7 und 8 Jahre alten Töchter (danke, Anna und Lena!) mit einbezogen. Sie waren begeistert, dass sie Papas Computer sagen konnten, was er tun soll, und der Computer verstand es und reagierte darauf. Das ist eine große Ermutigung für die Töchter und sehr bereichernd für den Papa!

Erzeugung der Illusion eines menschlichen Assistenten

Durch die Möglichkeit, Kontexte auf der Basis der Umgebungsbeobachtung des Systems zu ändern, wird eine umfangreiche Interaktion zwischen dem Benutzer (Mensch) und Lily (Anwendung) erzeugt. Um die Illusion, einen Assistenten zu haben, noch zu erhöhen, habe ich viele kleine Funktionen hinzugefügt. Wir Menschen wiederholen zum Beispiel nicht unbedingt dauernd die gleichen Ausdrücke, wenn wir miteinander reden. Wenn also die Intention von „Impuls“ bearbeitet wird, sucht das System einen beliebigen Ausdruck, mit dem es dem Benutzer antwortet. In anderen Worten, wenn der Benutzer fragt: „Lily?“, antwortet Lily entweder mit „Ja“, „Ich bin hier“, „Was kann ich für dich tun“ oder ein paar anderen Ausdrücken.

Ich bin noch einen Schritt weiter gegangen. Einige Ausdrücke enthalten einen Platzhalter für den Namen des Benutzers oder die geschlechtsspezifische Anrede (Herr oder Frau). Wird einer dieser Ausdrücke zufällig ausgewählt, wird auch zufällig bestimmt, ob der Name oder die Anrede verwendet wird. Das erzeugt Dialoge, die niemals ganz gleich sind. Kleine Details wie diese erscheinen trivial und nicht der Mühe wert. Wenn Sie aber das Antwortverhalten betrachten, das der menschliche Benutzer bei seiner Interaktion mit dem System erfährt, erkennen Sie, dass die Einmaligkeit unserer Kommunikation teilweise von diesen kleinen Details herrührt. Ich glaube, Lily unterscheidet sich von anderen Programmen. Während des Testens und Debuggens musste ich manche Spezifikation oder ein Codefragment nachschlagen. Als ich mit der Suche begann, redete ich weiter mit Lily und befahl „ihr“, herunterzufahren und so weiter. Nach einer Weile fehlte mir dieses Level an „menschlicher Interaktion“, wenn Lily heruntergefahren war. Das ist das beste Zeugnis, das ich dafür ablegen kann, dass mit Kinect ein ganz neues Zeitalter der natürlichen Benutzeroberflächen beginnt.

Zur Klärung zeigt Abbildung 8 die Abfolge der benötigten Objekte, um ein System zu erstellen, das verbalen Befehlen eines Benutzers zuhört und darauf reagiert.

Creating a System that Listens and Acts on Verbal CommandsAbbildung 8 Erstellen eines Systems, das verbalen Befehlen zuhört und darauf reagiert

Im nächsten Artikel werden die Fähigkeiten des Depth Tracking und Skeleton Tracking in Kinect erläutert, und wie diese, gepaart mit den Spracherkennungsfähigkeiten, multimodale Kommunikation ermöglichen. Die Wichtigkeit des Kontexts wird innerhalb der multimodalen Kommunikationskomponente noch deutlicher. Sie erfahren, wie Körperbewegungen mit Audiobefehlen verknüpft werden können, und wie das System veranlasst werden kann, die Gesamtheit des menschlichen Kommunikationsspektrums auszuwerten.

Leland Holmquest ist bei Microsoft beschäftigt. Davor war er für das Naval Surface Warfare Center Dahlgren tätig. Er arbeitet an seiner Promotion in Informationstechnologie an der George Mason University.

Unser Dank gilt dem folgenden technischen Experten für die Durchsicht dieses Artikels: Russ Williams