感情をいじる:Microsoft Cognitive Services + Unity

ともだち! きっとあなたの多くは、REST APIの呼び出しで複雑な問題を解決できる認知サービスについて聞いたことがあるでしょう-写真から人の感情や年齢を判断したり、テキストの機械翻訳をしたりするなど。 多くの場合、認知サービスはアプリケーションまたはWebバックエンドに組み込まれています。 今日、VRTechの従業員であり、ゲーム開発者であるGrigory Dyadichenkoが、Unityゲームに認知サービスを実装する方法を教えてくれます。また、Unity開発者の会議に招待します。






この記事では、UnityでのMicrosoft Cognitive Servicesの統合について説明します。 WWWクラスを介してサービスにHTTPリクエストを行う方法について(突然他の誰かがこれに遭遇せず、知らない場合)、Google Playのこれらのサービスを使用してアプリケーションを開発するときに遭遇した予期しない問題を教えてください。







Microsoft Cognitive Servicesは、音声認識、顔、感情などのタスクを解決できるクラウドサービスのセットです。 詳細はこちら



私はかつて認知サービスについての記事を書き特にEmotions APIについても書きまし 。 Unityプロジェクトでは使用できないUWPのライブラリを使用しました。 そのため、最近、Unity向けのこれらのサービスのラッパーを作成するといいと思いました。 そして、私は仕事に取りかかりました。



これらのサービスは、展示会で「すごい効果」を生み出し、連絡先や同様のタスクを収集するための興味深い安価なツールです。 原則として、同じOpenCVを使用するよりも何回も簡単に作業できます。 ゲーム開発のコンテキストでは、プレーヤー用のクールなパンを作成できます。これにより、プレーヤーの写真からプレーヤー用のアバターを生成できます。



ラッパー自体の説明に移りましょう。 現在、Emotions APIとFace APIを部分的にカバーしています。







ソリューションとの相互作用は非常に簡単に構築されます。 コンストラクターでSubscriptionKeyを指定することで必要なサービスを作成し(便宜上、ScriptableObjectはストレージ用のデモシーンで作成されます)、必要なデータを取得するコルーチンを作成します。



private IEnumerator CheckEmotions() {     EmotionService emoServ = new EmotionService(SubscriptionKeys.Instance.EmotionsApiKey);     while (true)     {          yield return new WaitForEndOfFrame();          yield return emoServ.GetEmoInfoCoroutine(_WebCam.Screenshot);          var emotions = emoServ.LastEmotions;          if (emotions != null)          {               _MaxEmotionValue.text = GetMaxEmotionOnScreenshot(emotions);          }          yield return new WaitForSeconds(DELAY);      } }
      
      







サブスクリプションキーの無料試用版は、Microsoft Cognitive Services Webサイトで入手できます



では、なぜコルーチンがここにあるのでしょうか? 実際、サービスにアクセスする最も便利な方法はRest APIです。 Unityでこれを行う最も簡単な方法は、リクエストが非同期に実行されるWWWクラスを使用することです。 それが完了するのを待つ多くの方法があります。



たとえば、メインスレッドをブロックできますが、ほとんどの場合、これは望ましくないと思われます。



また、このバージョンのラッパーに実装されているコルーチンを作成できます。



 private IEnumerator CreateRecognizeRequestAndSaveResponseCoroutine(           string contentHeader,           byte[] data) {    Dictionary<string, string> headers = new Dictionary<string, string>();    headers.Add(Constants.SUB_KEY_HEADER, _SubscriptionKey);    headers.Add(Constants.CONTENT_TYPE_HEADER, contentHeader);    WWW request = new WWW(_RecognizeRequestUrl, data, headers);    yield return new WaitUntil(() => request.isDone);    ParseEmotionsFromJson(request.text); }
      
      







この方法はうまく機能し、Android用のアプリケーションを作成したときに適しています。 写真の分析には時間がかかるため、ユーザーが怠けないようにするため、広告を統合することにしました。 しかし、広告の統合中に、予期しない問題が発生しました。 ユーザーは広告を見て、プロファイルが分析されます-利益が、そこにあった。 ここでは、Android上のUnity Adsについて知らなかった機能を待っていました。 実際には、広告の表示中にメインストリームがブロックされるため、プロファイルの分析のために、すべてを別のストリームに入れることが決定されました。



そこに新しい、しかしかなり論理的な発見が待っていました。 WWWクラスはメインスレッドでのみ機能することがわかります。 そのため、System.Net(Unityにあるためバージョン2.0)ですべてを書く必要がありました。 そして、このソリューションをリポジトリに配置しましたが、SSL証明書に署名する必要がありました。これは明らかではなく、ラッパーのユーザーに予期しない結果をもたらす可能性があります。 突然誰かが興味を持ったら、githubの別のプロジェクトに入れることができますが、実装の観点からは複雑なことは何もありません。



(最高の例ではありません)



別のスレッドの例
 private void CreateRecognizeRequest() {   Clear();   _Thread = new Thread(Run);   _Thread.Start(); } private void Run() {   WebHeaderCollection headers = new WebHeaderCollection();   headers.Add(Constants.SUB_KEY_HEADER, _SubscriptionKey);   var request = HttpWebRequest.Create(_RecognizeRequestUrl);   request.ContentType = _ContentHeader;   request.Headers = headers;   request.ContentLength = _Data.Length;   request.Method = WebRequestMethods.Http.Post;   var dataStream = request.GetRequestStream();   dataStream.Write(_Data, 0, _Data.Length);   dataStream.Close();   var response = request.GetResponse();   dataStream = response.GetResponseStream();   StreamReader reader = new StreamReader(dataStream);   string responseString = reader.ReadToEnd();   reader.Close();   dataStream.Close();   response.Close();   Debug.Log(responseString);   if (!TryParseEmotionsFromJson(responseString))   {      Run();   }   else   {      _IsDataReady = true;   } }
      
      







Face APIをテストすると、別の面白い発見が見つかりました。 このような完璧な笑顔の効果を作りたかったのです。







Face APIは、Emotions APIと同じ一連の感情を返すことができます。 しかし、テスト中に結果が異なることがわかりましたが、Emotions APIはもう少し安定して正確に動作します。 したがって、この効果のために、顔のランドマーク(アスタリスクを正しく付けるため)はFace APIから取得され、感情はEmotions APIから取得されました。



近い将来、このラッパーの実装に戻り、Microsoft Cognitive Servicesの使用に関連する新しいジョークの検索に戻る予定です。 それまでの間、プロジェクトには、EmotionServiceとWebカメラとの最も簡単な相互作用を示すデモシーンがあります。 さらに、いくつかの便利なスクリーンショットユーティリティ(たとえば、特定のRectTransformのスクリーンショットを撮るスクリプト)



ラッパーに戻って、 Githubリポジトリでその開発をダウンロードして監視できます 。 (おそらくmitapの後、彼らはドキュメントを書くために手を取ります)



Unity Moscow Meetup#3



6月7日、モスクワでのUnity開発者の第3回会議がコンピューター工学の高等学校で開催されます。 Unityで開発している場合、またはUnityに興味がある場合は、是非! イベントは無料です。登録が必要です。登録して詳細を確認してください



また、フォローアップイベントを行い、過去の会議の資料を見るには、グループに参加できます。



→VK: vk.com/unimosmeet

→FB: www.facebook.com/groups/unimosmeet



著者について



Dyadichenko GrigoryVRTechの主要なUnity開発者です。 主催者Unity Moscow Meetup。 彼は、グラフアルゴリズム、ゲーム開発、およびコンピューターグラフィックスに関連するすべてが好きです。



All Articles