一通り目処がつきましたので紹介します。以前、下記の記事でCortanaとUnityを連携させる方法を調べました。
【2016/6/21更新】CortanaをUnityで使う方法の調査まとめ - CrossRoad
今回、ここで紹介した2種類のサンプルのうち、(1)を使う方法を解説します。
※(2)は未調査です。
1.前提
1-1. サンプルソリューションの概要
前回も紹介した通り、下記ブログで紹介されているサンプルを使います。ブログの末尾でプロジェクト一式をダウンロードできます。
このサンプルでは、Unityで作られた近未来的な建物の部屋の中からスタートします。
画像の右側がスタート地点、左側に大きな眼をしたロボット?がいます。PlayerはFPSControllerのPrefabです。キーボードまたはゲームパッドでロボットの近くまで移動すると、
What is your name?
What do you do here?
Forecast
と書かれたテキストが出現します。Windows10デバイスでこれのUWPを実行してれば、この状態の時に3つのどれかの言葉を発声すると、Cortanaが返答してくれます。
上記3つの質問文、および各質問に対する回答は、Unity側のリスト配列で定義されており、任意の言葉に変更可能です。
このサンプルでは、ロボットにSphereColliderが取り付けられ、OnCollisionEnterでPlayerが範囲内に近づいた時だけ先ほどのメッセージを表示し、音声の入力待ちになります。
1-2. サンプルソリューションの制限事項
このサンプルは、
- (1) UWPアプリを実行するPCまたはスマートフォンで、キーボードまたはゲームパッドが動くこと
- (2) PCまたはスマートフォンの言語と地域がen-USになっていること
という条件を満たさないと動作確認ができません。手持ちのデバイスには、Windows 10 Mobile(KATANA01)と、Windows10 Proがありましたが、どちらも動作確認できませんでした。
KATANA01
en-US設定にはできたが、Bluetoothキーボードがなく、実行時に移動ができなかった
Windows10 Pro
実行時に移動はできたが、地域設定をen-USにしたらCortanaが使えなくなってしまった
上記いずれかを回避できれば、サンプルをそのまま動かすことはできます。今回は、サンプル動作確認のため、常に音声の入力待ちになるようにUnity側を変更し、再ビルドする手順を紹介します。
2. Unityでビルドする手順
まずは先ほど紹介したブログより、サンプルを入手します。BotWorld.zipとPlugin.Windows10.Cortana.zipの二種類が入手できます。
BotWorld.zip
今回の動作確認に必要なものがすべて入ったソリューション一式です。
Plugin.Windows10.Cortana.zip
自分で任意のCortana-Unity連携アプリを作りたいときのセットです。BotWorld.zipにも同じものが入っています。
今回はBotWorld.zipだけを使います。zip解凍後、BotWorldフォルダを指定してUnityで開きます。本来Unity5.2で作られているようですが、Unity5.3.5f1およびUnity5.4.0b14-HTPのどちらでも動きました。
Unityで開いたら、GameObject / Create Emptyで空のGameObjectを作ります。ProjectViewで新規ソースファイルを作り、下記のCortanaController.csをコピペしたら、CortanaControllerのオブジェクトにアタッチします。
gist9826fff1db7559b2ead7ba574ce75328
続いて、CortanaControllerのInspector Viewを開き、好きな質問文と回答文を入力します。
(サンプルのVoiceBot.csのスクショですが、CortanaController.csとpublicの宣言は同一です)
また、Bot UI PanelとQuestion Optionsには、Hierarchy ViewのCanvas1とCanvas1/Panel/Textを指定します。
ここまで出来たら、ビルドします。ビルド設定は下記の通りです。
まず、Switch PlatformでWindows Storeにします。続いて、
SDK | Windows 10 |
UWP Build Type | XAML |
Build and Run on | Local Machine |
Unity C# Projects | チェックをつける |
と設定します。
補足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にしたところ、問題なく動きました。
その後、UnityからBuildを実行し、ビルド結果の保存先をEXPORTフォルダにします。
3. Visual Studio側でCortanaを使うための設定
まずはVisual Studioで、BotWorld/EXPORT/CortanaWorld.slnを指定します。この後、やることが色々あるので順番に説明します。
3-1. 2つのプロジェクトを追加
CortanaWorld.slnは、3つプロジェクトを束ねて使うのですが、初期状態では1つしか認識されていません。そこで、残り2つを認識させてこのようにします。
プロジェクトを追加するには、Solution Explorerで先頭のSolution "CortanaWorld"で右クリックし、Add/ Existing Project..を選択します。
追加対象は、BotWorldフォルダにある、BotWorldVoiceCommandServiceとPlugin.Windows10.Cortanaの2つです。
このようにcsprojファイルを指定します。Plugin.Windows10.Cortanaの場合も同様です。
(注)
自分で0からUnityプロジェクトを作っていくと、2-1を終えてslnを開いたとき、
- Assembly-CSharp
- Assembly-Sharp-firstpass
というプロジェクトが追加され、合計5つになりました。理由は不明です。
ちなみに、Assembly-CSharp側には、Unityで作ったスクリプトが入っており、ここで変更したものはUWPのDeployに反映されます。(Public変数の変更は無理だと思いますが)
2016/7/5追記
上記二つが追加される要因がわかりました。UnityでBuild Settingsを開いたとき、Unity C# Projectsにチェックをつけていると追加されます。
実は今回のようにUnity→Cortanaにデータを渡すだけの処理であればUnity C# Projectsのチェックは不要です。
ただし、Cortana→Unityにデータを渡したいときや、Visual StudioでUnity のビルド結果を修正したいときは必要になります。
3.2 Add Referenceを設定
続いて、3つのプロジェクトが相互に参照できるように設定します。Solution ExplorerでCortanaWorldを右クリックし、Add Referenceを選択します。
BotWorldVoiceCommandServiceと、Plugin.Windows10.Speechにチェックをつけ、OKを選択します。
3.3 Restore Nugetの設定
Solution ExplorerからApp.xaml.csかMain.xaml.csを開きます。すると、コードの1行ずつにエラーがでます。原因は管理ライブラリが壊れているためです。なぜか毎回こうなるので、Restore Nuget Packagesで復元します。
3.4 Package.appxmanifestの修正
マニフェストファイルを選択し、ServiceとしてApp Serviceを追加します。次に、NameとEntryPointを追加します。
- Name : BotWorldVoiceCommandService
- EntryPoint:BotWorldVoiceCommandService.BotWorldVoiceCommandService
また、Capabilitiesにて、Internet(Client)と、Microphoneを指定します。
3.5 MainPage.xamlの修正
<SwapChainPanel>タグの中で<MediaElement x:Name=”Media”></MediaElement> を追加します。
(上記は、"<"と">"が全角になっているので、半角に修正して使用ください)
3.6 MainPage.xaml.csの修正
OnNavigatedToメソッドの指定箇所に
Plugin.Windows10.VoiceSpeech.Media = Media;
Windows10Interop.SpeechRequested += Plugin.Windows10.VoiceSpeech.StartListening;
Windows10Interop.StopSpeechRequested += Plugin.Windows10.VoiceSpeech.StopListening;
を追加します。
3.7 VCD.xmlを追加
下記のようにAdd New ItemでXML Fileを指定し、ファイル名をVCD.xmlとします。
空のVCD.xmlに下記をコピペします。
3.8 App.xaml.csの修正
まず、先頭に以下の宣言を追加します。
using Windows.Media.SpeechRecognition; using System.Diagnostics;
次に、OnActivated()の指定箇所に、このようなコードを追記します。
gist88cdd5c5aeeabd50d5f06bebb27c7abd
次に、OnLaunched()の指定箇所に、このようなコードを追記します。
gista2670e42df7bed99ef7069a91f2bf566
OnLaunchedには、asyncをつけます。
4. Deploy
Windows10 MobileかHoloLensを接続します。Windows 10 Mobileの場合、ARM、Deviceに指定してから、Deviceをクリックするか、Build/Deploy Solutionを選択するとアプリを実機転送できます。
HoloLensの場合、上記をx86に指定すればあとは同一です。
5. 動作確認
アプリを起動したら、何も操作はしなくてよいので、2-1で決めた言葉をしゃべってみてください。そうすると、2-1で決めた回答文をCortanaがしゃべってくれます。参考までに、Windows 10 Mobileで調べた結果です。
端末の言語設定と地域をen-USにして、上記のサンプルを実行しました。会話文をわざと下記のように書きました。
結果
・Hello / Good Dayは問題なし
・Konnitihaとしゃべると、「コニッチワ」のような音声が返ってきました。
時間なくて再検証できてませんが、検証中に質問と回答を「あなたの名前は?」/「私の名前はCortanaです」のように、ひらがな、漢字、英語が混じった書き方にしても認識できたことがありました。
Windows 10 Mobileの方は、言語設定で音声を男女で選べるようになっており、Ayumi Mobileという日本語女性の言語パックを使っているからと推測されます。
6.Tips
6.1 Switch PlatformでWindows Storeにすると、No Module Foundとなる。
Unityのモジュールダウンロードページから該当するバージョンのUnityをインストールします。インストール時に、
- Windows Store .NET Scripting Backend
- Windows Store IL2CPP
を選択してインストール作業を進めます。
6.2 サンプルプロジェクトで、UnityからBotWorldフォルダを指定したら、UnityのProject Viewで何も表示されない
Assetsと同じフォルダにあるLibraryフォルダを削除してから再度開くと、無事開けました。
7. 終わりに
7.1 やや不安定??
サンプルを動かすだけのつもりだったのですが、詰まるところが多くて整理に時間がかかりました。原因は、ソースコードの解読もそうですが、なぜか勝手にWindows Storeモジュールが消えたり、Unityでただ開いただけでおかしくなることがあったためです。
おそらく、他の環境でも同じようになる可能性があるので、今回改良したプロジェクト一式をGithubに後日公開しようと思います。これをベースにすれば、とりあえずビルドするだけでCortanaの確認ができます。
2016/7/5 追記
zip圧縮した一式「CortanaUnityConnection.zip」をOneDriveに置きました。
https://1drv.ms/f/s!Aoq6rsyH7lzvgokf1DLsi-zNq9sgHA
当初GitHubに置くつもりでしたが、
CortanaUnityConnection\EXPORT\Players
の中身が2GB近くになってしまったためzip圧縮を置く方法に切り替えました。(ここを削除すると、Visual StudioでDeployができなくなる)
もし削除できるならば、後日小さくしたものも公開します。
7.2 次の予定
今回の方法では、UnityからCortanaに対して働きかける処理がメインでした。色々調べた結果、Cortanaで音声を認識したらUnityに知らせる機能を作ることができたので、次回はその方法を紹介しようと思います。