がりらぼ

WindowsRuntimeの応援ブログ

Cortanaで音声コマンドを使うには(WindowsPhone8.1)

注意

日本でWindowsPhoneをインターネットにつなげることは禁止されています。(そもそも起動すら禁止されているらしい)

Cortanaはインターネットに繋げないと実行できません。

私はシアトルに滞在していたときにテストしましたが、日本でのCortana使用は実質禁止されています。

あと日本語の音声認識もできません。

なんで使っちゃダメかについてはここらへんを参照してください。

Windows Phoneへの道 - SIMフリー端末ってなに? その2 ラスボスは技適マーク

Cortana

WindowsPhone8.1から、Cortanaという音声認識エージェントが導入され、Cortanaに向かって話すと、様々な処理をしてくれます。

 

10

 

 

Cortanaには音声コマンドを登録することができ、予め特定の音声コマンドを登録しておくとあとはユーザーがCortanaにむかって話しかけるだけでアプリを起動してくれます。

11

 

Cortanaを使用する

WindowsPhone8.1では日本語ではCortanaを使用することができません。

もちろん日本語の音声認識や音声コマンドは現在利用することができません。

 

Cortanaは現在日本語では使用できないのでシステムの設定から、言語を英語、地域をUnitedStatesに変更するとCortanaがWindowsPhoneで使えるようになります。

 

設定→言語から、Englishを選択し、電話を再起動のボタンを押し、再起動します。

1

 

 

電話を再起動できたら、次に地域の設定をします。

設定からregion→UnitedStatesに変更し、再起動します。

 

 

2

 

これでアプリ一覧にCortanaが出現します。

3

 

VCD(Voice Command Definition)を記述する

VCDファイルとはCortanaに認識させたい音声コマンドを記述したxmlファイルです。

以下にサンプルのVCDを示します。

<?xml version="1.0" encoding="utf-8"?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.1">
 <CommandSet xml:lang="en-us" Name="commandSet_en-us">
 <CommandPrefix>TestCortana</CommandPrefix>
 <Example>Tell me WindowsPhone</Example>
 

 <Command Name="voiceCommand1">
 <Example> Tell me you </Example>
 <ListenFor> [Tell me] {msgText} </ListenFor>
 <Feedback> OK, Tell you {msgText} </Feedback>
 <Navigate Target="TestPage1.xaml"/>
 </Command>

 <PhraseTopic Label="msgText" Scenario="Short Message"/>
 </CommandSet>

</VoiceCommands>

Comandタグ

一つの音声コマンドはCommandタグで定義されます。

Exampleタグはサンプルを指定します。

ListenForタグ

ListenForは認識したい音声コマンドを指定します。

でくくられた部分は固定値を表します。また、{}は同じxml内のLabel属性を参照します。

 

でTell meをくくることによって、Tell meという固定値を表し、{}でmsgTextをくくることで同じxml内のPharaseTopicタグのmsgTextラベルを指定します。

Label属性がmsgTextなタグは、Senario属性にShort Messageとあります。こう指定することで任意のショートメッセージとなります。

 

つまり、ListenForの部分を [Tell me ]{msgText} とすることで、"アプリ名 Tell me 任意のメッセージ"というパターンを認識することができます。

Feedbackタグ内では、認識し終わった後に返すメッセージです。

Navigateタグ

Navigateタグは音声認識後、遷移したいxamlページを指定します。

しかしNavigateタグにxamlを指定しても実際に遷移してくれることはなく、認識後にパラメータとして渡されるだけです。

 

Cortanaにコマンドを登録する

VCDファイルを作成することができたら、アプリ起動時にCortanaに音声コマンドを登録するようにしましょう。

StorageFile file=await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///assets/testvcd.xml"));
await VoiceCommandManager.InstallCommandSetsFromStorageFileAsync(file);

StorageFileのGetFileFromApplicationUriAsyncメソッドVDCファイルを取得し、

VoiceCommandManagerのInstallCommandFromStorageFileAsyncメソッドで音声コマンドを登録します。

 

 

音声コマンドによるアプリの起動を制御する

Cortanaに上記の処理でコマンドを登録したあとは、Cortanaに向かって音声コマンドをいうと特殊な操作でアプリを起動することができます。

App.xaml.csのOnActivatedメソッドをオーバーライドし、下記の処理を追加します。

protected override void OnActivated(IActivatedEventArgs args)
{
    base.OnActivated(args);
    if (args.Kind == ActivationKind.VoiceCommand)
    {
        var commandArgs = args as VoiceCommandActivatedEventArgs;
        SpeechRecognitionResult speechRecognitionResult = commandArgs.Result;

        var text = speechRecognitionResult.Text;
        var status = speechRecognitionResult.Status;

        string navigateTarget = speechRecognitionResult.SemanticInterpretation.Properties["NavigationTarget"][0];
        string commandMode=speechRecognitionResult.SemanticInterpretation.Properties["commandMode"][0];
        string msgText = speechRecognitionResult.SemanticInterpretation.Properties["msgText"][0];

        if (navigateTarget == "TestPage1.xaml")
        {
            Frame rootFrame = new Frame();
            Window.Current.Content = rootFrame;
            
            rootFrame.Navigate(typeof(TestPage1),msgText);
            Window.Current.Activate();
        }
        
        

    }
}

Cortanaの音声コマンドによるアプリの起動は、引数としてActivationKind.VoiceCommandという値が送られてくるので判断することができます。

SpeechRecognitionResult型の値を取得し、Textプロパティは送られてきた音声コマンドを表し、Statusプロパティは認識できたかどうかを表します。

 

SemanticInterpretation.PropertiesはVCDに指定した様々な値を取得することができます。

その中でもNavigationTargerはVCDに指定したxamlページの文字列が返ってくるのでそれに応じてページ遷移を行いましょう。

 

Cortanaで音声コマンドを実行してみる

ここまでできたら、マニフェストファイルの機能タブにマイクの使用許可を与え、実行してみます。

2

 

 

まず起動時にCortanaに音声コマンド登録を行います。

3

 

その後、Cortanaを起動し、音声コマンドを入力します。

今回の場合ListenForに [Tell me] {msgText} と指定したので、"TestCortana Tell me hogehoge"と入力すれば起動できるはずです。

5

今回はTestCortana Tell me WindowsPhoneと入力してみます。

音声コマンドがうけとられ、Cortanaからアプリを起動することができました。

6