語音轉文字 (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 服務以便在服務器和客戶端之間共享存儲-- 獲取 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")-- 獲取客戶端將觸發到服務器的 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"。門應該會打開,讓您進入薑餅屋。