スピーチ・トゥ・テキスト(STT)は、音声サウンドから自動的にテキストを生成する技術の一種です。STTを使用すると、プレイヤーがNPCと会話できるようにしたり、特定の音声を事前に録音する必要なくテキストを生成したり、運動や視覚に制限のあるプレイヤーのためのアクセシビリティを改善したり、インベントリを開いたり呪文を唱えたりするために音声ショートカットを通じてハンズフリーの操作を提供したりすることで、より没入型の世界を作成できます。
ジンジャーブレッドハウス - スタート .rbxl ファイルを出発点として、このチュートリアルでは、スピーチから動的に生成されたテキストを体験に追加する方法を示し、プレイヤーが3Dワールド内のオブジェクトとインタラクションできるようにSTTを実装するためのガイダンスを提供します。
オーディオオブジェクト
STTオーディオを作成するには、このチュートリアル全体で使用するオーディオオブジェクトを理解することが重要です。STT用のオーディオオブジェクトには3種類あります:
- AudioDeviceInput オブジェクトは、ノートパソコン、電話、ヘッドセット内のマイクなど、現実世界内の物理ハードウェアデバイスです。
- AudioSpeechToText オブジェクトは、音声サウンドをテキスト文字列に変換します。
- Wiresは、オーディオストリームをあるオブジェクトから別のオブジェクトに運びます。
これらすべてのオーディオオブジェクトは、プレイヤーのアクションに応じてSTTテキストを生成するために連携して働きます。たとえば、プレイヤーがノートパソコンで体験をプレイしている間にヘッドセットを装着している場合:
- AudioDeviceInputは、プレイヤーのマイクに対する発話として音声をキャプチャし、オーディオストリームとして処理します。
- Wireは、AudioDeviceInputからAudioSpeechToTextへオーディオストリームを転送します。
- AudioSpeechToTextは、プレイヤーのスピーチをテキストに変換します。
- 体験はこのテキストを読み取り、発話された内容を画面に表示したり、プレイヤーのコマンドに応じてドアを開けたりします。
マイク使用の有効化
体験にSTTを追加する前に、まずマイクの使用を有効にし、体験を公開する必要があります。
- ジンジャーブレッドハウス - スタート ファイルをスタジオで開きます。
- ローカルコピーを作成します。
- 体験のローカルコピーを公開します。
- スタジオに戻り、ファイル ⟩ 体験設定 ⟩ 通信 に移動します。
- マイクを有効にする をオンにします。
- 変更を保存します。
簡単な音声キャプチャの追加
ジンジャーブレッドハウス - スタート ファイルに簡単な音声キャプチャを追加するには:
音声用の最新APIの使用を有効にします。
- エクスプローラーウィンドウで、VoiceChatService を選択します。
- プロパティウィンドウで、UseAudioApiをEnabledに設定します。
発話をキャプチャするための基本的なオーディオオブジェクトを作成します。
- エクスプローラーウィンドウで、Workspace > DialogueVolume に移動します。
- DialogueVolumeフォルダー内のすべてのオブジェクトを削除します。
- DialogueVolumeフォルダーに以下のオブジェクトを挿入します:
- スピーチをキャプチャするための AudioDeviceInput。
- スピーチをテキストに変換するための AudioSpeechToText。
- オーディオデバイス入力からSTTインスタンスにストリームを運ぶための Wire。
- AudioSpeechToTextオブジェクトのプロパティウィンドウで、Enabled状態をオンに設定します。
- Wireオブジェクトのプロパティウィンドウで:
- SourceInstanceを新しい AudioDeviceInput に設定して、この特定のオーディオインスタンスからオーディオを運ぶように指定します。
- TargetInstanceを新しい AudioSpeechToText に設定して、この特定のオーディオインスタンスにオーディオを運ぶように指定します。
オーディオデバイス入力の Player プロパティをランタイム時にローカルプレイヤーに設定します。これによりRobloxはどのユーザーのマイクからオーディオをキャプチャするかを認識します。
- エクスプローラーウィンドウで、StarterPlayer > StarterCharacterScripts に移動します。
- LocalScript を挿入し、名前を ListenForMagicWord にします。
- 新しいローカルスクリプトに以下のコードを貼り付けます:
local audioDeviceInput = workspace:WaitForChild('DialogueVolume'):WaitForChild('AudioDeviceInput')-- ローカルプレイヤーにマイクをバインドしますaudioDeviceInput.Player = game.Players.LocalPlayer
音声キャプチャのテスト
簡単な音声キャプチャを追加した後、体験をプレイテストしてSTTの実装が正しく機能しているか確認できます。マイクに向かって話すと、AudioSpeechToTextプロパティに音声のテキストバージョンが表示されるはずです。
音声キャプチャをテストするには:
- テスト > クライアントとサーバーの下で、チームテストを選択します。
- スタートをクリックしてテストサーバーを開始します。
- 新しいテストサーバーで、マイクのミュートを解除し、いくつかの単語を話します。
- エクスプローラーウィンドウで、Workspace > DialogueVolume > AudioSpeechToText に移動します。
- AudioSpeechToTextのプロパティウィンドウで、マイクに向かって話した言葉がTextプロパティの値として表示されていることを確認します。
ゲームプレイとSTTの使用
プレイヤーがマイクに向かって「オープン セサミ」と言ったときにジンジャーブレッドハウスのドアが開くようにSTTをゲームプレイに接続します:
クライアントとサーバーを接続するためのリモートイベントを作成します。
- 名前を OpenDoor にします。
ジンジャーブレッドハウスのドアを開くアニメーションを追加するための新しいスクリプトを追加します。
- ServerScriptServiceの下に、サーバーサイドの Script を挿入します。
- 名前を DoorService にします。
- 新しいスクリプトに以下のコードを貼り付けます:
-- サーバーとクライアント間の共有ストレージのためにReplicatedStorageサービスを取得-- Tweeningシステムのために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がプレイヤーが「オープン セサミ」と言うのを捕らえた場合、サーバーにドアを開けるように伝える関数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の実装をテストします。
- テスト > クライアントとサーバーの下で、チームテストを選択します。
- スタートをクリックしてテストサーバーを開始します。
- 新しいテストサーバーで、ドアに近づき、マイクのミュートを解除し、「オープン セサミ」と言います。ドアが開いてジンジャーブレッドハウスに入れるはずです。