スピーチからテキストへの変換 (STT) は、音声音を自動的にテキストに変換する技術の一形態です。STTを使用することで、プレイヤーがNPCに話しかけることを可能にし、特定の音声を事前に録音することなくテキストを生成し、運動や視覚に制限のあるプレイヤーのアクセシビリティを向上させ、インベントリを開いたり呪文を唱えたりするための音声ショートカットを通じてプレイヤーにハンズフリーの操作を提供することで、より没入感のある世界を作成できます。
Gingerbread House - Start .rbxl ファイルを出発点として、このチュートリアルでは、プレイヤーが3D世界のオブジェクトと対話できるようにSTTを実装する方法を含め、音声から動的に生成されたテキストをゲームに追加する方法を示します。
音声オブジェクト
STT音声を作成するには、このチュートリアル全体で使用する音声オブジェクトを理解することが重要です。STTには3種類の音声オブジェクトがあります。
- AudioDeviceInput オブジェクトは、ラップトップ、電話、ヘッドセットなどの物理的なハードウェアデバイスです。
- AudioSpeechToText オブジェクトは、音声音をテキスト文字列に変換します。
- Wires は、音声ストリームをあるオブジェクトから別のオブジェクトに運びます。
これらの音声オブジェクトはすべて、プレイヤーのアクションに応じてSTTテキストを生成するために連携します。たとえば、プレイヤーがラップトップでゲームをプレイしているときにヘッドセットを着用している場合:
- AudioDeviceInput は、プレイヤーのマイクに話しかけた音声をキャプチャし、音声のストリームとして取得します。
- Wire は、AudioDeviceInput から AudioSpeechToText への音声ストリームを運びます。
- AudioSpeechToText は、プレイヤーの音声をテキストに変換します。
- ゲームはこのテキストを読み取り、画面に話されたテキストを表示したり、プレイヤーのコマンドでドアを開けたりするなどのアクションを実行します。
マイクの使用を有効にする
ゲームにSTTを追加する前に、まずマイクの使用を有効にし、ゲームを公開する必要があります。
- StudioでGingerbread House - Startファイルを開きます。
- ローカルコピーを作成します。
- ゲームのローカルコピーを公開します。
- Studioに戻り、ファイル ⟩ エクスペリエンス設定 ⟩ 通信に移動します。
- マイクを有効にするをオンにします。
- 変更を保存します。
簡単な音声キャプチャを追加
Gingerbread House - Startファイルのローカルコピーに簡単な音声キャプチャを追加するには:
最新の音声APIの使用を有効にします。
- Explorerウィンドウで、VoiceChatServiceを選択します。
- Propertiesウィンドウで、UseAudioApiをEnabledに設定します。
話された言葉をキャプチャするための基本的な音声オブジェクトを作成します。
- Explorerウィンドウで、Workspace > DialogueVolumeに移動します。
- DialogueVolumeフォルダー内のすべてのオブジェクトを削除します。
- DialogueVolumeフォルダーに次のオブジェクトを挿入します:
- 音声をキャプチャするためのAudioDeviceInput。
- 音声をテキストに変換するためのAudioSpeechToText。
- 音声デバイス入力からSTTインスタンスにストリームを運ぶためのWire。
- AudioSpeechToTextオブジェクトのPropertiesウィンドウで、Enabled状態をオンに設定します。
- WireオブジェクトのPropertiesウィンドウで:
- SourceInstanceを新しいAudioDeviceInputに設定して、この特定の音声インスタンスから音声を運ぶように指定します。
- TargetInstanceを新しいAudioSpeechToTextに設定して、この特定の音声インスタンスに音声を運ぶように指定します。
音声デバイス入力のPlayerプロパティをランタイムでローカルプレイヤーに設定します。これにより、Robloxはどのユーザーのマイクから音声をキャプチャするかを認識します。
- Explorerウィンドウで、StarterPlayer > StarterCharacterScriptsに移動します。
- LocalScriptを挿入し、名前をListenForMagicWordにします。
- 新しいローカルスクリプトに次のコードを貼り付けます:
local audioDeviceInput = workspace:WaitForChild('DialogueVolume'):WaitForChild('AudioDeviceInput')-- マイクをローカルプレイヤーにバインドしますaudioDeviceInput.Player = game.Players.LocalPlayer
音声キャプチャをテストする
簡単な音声キャプチャを追加した後、ゲームをプレイテストしてSTTの実装が正しく機能するか確認できます。マイクに話しかけると、AudioSpeechToTextプロパティに音声のテキストバージョンが表示されるはずです。
音声キャプチャをテストするには:
- テスト > クライアントとサーバーの下で、チームテストを選択します。
- 開始をクリックしてテストサーバーを開始します。
- 新しいテストサーバーで、マイクのミュートを解除し、いくつかの言葉を話します。
- Explorerウィンドウで、Workspace > DialogueVolume > AudioSpeechToTextに移動します。
- AudioSpeechToTextのPropertiesウィンドウで、マイクに話しかけた言葉がTextプロパティの値として表示されていることを確認します。
ゲームプレイでSTTを使用する
STTをゲームプレイに接続し、プレイヤーがマイクに「Open Sesame」と言ったときにジンジャーブレッドハウスのドアが開くようにするには:
クライアントとサーバーを接続するためのリモートイベントを作成します。
- 名前をOpenDoorにします。
ジンジャーブレッドハウスのドアを開くアニメーションを追加する新しいスクリプトを作成します。
- ServerScriptServiceの下にサーバー側のScriptを挿入します。
- 名前をDoorServiceにします。
- 新しいスクリプトに次のコードを貼り付けます:
-- サーバーとクライアント間の共有ストレージのためにReplicatedStorageサービスを取得-- ツイーニングシステムのためにTweenServiceを取得local ReplicatedStorage = game:GetService("ReplicatedStorage")local TweenService = game:GetService("TweenService")-- クライアントがサーバーにドアを開けるように要求できるようにしますlocal remoteEvent = ReplicatedStorage:WaitForChild("OpenDoor")-- ドアを下に移動させて開くアニメーションを実行する関数local function openDoor()local doorPart = workspace:WaitForChild("Door")local tweenInfo = TweenInfo.new(2, Enum.EasingStyle.Linear)local tween = TweenService:Create(doorPart, tweenInfo, {Position = doorPart.Position + Vector3.new(0, -15, 0)})tween:Play()end-- 関数をイベントに接続しますremoteEvent.OnServerEvent:Connect(openDoor)スピーチからテキストへの変換をドアに接続し、プレイヤーがマイクに話しかけたときにアクションが発生するようにします。
- StarterPlayer > StarterCharacterScriptsに移動します。
- 以前に作成したListenForMagicWordスクリプトを開きます。
- 次の行を追加します:
-- サーバーとクライアント間の共有ストレージのためにReplicatedStorageサービスを取得local ReplicatedStorage = game:GetService("ReplicatedStorage")-- クライアントがサーバーに発火するRemoveEventを取得local remoteEvent = ReplicatedStorage:WaitForChild("OpenDoor")-- シーングラフ内のSTTノードを見つけます-- ノードのTextプロパティは音声を認識するにつれて更新されますlocal speechToText = workspace:WaitForChild('DialogueVolume'):WaitForChild('AudioSpeechToText')-- STTがプレイヤーが「Open Sesame」と言ったことをキャプチャした場合にサーバーにドアを開けるように指示する関数speechToText:GetPropertyChangedSignal('Text'):Connect(function()local text = speechToText.Textif text == '' thenreturnendprint(text)if (text.find(text, 'open sesame') ~= nil) thenremoteEvent:FireServer()endspeechToText.Text = ''end)STTの実装をテストします。
- テスト > クライアントとサーバーの下で、チームテストを選択します。
- 開始をクリックしてテストサーバーを開始します。
- 新しいテストサーバーで、ドアに近づき、マイクのミュートを解除し、「Open Sesame」と言います。ドアが開き、ジンジャーブレッドハウスに入ることができるはずです。