Cross Road

Unity、VR、MR、ARを中心とした技術ブログ

Cortana認識結果を利用してUWP→Unity関数を呼ぶ方法

前回、CortanaとUnityを連携する方法を紹介しました。

Unity→UWPでCortanaの機能を使う仕組みについて - Cross Road

このときは「Unity側で定義した会話文を元にCortanaとおしゃべりする」、というものでした。

構成としては、

Unity
→UWPのXAML
→Cortanaを呼び出す
→Cortanaがユーザの声を認識する
→Unity側で定義した言葉を、Cortanaがしゃべる


です。今回は、

Unity
→UWPのXAML
→Cortanaを呼び出す
→Cortanaがユーザの声を認識する
→認識した結果に応じて、Unity側で定義した関数を呼ぶ

を作ってみたので、この内容を解説したいと思います。

目次

1. 作成手順

1-1. Unity側で作成

1-2. Unityでビルド

1-3. Visual StudioでVoiceSpeech.csを修正

1-4. Visual StudioでCortanaを使うための設定

1-5. Deploy

1-6. 動作確認

2. 終わりに

1. 作成手順

今回、検討するにあたり、前回のプロジェクト一式を@kaorun55 さんに小さくしていただきました。
(@kaorun55さん、ありがとうございます)

これを元にCortanaからUnity関数を呼ぶ機能を追加したものを作りました。以後、このプロジェクトの使い方を説明していきます。

2016/7/19 追記

ソースコードをzipで固めて下記におきました。Unityからのビルドが必要です。

https://1drv.ms/u/s!AIq6rsyH7lzvgolg

1-1. Unity側で作成

Unity側では、音声しゃべったら呼びたい関数を作ります。今回のサンプルでは、"fire"としゃべって火の球を発生させ、"Go"としゃべって火の球を的に当てる、という動きを作ってみました。

まず、CortanaController.csでは、以下のように文字を定義します。

f:id:Takyu:20180716101233j:plain
Unity側ではこのようなスクリプトを準備しました。


gistee5bb0e9d9ad24f3d6c61d4af5b3f85d

ここは説明不要で、publicで宣言した関数を書いているだけです。

1-2. Unityでビルド

前回ブログの内容を再掲します。ビルド設定は下記の通りです。

f:id:Takyu:20180716101247j:plain
まず、Switch PlatformでWindows Storeにします。続いて、

SDK Windows 10
UWP Build Type XAML
Build and Run on Local Machine
Unity C# Projects チェックをつける

と設定します。その後、UnityからBuildを実行し、ビルド結果の保存先をAPPフォルダにします。

[補足1]

Build TypeはXAMLにしてください。D3Dにすると、その後の設定でCortanaの制御ができなくなります。

[補足2]

Build TypeをBuild and Run onには、Windows Phoneというオプションもあります。しかし、Local Machineにしておいても、あとでWindows 10 MobileにDeployできました。

[補足3]

HoloLensの場合、Virtual Reality Supportedにチェックを入れると、全天周のアプリになります。VR系アプリを作っている方は想像しやすいと思いますが、CG空間の一部だけがレンダリングされ、センサの向きによって表示される内容が変わるものです。

チェックを入れないと、普通のUWPアプリと同一の扱いになり、空間に張り付けることができます。

[補足4]

Unity5.4.0b14-HTPでVirtual Reality Supportedにチェックをつけてから作ったC#プロジェクトを、Visual StudioでWindows10 Mobile用のUWPにしたところ、問題なく動きました。

1-3. Visual StudioでVoiceSpeech.csを修正

1-3-1. VoiceSpeech.csの概要

このスクリプトは、Cortanaによる音声聞き取り、音声再生を担当しています。具体的には、StartListeningという非同期のメソッドによって、音声受付状態になります。

また、ContinuousRecognitionSession_ResultGeneratedという非同期のメソッドによって、認識した結果をstringにします。そして、 VoiceResponseという非同期のメソッドによって、Unity側で定義したQ&Aを元に、該当する回答分を選定してSpeakメソッドを呼びます。

Speakメソッドでは、最終的に

Media.SetSource(synthStream, synthStream.ContentType);

によって、音声を再生します。

1-3-2. 修正

まず、Unityの関数を呼ぶため、冒頭の宣言に

using UnityEngine.Windows;
using UnityPlayer;

を追加します。すると、元のプロジェクトにはUnityEngineやUnityPlayerが入ってないのでエラーになります。そこで、Plugin.Windows10.Speech部分を右クリックして、Add Referenceを選択します。

f:id:Takyu:20180716101328j:plain
開いたWindowのBrowseをクリックし、UnityPlayer.winmdと、UnityEngine.dllを指定します。

f:id:Takyu:20180716101340j:plain
それぞれのパスは以下の通りです。


CortanaUnityConnection\APP\CortanaUnityConnection\Unprocessed\UnityEngine.dll

CortanaUnityConnection\APP\Players\UAP\ARM\Debug\UnityPlayer.winmd

(HoloLensの場合は、UAP直下がx86になります)

その後、以下のようにソースコードを修正します。

gist8babcdb5137a437fa6e32562ae5922f9

すると、ソースコードに記載したUnityのComponentが見つからないというエラーがでます。たとえば、今回の場合、InvokedByCortanaコンポーネントを呼び出している、

 go.GetComponent<InvokedByCortana>().generateFlare();

この部分でエラーがでます。

これは、Plugin.Windows10.Speechプロジェクトが、Unity側のプロジェクトを認識できていないためです。そこで、Plugin.Windows10.SpeechのReferenceを右クリックして、Add Referenceします。

f:id:Takyu:20180716101406j:plain
ここで、Assembly-CSharpというプロジェクトを二つとも選択してOKをクリックすれば、Unity側のプロジェクトを認識し、エラーが消えます。

1-4. Visual StudioでCortanaを使うための設定

以下は、前回のブログと同一です。2-2-5, 2-2-6, 2-2-7, 2-2-8, を参照ください。

Unity→UWPでCortanaの機能を使う仕組みについて - Cross Road

1-5. Deploy

前回のブログと同一です。

1-6. 動作確認

実機の雰囲気が伝えづらいので、Unity Editorによるスクショを紹介します。まず、起動すると、このようにボードと球体が表示されます。
(HoloLensの場合、黒い部分は透過しています)

f:id:Takyu:20180716101431j:plain

この状態で、"Fire"と発声すると、火の玉が出ます。「ファイアー」とカタカナ英語的に発音しても出ます。

f:id:Takyu:20180716101444j:plain

続いて、"Go"と発声すると、火の玉が球体に向かって飛んでいきます。当たると音が鳴って二つとも消滅します。

f:id:Takyu:20180716101456j:plain

うまく表示や制御を工夫すると、魔法を出すような表現ができます。HoloLensで使うと、現実と重畳できるので、これだけでも色々と可能性を感じます。

2016/7/19 追記

「NamamugiNamagomeNamatamago」を認識対象に追加してみたところ、認識してくれました!

そこで、「なまむぎなまごめなまたまご」と発声すると、このようにたまごが出てくるようにしてみました。
(サンプルプロジェクトには含まれていませんが、CortanaController.csに追加して手順通りビルドするだけで確認可能です)

f:id:Takyu:20180716101510j:plain

Cortonaの認識精度は相当高いですね。

2. 終わりに

今回、CortanaからUnityを呼ぶ原理を紹介しました。今回の仕組みはUWPで動くので、HoloLensだけでなく、Windows10 MobileやDesktopで動きます。
(ちゃんと試してませんが、ソース側で言語設定を日本語にすれば、Windows10デスクトップでも使用可能なはずです)

VoiceSpeech.csをうまく改造すると、わりと何でもできます。認識率が高いので、呪文詠唱とか、これまでとちょっと違うゲームも作れそうですね。