Cortanaからアプリをフォアグラウンド起動する – VoiceCommandDefinitionManager

Cortanaからアプリの操作

UWPではCortanaに事前に音声コマンド定義ファイル(VoiceCommandDefinition)を登録しておくことによってCortanaに特定の言葉を発話させたときにアプリを起動させることができます。

CortanaからUWP起動はフォアグラウンド起動とバックグラウンド起動の2つのパターンがありますが今回はフォアグラウンド起動のパターンです。

VoiceCommandDefinitionファイルを作る

VoiceCommandDefinitionファイルはここ

https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/dn706593.aspx

の定義に従って作ります。

  • CommandSet – 言語(ja-JP)単位で作ります。多言語対応する場合は複数作成
  • CommandPrefix – 認識したい言葉の前に必ずつけます
  • Example – 発話例
  • Command – 認識したいコマンドを定義。複数定義可
  • Example – 発話例
  • ListenFor – 認識したいコマンドを書きます。[]であってもなくてもよい、{}はPhraseListの中から選択することになります
  • Feedback – 認識完了したときCortanaに言わせる言葉
  • Navigate – アプリをフォアグラウンド起動します。

 

<?xml version="1.0" encoding="utf-8" ?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">
  <CommandSet xml:lang="ja-JP">
    <CommandPrefix>サンプル</CommandPrefix>
    <Example>サンプル ウインドウ起動</Example>
    <Command Name="Command1">
      <Example>サンプル ウインドウ起動</Example>
      <ListenFor>ウインドウ[起動]{number}</ListenFor>
      <Feedback>認識しました</Feedback>
      <Navigate />
    </Command>
    <PhraseList Label="number">
      <Item> 1 </Item>
      <Item> 2 </Item>
    </PhraseList>
  </CommandSet>
</VoiceCommands>

この場合

  • サンプル ウインドウ起動 1
  • サンプル ウインドウ 2

などの言葉を認識します。

このファイルをxmlファイルとしてプロジェクトに追加しておきます。

今回はVcdFilesというフォルダの下に作りました。

VoiceCommandDefinitionファイルの登録

先ほど作ったVCDファイルをCortanaに登録します。

var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///VcdFiles/ForegroundVcd.xml"));
await VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(file);

 

認識時のフォアグラウンド起動

VCDファイルにNavigateタグを入れていた場合、コマンドを認識したときにアプリが起動し、AppクラスのActivateメソッドが呼ばれます。

そこで認識結果を取得し、ウインドウを起動することでCortanaからアプリをフォアグラウンド起動できます。

protected override void OnActivated(IActivatedEventArgs args)
{
    base.OnActivated(args);

    if(args.Kind == ActivationKind.VoiceCommand)
    {
        var voiceCommandArgs = args as VoiceCommandActivatedEventArgs;
        
        var command = voiceCommandArgs.Result.RulePath[0]; //コマンド名
        var status = voiceCommandArgs.Result.Status;    //認識ステータス
        var text = voiceCommandArgs.Result.Text;    //認識した言葉
        var semantic = voiceCommandArgs.Result.SemanticInterpretation.Properties["number"][0]; //{}内のパラメータ


        Frame rootFrame = Window.Current.Content as Frame;
        if (rootFrame == null)
        {
            rootFrame = new Frame();
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            //MainPageへNavigate
            rootFrame.Navigate(typeof(MainPage));
        }

        Window.Current.Activate();
    }
}

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください