語音轉文本 (STT) 是一種技術,能自動將語音聲音生成文本。透過 STT,您可以創造更身臨其境的世界,讓玩家可以與 NPC 對話,無需預先錄製特定音訊即可生成文本,改善對有運動或視覺限制的玩家的可及性,並提供玩家透過語音快捷鍵進行無需雙手操作的控制,例如打開他們的物品欄或施法。
使用 Gingerbread House - Start .rbxl 文件作為起點,本教程將展示如何將從語音動態生成的文本添加到您的體驗中,包括如何實施 STT,以便玩家可以在您的 3D 世界中與物體互動的指導。
音訊對象
要創建 STT 音訊,了解您在本教程中將使用的音訊對象非常重要。STT 的音訊對象有三種類型:
- AudioDeviceInput 對象是現實世界中的物理硬體設備,例如筆記本電腦、手機或耳機中的麥克風。
- AudioSpeechToText 對象將語音聲音轉換為文本字符串。
- Wires 用於將音訊流從一個對象攜帶到另一個對象。
這些音訊對象協同工作,以生成對玩家行動的 STT 文本。例如,如果玩家在使用筆記本電腦玩體驗時佩戴耳機:
- AudioDeviceInput 捕捉玩家的語音,通過其麥克風以音訊流形式輸出。
- 一根 Wire 將音訊流從 AudioDeviceInput 攜帶到 AudioSpeechToText。
- AudioSpeechToText 將玩家的語音轉換為文本。
- 體驗讀取此文本並執行動作,例如在螢幕上顯示說出的文本或在玩家的指令下打開門。
啟用麥克風使用
在將 STT 添加到體驗之前,您必須首先啟用麥克風使用權並發布該體驗。
- 在 Studio 中打開 Gingerbread House - Start 文件。
- 創建本地副本。
- 發布您的本地副本的體驗。
- 返回 Studio,轉到 檔案 ⟩ 體驗設定 ⟩ 通信。
- 開啟 啟用麥克風。
- 保存更改。
添加簡單的語音捕捉
要將簡單的語音捕捉添加到您的 Gingerbread House - Start 文件的本地副本中:
啟用最新的語音 API 使用。
- 在 資源管理器 窗口中,選擇 VoiceChatService。
- 在 屬性 窗口中,將 UseAudioApi 設定為 Enabled。
創建基本的音訊對象讓您捕捉口語。
- 在 資源管理器 窗口中,轉到 Workspace > DialogueVolume。
- 刪除 DialogueVolume 文件夾內的所有對象。
- 將以下對象插入到 DialogueVolume 文件夾中:
- 一個 AudioDeviceInput 用於捕捉語音。
- 一個 AudioSpeechToText 用於將語音轉換為文本。
- 一根 Wire 用於將音訊流從音訊設備輸入攜帶到 STT 實例。
- 在 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 與遊戲玩法連接起來,讓玩家在對著麥克風說「Open Sesame」時打開姜餅屋的門:
創建一個遠程事件以連接客戶端和服務器。
- 將其命名為 OpenDoor。
添加一個新的腳本來動畫化打開姜餅屋的門。
- 在 ServerScriptService 下插入一個服務器端的 Script。
- 將其命名為 DoorService。
- 將以下代碼粘貼到新的腳本中:
-- 獲取共享的存儲服務 ReplicatedStorage 用於服務器和客戶端之間-- 獲取用於補間系統的 TweenServicelocal 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")-- 獲取客戶端將觸發至服務器的 RemoveEventlocal 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」。門應該會打開,讓您進入姜餅屋。