チュートリアル2 - カスタムNLPを使って音声エクスペリエンスをアプリに追加する
ビルトインNLPは、VRでの音声の可能性について把握するための優れた手段です。独自に開発したVRエクスペリエンスにおいて、ユーザーが音声を最大限に活用できるようにするため、専用のWitアプリをトレーニングすることができます。カスタマイズしたインテント、エンティティ、特徴をビルトイン機能と組み合わせることにより、思いどおりのアプリをデザインできます。このチュートリアルでは、ユーザーが自分の音声を使って3D図形の色を変更できる、シンプルなアプリをビルドします。さらに、音声SDK統合の基本事項、Witアプリのトレーニング、そして音声コマンドのアクティブ化についても説明します。
このチュートリアルを始める前に、
Voice SDKのチュートリアルで概説されている手順を完了し、必要な依存関係を含むプロジェクトを作成してください。チュートリアルはこのようなプロジェクトに基づき構成されています。
インテント、エンティティ、特徴をカスタマイズしたアプリに音声エクスペリエンスを追加する
- 新しいUnityプロジェクトの空のシーンで、[Hierarchy (階層)]ウィンドウを右クリックした後、[GameObject (ゲームオブジェクト)] > [3D Objects (3Dオブジェクト)] > [Cube (立方体)]を選択します。
- 追加した立方体を選択してインスペクターウィンドウに移動し、[Position X (位置X)]を
-2.5に設定します。これにより立方体が移動して、ほかの図形のためのスペースを空けられます。 - 上記の手順を繰り返して、球体、カプセル、円柱を追加します。それらの位置Xを、それぞれ
0.75、0.75、2.5に設定します。 - [Hierarchy(階層)]ウィンドウを右クリックし、[Create Empty(空を作成)]を選択し、その名前としてShapesを指定します。そこに先の図形をまとめます。
4つの図形を選択し、Shapesゲームオブジェクトにドラッグします。
- Unityで、新しいゲームオブジェクトを作成してCanvasと名付けます。
- そのゲームオブジェクトを右クリックし、[Button - TextMeshPro (ボタン - TextMeshPro)]を選択します。ボタン要素の名前としてButtonを指定します。その[Hierarchy (階層)]ウィンドウを開き、テキストアイテムの名前をButton Labelに変更します。それを画面の下部に配置します。
ステップ3: シーン内のアプリ音声エクスペリエンスを有効にする
プログラムでWit応答を利用するには、アプリ音声エクスペリエンスGameObjectを追加する必要があります。
[Assets (アセット)] > [Create (作成)] > [Voice SDK (音声SDK)] > [Add App Voice Experience to Scene (アプリ音声エクスペリエンスをシーンに追加)]をクリックし、[App Voice Experience (アプリ音声エクスペリエンス)] GameObjectを選択します。
前に作成したWit設定ファイルを、AppVoiceExperienceコンポーネント内のスロットにドラッグします。
- 該当Unityアプリにリンクした(wit.aiウェブサイト上の)Witアプリを開きます。
- [Understanding (認識)]タブで、[Utterance (発話)]フィールドにmake the cube green (立方体を緑にする)と入力します。
[Intent(インテント)]の下にchange_colorと入力して、新しいインテントを作成します。
[Utterance (発話)]の下で、「cube (立方体)」をハイライトし、[Entity for "cube"(「cube (立方体)」のエンティティ)]フィールドにshapeを入力します。[+ Create Entity (+エンティティを作成)]をクリックします。
- green(緑)をハイライトし、新しいエンティティを作成して、その名前をcolorにします。
- アプリをトレーニングするため、[Train and Validate (トレーニングと検証)]をクリックします。
ユーザーが発するかもしれないほかの語句について、ステップ4~6を繰り返します。可能性のある語句としては、Set the sphere to red(球体を赤にする)、Make the cylinder green(円柱を緑にする)などが考えられます。
ヒント: トレーニングの後、アプリは自動でエンティティを認識し始めます。しかし、特に最初のうちは、間違えることがあります。この点が問題となる場合は、複数のフレーズをトレーニングし、その過程でNLUの間違いについて微調整してください。マッチングの対象となる語をハイライトし、正しいエンティティを設定します。次に正しくないエンティティの横のXをクリックして、そのエンティティを除去します。
[Entities (エンティティ)]タブで、以下のエンティティが存在していることを確認します。
ステップ5: マッチングを改善し、同義語を指定する
時間の経過とともにマッチングは改善されていきますが、最適な方法は、図形の同義語を含めることによってアプリの精度を改善することです。デフォルトの場合、Wit.aiは、エンティティをフリーテキストとキーワードの両方でマッチングします。しかし、図形の特定の名前があらかじめ分かっている今回のような場合は、キーワード検索戦略に切り替えることにより、若干精度を上げることができます。
- [Entities (エンティティ)]タブを開き、図形エンティティを選択して、エンティティ設定ページを開きます。
- [Lookup Strategies (検索戦略)]の下で、[Keywords (キーワード)]を選択してから、いくつかの名前や、各図形に相応しい同義語を追加します。例えば、図形の名前
tubeに加えて同義語cylinderを含めることができます。これによりアプリは、ユーザーがtubeと言った場合に、インテントコールバックからテキストcylinderを返します。
注: [Keyword (キーワード)]フィールドに入力する際には、Unityで作成したゲームオブジェクトと大文字小文字を正確に一致させてください。そうすれば、インテントコールバックがトリガーされたときに、そのゲームオブジェクトを検出できます。
図形の色を変える発話認識のためのWitアプリのトレーニングが完了したら、認識ビューアーを使っていくつかのコマンドをテストできます。
- [Meta] > [Voice SDK (音声SDK)] > [Understanding Viewer (認識ビューアー)]の順に選択します。
- 発話として「the cube should be green (立方体は緑でなければならない)」を入力してから、[Submit (送信)]をクリックします。
- 発話から返される応答ペイロードを参照します。応答ペイロードには、発話によるインテントの抽出値(
change_color)とエンティティ(shapeとcolor)が含まれます。
ステップ7: 音声コマンドの応答ハンドラーを追加する
ユーザーがコマンドを発声した場合、音声SDKによりその発話が、Wit.APIに送信されて、そこでNLU処理がなされます。処理完了後、抽出されたインテント、エンティティ、その他の関連フィールドが含まれた応答が送り返されます。
その応答を処理するため、次のように応答ハンドラーを設定します。
- Unityの[Hierarchy (階層)]ウィンドウで、[App Voice Experience (アプリ音声エクスペリエンス)]ゲームオブジェクトを選択します。
- [Create Empty (空を作成)]を右クリックして、[App Voice Experience (アプリ音声エクスペリエンス)]の子ゲームオブジェクトを作成します。
- 新しいゲームオブジェクトの名前をResponse Handlerとします。
エンティティ値を使用するには、値ハンドラーを追加し、スクリプトにリンクする必要があります。そのスクリプトに、図形と色の値をシーン内の3D図形ゲームオブジェクトに適用するためのロジックが入ることになります。
- [Meta] > [Voice SDK (音声SDK)] > [Understanding Viewer (認識ビューアー)]をクリックしてから、図形と色の値を表示するエンティティのフォールドアウトを選択します。
- [entities (エンティティ)] > [color:color] > [** 0**]と移動して、[value (値)]をクリックします。
- [Add response matcher to Color Handler (応答マッチャーを色ハンドラーに追加)]を選択します。
図形エンティティの値については、entities > shape:shape > 0 > value = cubeをクリックします。ポップアップウィンドウで、[Add response matcher to Response Handler (応答マッチャーを応答ハンドラーに追加)]を選択します。
- [Hierarchy(階層)]ウィンドウで、Shapesゲームオブジェクトを選択します。
- [Inspector (インスペクター)]ウィンドウで、[Add Component (コンポーネントを追加)]をクリックします。
- [New Script(新しいスクリプト)]を選択し、新しいスクリプトの名前としてColorChangerを指定します。
そのスクリプトに次のコードを追加します。
using System;
using UnityEngine;
public class ColorChanger : MonoBehaviour
{
/// <summary>
/// Sets the color of the specified transform.
/// </summary>
/// <param name="trans"></param>
/// <param name="color"></param>
private void SetColor(Transform trans, Color color)
{
trans.GetComponent<Renderer>().material.color = color;
}
/// <summary>
/// Updates the color of GameObject with the names specified in the input values.
/// </summary>
/// <param name="values"></param>
public void UpdateColor(string[] values)
{
var colorString = values[0];
var shapeString = values[1];
if (!ColorUtility.TryParseHtmlString(colorString, out var color)) return;
if (string.IsNullOrEmpty(shapeString)) return;
foreach (Transform child in transform) // iterate through all children of the gameObject.
{
if (child.name.IndexOf(shapeString, StringComparison.OrdinalIgnoreCase) != -1) // if the name exists
{
SetColor(child, color);
return;
}
}
}
}
- [Hierarchy (階層)]ウィンドウの[App Voice Experience (アプリ音声エクスペリエンス)]の下で、[Response Handler (応答ハンドラー)]ゲームオブジェクトを選択します。[Wit Response Matcher (Script) (Wit応答マッチャー(スクリプト))]ウィンドウを開きます。[On Multi Value Event (String[]) (複数値イベント (String[]))]の下の[+]をクリックして、[Shapes (図形)]ゲームオブジェクトをそのスロットにドラッグします。関数ドロップダウンから、ColorChanger.UpdateColor()を選択します。
- [Play (プレイ)]を押してアプリを実行します。
- [Meta] > [Voice SDK (音声SDK)] > [Understanding Viewer (認識ビューアー)]をクリックし、ビューアーを開きます。
[Activate(アクティブ化)]を選択してから、「Make the capsule red(カプセルを赤にする)」と言います。