チュートリアル - Voice SDKを使って基本的な音声入力を受け取る 更新日時: 2024/06/20
このチュートリアルでは、以下の重要なステップについて説明します。
音声エクスペリエンスを実現してVoice SDKを強化するためのMetaの自然言語理解サービス、Wit.ai で、音声アプリを設定する。 Wit.aiアプリで確認と否定のインテントを設定する。 UnityプロジェクトでVoice SDKをWit.aiにリンクする。 Unityプロジェクトで、ユーザーの発話をテキストとしてキャプチャして表示する。 確認と否定のインテントをキャプチャし、認識し、表示する。 このアプリは、ユーザーの発話(下のテキスト)に基づいて、ユーザーによる確認、同意、否定、または反対(上のテキスト)をキャプチャします。
Meta Quest 2で実行するアプリ
注: このチュートリアルでは、Unityエディターバージョン2021.3.20f1と
Meta XRオールインワンSDK v59を使っています。他のバージョンを使っている場合スクリーンショットは異なる場合がありますが、機能はほぼ同じです。
Voice SDKは、Metaの自然言語理解(NLU)サービスであるWit.aiを利用し、Meta Questヘッドセット、モバイルデバイス、その他のサードパーティプラットフォームと互換性があります。Wit.aiは無料で簡単に登録できます。Witを使うと、AI/MLの知識がなくても、音声コマンドを使えるようにアプリを簡単にトレーニングできます。
注: アプリの利用開始時に、エンドユーザーはアプリでマイクを使うことに同意するかどうかを選択できます。アプリが発話を記録してWit.aiに送信するのは、エンドユーザーがマイクの使用に同意した場合に限られます。
用語 説明 発話
ユーザーの発話内容
インテント
ユーザー発話の意図
確認インテント
ユーザーが情報を確定したり同意したりするために「ok」「はい」「同意します」「その通り」などと言う場合
否定インテント
ユーザーが情報を否定したり反対したりするために「okではない」「いいえ」「同意しません」「違う」などと言う場合
Activate()
ユーザーのヘッドセット上のデフォルトのマイクをオンにし、音量しきい値に到達してから20秒間、音声コマンドをリスニングする方法。ユーザーが2秒間黙っているか、20秒経過すると、マイク録音は停止します。
アクティブ化 すると、Witがユーザーの音声キャプチャを開始します。これが起動の呼び出しとなり、アプリはユーザー発話のリスニングを開始します。ユーザーが音声エクスペリエンスをアクティブ化するためには、例えば次のような、関連するイベントを設計する必要があります。
ユーザーが音声によってオブジェクトを選択して属性の一部を更新する場合 ユーザーがキャラクターに近づいて音声でのやり取りをしようとする場合 ユーザーが音声によって何かを選択して意思を伝える必要がある場合 アプリが特定の時間しきい値に達した場合 このチュートリアルでは、アクティブ化トリガーのために右コントローラーのAボタンを使います。ユーザーが右コントローラーのAボタンを押すと、「Listening (リスニング中)」と表示され、アプリがユーザー発話のキャプチャと処理を開始します。
ステップ1. OVRCameraRigをシーンに追加する まだプロジェクトにOVRCameraRigを追加していない場合は、次の手順に従ってください。
Meta XR Core SDK には、
OVRCameraRig prefabが含まれています。これは、Unityのデフォルトの
メインカメラ に代わる機能となります。
以下の手順に従って、OVRCameraRig をシーンに追加します。
プロジェクトの[Hierarchy (階層)] で、[Main Camera (メインカメラ)] を右クリックし、[Delete (削除)] を選択します。 [Project (プロジェクト)] タブで[All Prefabs (すべてのprefab)] を選択し、OVRCameraRig を検索し、OVRCameraRig prefabをプロジェクトの[Hierarchy (階層)] にドラッグします。[Hierarchy (階層)] の中の[OVRCameraRig] を選択します。[Inspector (インスペクター)] ウィンドウの[OVR Manager (OVRマネージャ)] コンポーネントの下で、[Target Devices (ターゲットデバイス)] から該当するヘッドセットを選択します。まだ登録していない場合は、Wit.ai アカウントを登録します。登録にはFacebookアカウントを使うことができます。 [+ New App (+ 新しいアプリ)] をクリックして新しいWitアプリを作成します。アプリの名前をtutorial にし、[Private (非公開)] を選択してから、[Create (作成)] をクリックします。
左矢印アイコンが表示されている場合、それをクリックするとWitアプリのメイン画面に移動します。
[Management (管理)] の下で[Intents (インテント)] を選択します。右上隅にある[+ Intent (+インテント)] ボタンをクリックします。 ポップアップウィンドウで[Add built-in intents (ビルトインインテントを追加)] を選択し、confirmation (確認) インテントを探します。これは、Wit.aiではwit/confirmationと呼ばれています。
リストボックスの外をクリックしてから、[Next (次へ)] をクリックします。 negation (否定) インテントについてもアクションの5~7を実行します。このインテントは、Wit.aiではwit/negationと呼ばれています。アプリのインテントリストが以下の画像と一致していることを確認します。
[Management (管理)] > [Settings (設定)] に移動し、[Server Access Token (サーバーアクセストークン)] をコピーします。Unityプロジェクトでそれを使う必要があります。
ステップ3. Unityプロジェクトで音声機能を設定する Unity Editorに戻ります。 トップメニューから、[Meta] > [Voice SDK (ボイスSDK)] > [Voice Hub (ボイスハブ)] > [Wit Configuration (Wit設定)] をクリックし、Wit.aiのサーバーアクセストークンを[Wit Configuration (Wit設定)] ボックスに貼り付けます。 [Link (リンク)] をクリックして、UnityアプリをWitアプリにリンクします。新しいWit設定ファイルを、アプリ用に一意の名前で保存します。例えば、tutorial という名前にすることができます。この設定は、プロジェクトのAssets フォルダー内にアセットとして保管されます。
[Voice SDK Settings (ボイスSDKの設定)] は次のようなものになるはずです。
[Edit (編集)] メニューで、[Project Settings (プロジェクト設定)] > [Player (プレイヤー)] に移動し、[Other Settings (その他の設定)] セクションを展開します。[Configuration (設定)] の下で、[Scripting Backend (スクリプティングバックエンド)] がIL2CPP であることを確認した上で、[Internet Access (インターネットアクセス)] を[Require (必須)] にします。
このアプリをテストするには、GameObjectとしてボタンとテキストを追加する必要があります。
[Hierarchy (階層)] を右クリックし、[UI] > [Button - TextMesh Pro (ボタン - TextMesh Pro)] を選択します。[TMP Essentials (TMPエッセンシャル)] ポップアップが表示されたら、それを受け入れます。新しいCanvas (キャンバス)オブジェクトが表示されます。[Hierarchy (階層)] で[Canvas (キャンバス)] をクリックします。[Inspector (インスペクター)] で、[Render Mode (レンダリングモード)] として[Screen Space - Camera (画面スペース - カメラ)] を選択し、[CenterEyeAnchor camera (CenterEyeAnchorカメラ)] を[Canvas (キャンバス)] コンポーネントにアタッチします。
[Hierarchy (階層)] の[Canvas (キャンバス)] の下で、[Button (ボタン)] を選択し、これらのスケール設定を[Inspector (インスペクター)] に適用します。
[Hierarchy (階層)] を右クリックして、[UI] > [Text - TextMesh Pro (テキスト - TextMesh Pro)] の順に選択します。[Inspector (インスペクター)] で、このGameObjectの名前をUser Utterance (ユーザー発話)に変更し、その位置、幅、高さ、スケールを以下のように変更し、[Text Input (テキスト入力)] をクリアします。
[Main Settings (メイン設定)] の下で、フォントサイズを更新し、水平と垂直の配置を選択します。
ステップ5. アプリ音声エクスペリエンスと応答ハンドラーのGameObjectを追加する このステップでは、アプリ音声エクスペリエンスオブジェクトを追加します。これにより、シーンでの音声インタラクションを管理します。
Unity Editorで、[Assets (アセット)] > [Create (作成)] > [Voice SDK (ボイスSDK)] > [Add App Voice Experience to Scene (アプリ音声エクスペリエンスをシーンに追加)] の順に選択します。 [Inspector (インスペクター)] ウィンドウで、App Voice Experience (アプリ音声エクスペリエンス) スクリプトを見つけます。[Wit Runtime Configuration (Witランタイムの設定)] の下で、[Wit Configuration (Witの設定)] を更新し、それを前にステップ3で作成したWitアセットにリンクします。(見つからない場合、Assets フォルダーの中にあります。)
[Event (イベント)] セクションで[Audio Events (オーディオイベント)] を選択します。
これらのイベントは、アプリがリスニングを開始したり停止したりする時などにトリガーされます。それらを、GameObjectのスクリプトに関連付けられた関数や基本的なUI要素にリンクすることもできます。
OnStartListening を選択し、[Add (追加)] ボタンをクリックします。
表示されるOn Start Listening () セクションの下で[+] ボタンをクリックしてから、以下のものを選択します。
Editor And Runtime (エディターとランタイム) [Scene (シーン)] の下で、[Text (TMP)] を選択します(これはボタンのテキストです)。[Scene (シーン)] の下で、TextMeshProUGUI.text を選択(string text をクリック)します。
アクティブ化されていることをユーザーが知ることができるよう、Listening (リスニング中) と入力します。
アクションの4、5、6を繰り返して、OnFullTranscription (string) イベントを追加します。それは、[Event Category (イベントカテゴリ)] セレクターの中の[Transcription Events (文字起こしイベント)] の下にあります。
これにより、ユーザーが話すのをやめた時点でユーザーの発話全体が返されるようになります。後で、それを[User Utterance (ユーザー発話)] テキストによって表示します。
重要: 実際のテキストをここに入力するためのテキストボックスはありません。ここでは、[string text (文字列テキスト)] ではなく[Dynamic string (ダイナミックテキスト)] の下の[text (テキスト)] を選択する必要があるからです。
注: ここではOnFullTranscriptionの設定だけを使っていますが、ユーザーがリアルタイムで文字起こしフィードバックを受け取ることができるよう、OnPartialTranscriptionも同じように設定するとができます。
これは、ユーザーのインテントをユーザーのビューポートに表示されるボタンテキストに一致させるための、新しいGameObjectです。これは2つのインテント(確認または否定)を特定するのに役立ち、それによってユーザーの発話とインテントに基づき、ユーザーに対して関連テキストを表示することができます。
[Hierarchy (階層)] でApp Voice Experience (アプリ音声エクスペリエンス) GameObjectを右クリックしてから、その子として[Create Empty (空を作成)] をクリックします。[Inspector (インスペクター)] で、新しいGameObjectの名前をResponse Handler (応答ハンドラー)に変更します。
この時点でプロジェクトの階層は、次のようになっているはずです。
[Hierarchy (階層)] の中でResponse Handler (応答ハンドラー) GameObjectがまだ選択されている状態で、Unityエディターのトップメニューから、[Meta] > [Voice SDK (ボイスSDK)] > [Understanding Viewer (理解ビューア)] を選択します。[Utterance (発話)]ボックスにyes (はい) と入力し、[Send (送信)] をクリックします。
数秒後、インテントおよびさまざまな値を含むネストしたデータ構造の形式で結果が返されます。
名前の値を右クリックし、ポップアップウィンドウで[Add Response Matcher to Response Handler (応答ハンドラーに応答マッチャーを追加)] を選択します。
新しいResponse Matcher (応答マッチャー)スクリプトがResponse Handler (応答ハンドラー) GameObjectにアタッチされており、リストに含まれるインテントがwit$confirmationであることを確認してください。 On Multi Value Event (String []) の下で、次のものを選択します。
Editor And Runtime (エディターとランタイム) Text (TMP) (テキスト(TMP)) (ボタンのテキスト)TextMeshProUGUI.text ([string text (文字列テキスト)] をクリックしてください)テキスト値としてConfirmation (確認)と入力します。
否定インテントを設定するためにアクションの4と5を繰り返します。今回は発話としてno (いいえ)を入力します。
Response Handler (応答ハンドラー) GameObjectの新しいResponse Matcher (応答マッチャー)コンポーネントで、アクション6~8を繰り返します。インテントがwit$negationであることを確認し、ユーザーにNegation (否定)を表示するためのテキストを更新します。
これは、ユーザーがAボタンをタップした(押して放した)時にWitをアクティブ化する基本的なスクリプトです。
[Project (プロジェクト)] タブの下で、[Assets (アセット)] フォルダに移動します。右クリックして、[Create (作成)] > [Folder (フォルダー)] を選択し、その名前としてScripts を指定してから、この新しいフォルダーを開きます。 右クリックして、[Create (作成)] > [C# Script (C#スクリプト)] を選択し、VoiceScript という名前にします。 新しいスクリプトを、[Hierarchy (階層)] タブのCube (キューブ) GameObjectにドラッグ&ドロップします。 [Hierarchy (階層)] タブで、Cube (キューブ) GameObjectを選択します。[Inspector (インスペクター)] で、VoiceScript.cs スクリプトをダブルクリックして、設定しているIDEでそれを開きます。以下の行をスクリプトに追加します。
アプリ音声エクスペリエンスGameObjectを参照する 以下のようにしてAppVoiceExperience GameObjectへの参照を追加します。
public AppVoiceExperience voiceExperience;
ユーザーが(前のフレームで)Aボタンを放したかどうかを確認するには、OVRInputのメンバー関数
GetUp() を使用します。このインタラクションでは、
OVRInput.Button.One (ユーザーがAボタンを押した)のブーリアン値を受け取る必要があります。trueの場合、ユーザーはAボタンをちょうど放したところです。
Update()関数にコントローラーサポートを追加した後のスクリプト全体は、次のようになります。これにより、ユーザーがAボタンを放した直後にWitがアクティブ化されます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Oculus.Voice;
public class VoiceScript : MonoBehaviour
{
public AppVoiceExperience voiceExperience;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (OVRInput.GetUp(OVRInput.Button.One))
{
voiceExperience.Activate();
}
}
}
ステップ7. Cube (キューブ) GameObjectに最終的な更新を加えてからアプリを実行する Unityエディターを開き、[Hierarchy (階層)] タブでCube (キューブ) GameObjectを選択します(選択されていない場合)。 このアプリでは、このキューブとのユーザーインタラクションはないため、その[Position (位置)] を[5, 0, 0] に、[Scale (スケール)] を[0.2, 0.2, 0.2] に変更します。 [App Voice Experience (アプリ音声エクスペリエンス)] オブジェクトを[Voice Experience (音声エクスペリエンス)] スロットにアタッチします。
プロジェクトを保存して、[File (ファイル)] > [Build And Run (ビルドして実行)] をクリックし、ヘッドセットを装着してください。 アプリをテストするには、次のようにします。
右コントローラーのAボタンをタップして、Wit.aiをアクティブ化します。最初の発話がキャプチャされるまで、数秒待つことが必要な場合があります。 「ok」、「no (いいえ)」、「nope (いや)」、「yeah (うん)」、「maybe yes (多分)」、「of course (もちろん)」、「of course not (もちろん違う)」、「not ok (よくない)」、「I agree (そう)」、「I don’t think so (そうは思わない)」、「absolutely (絶対そう)」、「absolutely not (絶対違う)」」、「correct (その通り)」、「absolutely right (まさしくその通り)」などと言ってみてください。 新しい発話の場合は、Aボタンをもう一度タップします。