语音转文本 (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 设置为 已启用。
创建基本音频对象以捕获说出的单词。
- 在 资源管理器 窗口中,转到 Workspace > DialogueVolume。
- 删除 DialogueVolume 文件夹中的所有对象。
- 在 DialogueVolume 文件夹中插入以下对象:
- 一个 AudioDeviceInput 用于捕获语音。
- 一个 AudioSpeechToText 用于将语音转换为文本。
- 一个 Wire 用于将流从音频设备输入传输到 STT 实例。
- 在 AudioSpeechToText 对象的 属性 窗口中,将 启用 状态设置为开启。
- 在 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”。门应该打开并允许您进入姜饼屋。