Windows Phone

Aktivieren der Sprachfunktion einer Windows Phone 8-App mit Sprachbefehlen

F. Avery Bishop

Neulich abends kam ich zu spät aus dem Büro, um pünktlich zu einem Treffen mit einem alten Freund zu kommen. Ich wusste, dass er bereits im Auto saß und zu unserem Treffpunkt fuhr, also konnte ich ihn nicht mehr anrufen. Als ich aus meinem Büro stürzte und zu meinem Auto lief, griff ich trotzdem nach meinem Windows Phone und drückte die Starttaste. Als ich das Spracheingabesignal des „Earcons“ hörte, sagte ich: „Text Robert Brown“, und beim Start der Text-App sagte ich: „Komme später, verlasse gerade das Büro“. Danach sagte ich: „Senden“, um die Textnachricht zu senden.

Ohne die Spracheingabe-Features in der Text-App hätte ich nie angehalten, um frustriert rumzufummeln und eine Textnachricht zu versenden, denn ich kann die Tastatur mit meinen dicken Fingern nur schwer bedienen. Auch kann ich beim Laufen nicht richtig am Bildschirm lesen. Durch die Spracheingabefunktion habe ich Zeit, Frustration und einen nicht unerheblichen Teil schlechten Gewissens gespart.

Windows Phone 8 bietet diese Spracheingabe-Features für Entwickler, damit diese mit den Benutzern über die Spracherkennung und die Übersetzung von Text in Sprache interagieren können. Diese Features unterstützen die beiden in meinem Beispiel beschriebenen Szenarios: Der Benutzer kann von einer beliebigen Stelle auf dem Telefon aus einen Befehl sprechen, um eine App zu starten, und mit nur einer einzigen Ansage eine Aktion ausführen. Sobald die App gestartet ist, führt das Telefon einen Dialog mit dem Benutzer, indem es Befehle oder Text durch die gesprochenen Ansagen des Benutzers erfasst und den Text hörbar als Benachrichtigung oder Rückmeldung für den Benutzer ausgibt.

Das erste Szenario wird durch ein Feature namens Sprachbefehle unterstützt. Zur Aktivierung dieses Features stellt die App eine VCD-Datei (Voice Command Definition) bereit, in der eine Reihe von Befehlen angegeben ist, die die App bearbeiten kann. Wenn die App durch Sprachbefehle gestartet wird, erhält sie Parameter in einer Suchzeichenfolge (z. B. der Befehlsname, Parameternamen und der erkannte Text), die sie verwenden kann, um den vom Benutzer angegebenen Befehl auszuführen. Im ersten Teil eines zweiteiligen Artikels wird erläutert, wie Sprachbefehle in Ihrer App auf dem Windows Phone 8 aktiviert werden.

Im zweiten Teil wird der Sprachdialog innerhalb der App erläutert. Zur Unterstützung dieser Funktion bietet Windows Phone 8 eine API für die Spracherkennung und -synthese. Diese API enthält eine Standard-Benutzeroberfläche für die Bestätigung und Disambiguierung sowie Standardwerte für Sprachgrammatik, Zeitüberschreitungen und weitere Eigenschaften, mit denen Spracherkennung mit nur wenigen Codezeilen zu einer App hinzugefügt werden kann. Desgleichen ist die API für die Sprachsynthese (auch Übersetzung von Text in Sprache genannt) für unkomplizierte Szenarios einfach zu codieren. Sie bietet ebenfalls erweiterte Features, wie die individuell angepasste Manipulation über die Markup-Sprache für Sprachsynthese des World Wide Web Consortium (SSML) und durch Umschalten zwischen den Sprachen der Benutzer, die bereits auf dem Telefon sind oder vom Markt heruntergeladen werden. Bleiben Sie am Ball, und lesen Sie im folgenden Artikel eine genaue Erläuterung dieses Features.

Zur Demonstration dieser Features habe ich eine einfache App mit dem Namen Magic Memo entwickelt. Sie können Magic Memo starten und einen Befehl ausführen, indem Sie die Taste „Start“ gedrückt halten und dann bei Aufforderung einen Befehl sprechen. In der App können Sie Ihre Notiz durch einfaches Diktieren oder durch Navigieren durch die App und Befehlsausführung durch Sprache eingeben. In diesem Artikel erläutere ich den Quellcode, mit dem diese Features implementiert werden.

Anforderungen für die Verwendung von Sprach-Features in Apps

Die App „Magic Memo“ sollte ohne besondere Konfiguration funktionieren, wenn Ihre Entwicklungsumgebung die Hardware- und Softwareanforderungen für die Entwicklung von Windows Phone 8-Apps erfüllt und ein Test auf einem Telefonemulator durchgeführt wird. Bei Drucklegung dieses Artikels galten folgende Anforderungen:

  • 64-Bit-Version von Windows 8 Pro oder höher
  • Mind. 4 GB RAM
  • Second Level-Adressübersetzung wird vom BIOS unterstützt
  • Hyper-V ist installiert und wird ausgeführt
  • Visual Studio 2012 Express für Windows Phone oder höher

Wie immer sollten Sie in der MSDN-Dokumentation die aktuellen Anforderungen nachlesen, bevor Sie versuchen, eine App zu entwickeln oder auszuführen.

Drei weitere Aspekte sollten Sie beachten, wenn Sie Ihre eigene App neu entwickeln:

  1. Stellen Sie sicher, dass das Mikrofon und der Lautsprecher des Geräts ordnungsgemäß funktionieren.
  2. Fügen Sie die Funktionen für die Spracherkennung und das Mikrofon in der Datei „WpAppManifest.xml“ hinzu. Entweder aktivieren Sie dazu die entsprechenden Felder im Eigenschaften-Editor oder fügen Folgendes manuell in der XML-Datei ein:
<Capability Name="ID_CAP_SPEECH_RECOGNITION"/>
<Capability Name="ID_CAP_MICROPHONE"/>
  1. Beim Test der Spracherkennung müssen Sie die Ausnahme erfassen, die ausgegeben wird, wenn der Benutzer die Datenschutzerklärung für die Spracherkennung nicht angenommen hat. Ein Beispiel dazu finden Sie in der Hilfsfunktion „GetNewMemoByVoice“ in der Datei „MainPage.xaml.cs“ im beigefügten Beispielcode zum Herunterladen.

Das Szenario

Auf jedem Smartphone ist es ein gewöhnliches Szenario, eine App zu starten und einen einzigen Befehl auszuführen, dem optional weitere Befehle folgen. Wenn dies manuell ausgeführt wird, sind dazu mehrere Schritte erforderlich: Suchen der App, Navigieren an die richtige Stelle, Suchen der Schaltfläche oder des Menüpunkts, Tippen auf die Schaltfläche usw. Für viele Benutzer ist dies frustrierend, selbst wenn Sie sich an die Schritte gewöhnt haben.

Wenn der Benutzer z. B. eine gespeicherte Notiz wie „Notiz Nr. 12“ in der Beispiel-App „Magic Memo“ anzeigen möchte, muss er die App suchen und starten, auf „Gespeicherte Notizen anzeigen“ tippen und herunterblättern, bis die gewünschte Notiz angezeigt wird. Im Gegensatz dazu muss auf dem Windows Phone 8 folgendes Sprachbefehls-Feature ausgeführt werden: Der Benutzer hält die Taste „Start“ gedrückt und sagt: „Magic Memo, Notiz 12 anzeigen“. Danach wird die App „Magic Memo“ gestartet und die gewünschte Notiz wird in einem Meldungsfeld angezeigt. Selbst für diesem einfachen Befehl sind deutlich weniger Benutzerinteraktionen erforderlich.

Die Implementierung von Sprachbefehlen in einer App erfolgt in drei Schritten. In weiteren optionalen vier Schritten wird dynamischer Inhalt behandelt. In den folgenden Abschnitten werden die oben genannten Schritte erläutert.

Angeben der Benutzerbefehle für die Spracherkennung

Der erste Schritt für die Implementierung von Sprachbefehlen besteht darin, die Befehle, auf die gehört werden soll, in einer VCD-Datei anzugeben. Eine VCD-Datei wird in einfachem XML-Format geschrieben und besteht aus einer Reihe von CommandSet-Elementen, von denen jedes ein untergeordnetes Command-Element hat, das den Ausdruck enthält, auf den gehört werden soll. Ein Beispiel aus der App „Magic Memo“ ist in Abbildung 1 dargestellt.

Abbildung 1: Definitionsdatei für Sprachbefehle in der App „Magic Memo“

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="https://schemas.microsoft.com/voicecommands/1.0">
  <CommandSet xml:lang="en-us" Name="MagicMemoEnu">
    <!-- Command set for all US English commands-->
    <CommandPrefix>Magic Memo</CommandPrefix>
    <Example>enter a new memo</Example>

    <Command Name="newMemo">
      <Example>enter a new memo</Example>
      <ListenFor>Enter [a] [new] memo</ListenFor>
      <ListenFor>Make [a] [new] memo</ListenFor>
      <ListenFor>Start [a] [new] memo</ListenFor>
      <Feedback>Entering a new memo</Feedback>
      <Navigate />    <!-- Navigation defaults to Main page -->
    </Command>

    <Command Name="showOne">
      <Example>show memo number two</Example>
      <ListenFor>show [me] memo [number] {num} </ListenFor>
      <ListenFor>display memo [number] {num}</ListenFor>
      <Feedback>Showing memo number {num}</Feedback>
      <Navigate Target="/ViewMemos.xaml"/>
    </Command>

    <PhraseList Label="num">
      <Item> 1 </Item>
      <Item> 2 </Item>
      <Item> 3 </Item>
    </PhraseList>
  </CommandSet>

  <CommandSet xml:lang="ja-JP" Name="MagicMemoJa">
    <!-- Command set for all Japanese commands -->
    <CommandPrefix>マジック・メモ</CommandPrefix>
    <Example>新規メモ</Example>

    <Command Name="newMemo">
      <Example>新規メモ</Example>
      <ListenFor>新規メモ[を]</ListenFor>
      <ListenFor>新しいメモ</ListenFor>
      <Feedback>メモを言ってください</Feedback>
      <Navigate/>
    </Command>

    <Command Name="showOne">
      <Example>メモ1を表示</Example>
      <ListenFor>メモ{num}を表示[してください] </ListenFor>
      <Feedback>メモ{num}を表示します。 </Feedback>
      <Navigate Target="/ViewMemos.xaml"/>
    </Command>

    <PhraseList Label="num">
      <Item> 1 </Item>
      <Item> 2 </Item>
      <Item> 3 </Item>
    </PhraseList>
</CommandSet>
</VoiceCommands>

Im Folgenden sind die Richtlinien für den Entwurf einer VCD-Datei aufgeführt:

  1. Das Präfix des Befehls muss sich von den Schlüsselwörtern für Windows Phone unterscheiden. Damit vermeiden Sie, das die App den Befehl mit einem im Telefon integrierten Feature verwechselt. In amerikanischem Englisch lauten die Schlüsselwörter „call“, „dial“, „start“, „open“, „find“, „search“, „text“, „note“ und „help“.
  2. Nehmen Sie als Präfix für den Befehl eine Untergruppe oder eine natürliche Aussprache des App-Namens, und vermeiden Sie eine vollständig unterschiedliche Bezeichnung. Damit vermeiden Sie, dass der Benutzer Befehle verwechselt, und reduzieren das Risiko, dass die App fälschlicherweise eine andere App oder andere Features erkennt.
  3. Beachten Sie, dass für die Spracherkennung eine exakte Übereinstimmung mit dem Suffix des Befehls vorliegen muss. Aus diesem Grund ist es vorteilhaft, wenn das Präfix des Befehls einfach und leicht zu merken ist.
  4. Geben Sie jedem Befehlssatz ein Name-Attribut, damit Sie in Ihrem Code darauf zugreifen können.
  5. Achten Sie darauf, dass ListenFor-Elemente sich in Command-Elementen phonetisch voneinander unterscheiden, um das Risiko einer Fehlerkennung zu vermeiden.
  6. Stellen Sie sicher, dass ListenFor-Elemente in ein und demselben Befehl unterschiedliche Möglichkeiten sind, denselben Befehl anzugeben. Wenn ListenFor-Elemente in einem Befehl mehreren Aktionen entsprechen, müssen Sie sie in einzelne Befehle trennen. Tipps zur Vereinfachung der Behandlung von Befehlen in einer App.
  7. Denken Sie an folgende Einschränkungen: 100 Command-Elemente in einem Befehlssatz, 10 ListenFor-Einträge in einem Befehl, insgesamt 50 PhraseList-Elemente und insgesamt 2.000 PhraseList-Elemente in allen PhraseLists.
  8. Beachten Sie, dass für die Spracherkennung in PhraseList-Elementen eine exakte Übereinstimmung erforderlich ist und keine Untergruppe. Daher müssen Sie z. B. für die Erkennung von „Star Wars“ und „Star Wars Episode Eins“ beide Ausdrücke als PhraseList-Elemente einfügen.

In meinem Beispiel gibt es zwei CommandSet-Elemente, die unterschiedliche xml:lang- und Name-Attribute haben. Es darf nur ein CommandSet pro xml:lang-Wert vorhanden sein. Die Name-Attribute müssen ebenfalls eindeutig sein, sind jedoch nur durch die Wertangabe des Name-Attributs eingeschränkt. Optional wird jedoch dringend empfohlen, dass Sie ein Name-Attribute einfügen, da Sie es benötigen, um vom App-Code aus auf den CommandSet zuzugreifen, um Schritt 4 zu implementieren. Beachten Sie ebenfalls, dass nur ein CommandSet-Element gleichzeitig für die App aktiv ist, nämlich dasjenige, dessen xml:lang-Attribute genau mit dem Attribut des aktuellen globalen Spracherkennungs-Features übereinstimmt, das vom Benutzer in „SETTINGS/speech“ festgelegt wurde. Sie müssen CommandSets für alle Sprachen festlegen, die für die Benutzer in den jeweiligen Märkten erforderlich sein könnten.

Als Nächstes betrachten wird das CommandPrefix-Element. Stellen Sie sich dieses Element wie einen Alias vor, den der Benutzer aussprechen kann, um die App aufzurufen. Dies ist hilfreich, wenn der App-Name keine Standardrechtschreibung oder schwer aussprechbare Zeichen enthält wie z. B. Mag1c“ oder „gr00ve“. Beachten Sie, dass dieses Wort oder dieser Ausdruck so formuliert sein muss, dass die Spracherkennungs-Engine es erkennen kann. Außerdem muss es sich phonetisch von den im Windows Phone integrierten Schlüsselwörtern unterscheiden.

Wie Sie erkennen können, gibt es Beispiel-Elemente als untergeordnete Elemente des CommandSet-Elements und des Command-Elements. Das Beispiel unter CommandSet ist ein allgemeines Beispiel für die App, das auf dem Bildschirm der Systemhilfe „Was kann ich sagen?“ angezeigt wird (siehe Abbildungen Abbildung 2. Im Gegensatz dazu ist das Beispiel-Element unter einem Befehl auch für diesen Befehl spezifisch. Dieses Beispiel-Element wird auf einer Seite der Systemhilfe angezeigt (siehe Abbildung 3), die angezeigt wird, wenn der Benutzer auf der in Abbildung2 dargestellten Hilfeseite auf den App-Namen tippt.

Help Page Showing Voice Command Examples for Installed Apps
Abbildung 2: Hilfeseite mit Beispielen für den Sprachbefehl für installierte Apps

Example Page for Magic Memo Voice Commands
Abbildung 3: Beispielseite für die Sprachbefehle in Magic Memo

Außerdem entspricht jedes untergeordnete Command-Element mit einem CommandSet einer Aktion, die in der App ausgeführt werden soll, sobald die App gestartet wurde. In einem Befehl können mehrere ListenFor-Elemente vorhanden sein. Diese müssen jedoch immer unterschiedliche Möglichkeiten sein, mit denen der App mitgeteilt wird, die Aktion (den Befehl) auszuführen, der sie untergeordnet sind.

Beachten Sie auch, dass der Text in einem ListenFor-Element zwei spezielle Konstrukte hat. Eckige Klammern um den Text bedeuten, dass der Text optional ist. Das heißt, dass die Ansage des Benutzers mit oder ohne den eingeschlossenen Text erkannt werden kann. Geschwungene Klammern enthalten eine Bezeichnung, die sich auf ein PhraseList-Element bezieht. In dem Beispiel für amerikanisches Englisch in Abbildung 1 hat das erste ListenFor-Element unter dem „showOne“-Befehl die Bezeichnung „{num}“ und bezieht sich auf die Ausdrucksliste darunter. Stellen Sie sich dies vor, wie einen Schlitz, der mit einem der Ausdrücke, auf die in der Liste verwiesen wird, gefüllt wird. In diesem Fall sind es Zahlen.

Was geschieht, wenn ein Befehl in der Ansage des Benutzers erkannt wird? Das globale Spracherkennungs-Feature des Telefons startet die App auf der Seite, die vom Target-Attribut des Navigate-Elements unter dem entsprechenden Befehl angegeben ist, wie später in Schritt 3 erläutert wird. Zunächst werde ich jedoch Schritt 2 erklären.

Aktivieren von Sprachbefehlen

Wenn Sie die VCD-Datei in das Installationspaket eingefügt haben, müssen Sie die Datei in Schritt 2 registrieren, damit Windows Phone 8 die Befehle der App in der Systemgrammatik einfügen kann. Dazu rufen Sie eine statische Methode „InstallCommandSetsFromFileAsync“ auf der VoiceCommandService-Klasse auf (siehe Abbildung 4). Die meisten Apps führen bei der ersten Ausführung einen eigenen Aufruf durch, er kann jedoch natürlich jederzeit durchgeführt werden. Die Implementierung von VoiceCommandService ist so intelligent, dass sie bei nachfolgenden Aufrufen keine Aktion ausführt, wenn keine Änderung an der Datei vorgenommen wurde. Es ist also normal, dass die Klasse bei jedem Start der App aufgerufen wird.

Abbildung 4: Initialisierung der VCD-Datei aus der laufenden App heraus.

using Windows.Phone.Speech.VoiceCommands;
// ...
// Standard boilerplate method in the App class in App.xaml.cs
private async void Application_Launching(object sender, 
  LaunchingEventArgs e)
{
  try // try block recommended to detect compilation errors in VCD file
  {
    await VoiceCommandService.InstallCommandSetsFromFileAsync(
      new Uri("ms-appx:///MagicMemoVCD.xml"));
  }
  catch (Exception ex)
  {
    // Handle exception
  }
}

Wie der Name der Methode „InstallCommandSetsFromFileAsync“ bereits zeigt, ist die Betriebseinheit in der VCD-Datei ein CommandSet-Element und nicht die Datei selbst. Durch den Aufruf dieser Methode werden alle Befehlssätze in der Datei überprüft und validiert. Es wird aber nur der Befehlssatz installiert, dessen xml:lang-Attribut exakt mit dem entsprechenden Attribut der globalen Sprach-Engine übereineinstimmt. Wenn der Benutzer die Erkennungssprache auf eine Sprache umschaltet, die dem xml:lang-Attribut eines anderen CommandSets in der VCD-Datei entspricht, wird dieser CommandSet geladen und aktiviert.

Umgang mit Sprachbefehlen

Ich komme nun zu Schritt 3. Wenn das globale Spracherkennungs-Feature das Befehlspräfix und einen Befehl von der App erkennt, wird die App auf der Seite gestartet, die im Target-Attribut des Navigate-Elements angegeben ist. Wenn kein Ziel angegeben ist, wird das Standardaufgabenziel (normalerweise MainPage.xaml bei Silverlight-Apps) verwendet. Dies hängt auch von den Schlüssel/Wert-Paaren der Abfragezeichenfolge für den Befehlsnamens- und den PhraseList-Wert ab. Wenn der erkannte Ausdruck z. B. „Magic Memo Notiz Drei anzeigen“ lautet, sieht die Abfragezeichenfolge in etwa wie folgt aus (die tatsächliche Zeichenfolge kann je nach Implementierung oder Version unterschiedlich sein):

"/ViewMemos.xaml?voiceCommandName=show&num=3&reco=show%20memo%20number%20three"

Sie müssen die Abfragezeichenfolge erfreulicherweise nicht parsen und die Parameter selbst herausfinden, da sie in der QueryString-Sammlung des NavigationContext-Objekts verfügbar sind. Die App kann aufgrund dieser Daten bestimmen, ob sie durch einen Sprachbefehl gestartet wurde. Ist dies der Fall kann sie den Befehl entsprechend behandeln (z. B. im Handler „Loaded“ der Seite). In Abbildung 5 ist ein Beispiel für die Seite „ViewMemos.xaml“ der App „Magic Memo“ dargestellt.

Abbildung 5: Umgang mit Sprachbefehlen in einer App

// Takes appropriate action if the application was launched by voice command.
private void ViewMemosPage_Loaded(object sender, RoutedEventArgs e)
{
  // Other code omitted
  // Handle the case where the page was launched by Voice Command
  if (this.NavigationContext.QueryString != null
    && this.NavigationContext.QueryString.ContainsKey("voiceCommandName"))
  {
    // Page was launched by Voice Command
    string commandName =
      NavigationContext.QueryString["voiceCommandName"];
    string spokenNumber = "";
    if (commandName == "showOne" &&
      this.NavigationContext.QueryString.TryGetValue("num", 
        out spokenNumber))
    {
      // Command was "Show memo number 'num'"
      int index = -1;
      if (int.TryParse(spokenNumber, out index) &&
        index <= memoList.Count && index > 0)
      { // Display the specified memo
        this.Dispatcher.BeginInvoke(delegate
          { MessageBox.Show(String.Format(
          "Memo {0}: \"{1}\"", index, memoList[index - 1])); });
      }
    }
    // Note: no need for an "else" block because if launched by another VoiceCommand
    // then commandName="showAll" and page is shown
  }
}

Da es nur eine Möglichkeit gibt, zu einer beliebige Seite zu navigieren, prüft der Code in Abbildung 5 zuerst, ob der voiceCommandName-Schlüssel in der Abfragezeichenfolge vorhanden ist, um festzulegen, ob der Benutzer die App durch einen Sprachbefehl gestartet hat. Ist dies der Fall, wird der Befehlsname geprüft und der Wert des PhraseList-Parameters „num“ abgerufen, der die Nummer der Notiz angibt, die der Benutzer anzeigen möchte. Diese Seite enthält nur zwei Sprachbefehle, und die Verarbeitung ist einfach. Auf einer Seite, die durch viele Sprachbefehle gestartet werden kann, würde eine Art Schalterblock für CommandName verwendet werden, damit entschieden werden kann, welche Aktion ausgeführt werden soll.

Das PhraseList-Element in diesem Beispiel ist ebenfalls einfach. Es besteht nur aus einer Reihe von Zahlen, die jeweils eine gespeicherte Notiz darstellen. Sie können sich auch ausgereiftere Szenarios vorstellen, für die Ausdruckslisten erforderlich sind, die dynamisch ausgefüllt werden, wie z. B. mit Daten einer Website. Der oben bereits erwähnte optionale Schritt 4 besteht in der Implementierung von PhraseLists für diese Szenarios. Ich werde diesen Schritt als Nächstes erläutern.

Aktualisieren von Ausdruckslisten von der App aus

Vielleicht haben Sie ein Problem in der VCD-Datei in Abbildung 1 bemerkt: Die PhraseList „num“, die in der VCD-Datei statisch definiert ist, unterstützt die Erkennung von bis zu drei Elementen, doch irgendwann sind sehr wahrscheinlich einmal viel mehr Notizen im isolierten Speicher der App gespeichert. In Anwendungsfällen, in denen sich die Ausdrucksliste im Laufe der Zeit ändert, kann die Ausdrucksliste dynamisch von der laufenden App aus aktualisiert werden (siehe Abbildung 6). Dies ist besonders für Apps hilfreich, die die Erkennung auf der Grundlage einer dynamischen Liste, wie z. B. heruntergeladener Videos, Lieblingsrestaurants oder interessanter Ziele in der Nähe des aktuellen Standorts des Telefons, durchführen muss.

Abbildung 6: Installierte Ausdrucksliste dynamisch aktualisieren

// Updates the "num" PhraseList to have the same number of
// entries as the number of saved memos; this supports
// "Magic Memo show memo 5" if there are five or more memos saved
private async void UpdateNumberPhraseList(string phraseList,
  int newLimit, string commandSetName)
{
  // Helper function that sets string array to {"1", "2", etc.}
  List<string> positiveIntegers =
    Utilities.GetStringListOfPositiveIntegers(Math.Max(1, newLimit));
  try
  {
    VoiceCommandSet vcs = null;
    if (VoiceCommandService.InstalledCommandSets.TryGetValue(
      commandSetName, out vcs))
    {
      // Update "num" phrase list to the new numbers
      await vcs.UpdatePhraseListAsync(phraseList, positiveIntegers);
    }
  }
  catch (Exception ex)
  {
    this.Dispatcher.BeginInvoke(delegate
      { MessageBox.Show("Exception in UpdateNumberPhraseList " 
        + ex.Message); }
    );
  }
}

Obwohl dies in der App „Magic Memo“ nicht gezeigt wird, eignen sich dynamisch aktualisierte Ausdruckslisten perfekt für eine Aktualisierung in einem Benutzer-Agent, da die Aktualisierung im Hintergrund ablaufen kann, selbst wenn die App nicht ausgeführt wird.

Und dies ist die Lösung: Vier Schritte zur Aktualisierung von Sprachbefehlen in der App. Probieren Sie es mit der Beispiel-App „Magic Memo“ aus. Beachten Sie, dass Sie die App einmal normal ausführen müssen, damit die VCD-Datei geladen wird. Danach können Sie Ansagen wie die folgenden sprechen, um die App zu starten und direkt auf die Seite zu gelangen und den Befehl auszuführen:

  • Magic Memo, neue Notiz eingeben
  • Magic Memo, alle Notizen anzeigen
  • Magic Memo, Notiz vier anzeigen

Ausblick: Dialog innerhalb der App

In diesem Artikel habe ich die Implementierung von Sprachbefehlen als ersten Schritt erläutert, mit dem die Benutzer die Möglichkeit erhalten, auf Windows Phone 8 mit der App zu interagieren, wie sie es von integrierten Apps wie Textnachrichten, Suchen und Anrufen kennen.

Der zweite Schritt besteht nun darin, einen Dialog innerhalb der App bereitzustellen, in dem der Benutzer mit der gestarteten App spricht, um Text aufzuzeichnen oder Befehle auszuführen, und eine auditive Rückmeldung, wie gesprochenen Text, erhält. In Teil 2 werde ich dieses Thema weiter vertiefen. Bleiben Sie also dabei!

F. Avery Bishop arbeitet seit mehr als 20 Jahren in der Softwareentwicklung. Seit 12 Jahren ist er Programm-Manager für Sprachplattformen bei Microsoft. Er hat zahlreiche Artikel zur Unterstützung natürlicher Sprachen in Anwendungen veröffentlicht und Themen wie die Unterstützung komplexer Skripts, mehrsprachige Anwendungen und Spracherkennung behandelt.

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Robert Brown, Victor Chang, Jay Waltmunson und Travis Wilson