Tutoriales intermedios

Agregar texto a voz

*Este contenido se traduce usando la IA (Beta) y puede contener errores. Para ver esta página en inglés, haz clic en aquí.

Texto a voz es una forma de tecnología de asistencia que convierte cadenas de texto en sonidos de voz usando una voz artificial. Además de mejorar la accesibilidad de tus experiencias para jugadores con discapacidades visuales, de movilidad o cognitivas, TTS te permite generar voz dinámicamente, de modo que no tengas que grabar audio de antemano para todos los posibles escenarios narrativos.

Utilizando el archivo Gingerbread House - Start .rbxl como punto de partida y Gingerbread House - Texto a Voz como referencia, este tutorial te muestra cómo agregar tanto audio TTS básico como sensible al contexto a tus experiencias, incluyendo guía sobre:

  • Activar TTS para escenarios comunes de juego que nunca cambiarán, como interacciones con la interfaz de usuario (UI) y tutoriales.
  • Configurar TTS para que se adapte a las acciones de los jugadores, el estado ambiental o los objetivos flexibles.

Si en algún momento te quedas atascado en el proceso, puedes usar Gingerbread House - Texto a Voz como referencia para comparar tu progreso.

Objetos de Audio

Para crear audio TTS, es importante entender los objetos de audio con los que estarás trabajando a lo largo de este tutorial. Hay cinco tipos principales de objetos de audio para TTS:

  • El objeto AudioTextToSpeech convierte cadenas de texto en sonidos de voz.
  • El objeto AudioEmitter es un altavoz virtual que emite audio en el entorno 3D.
  • El objeto AudioListener es un micrófono virtual que recoge audio del entorno 3D.
  • El objeto AudioDeviceOutput es un dispositivo de hardware físico en el mundo real, como un altavoz o auriculares.
  • Wires transporta flujos de audio de un objeto a otro.

Todos estos objetos de audio trabajan juntos para emitir sonido TTS en respuesta a las acciones del jugador. Veamos cómo funciona esto en la práctica para audio 3D utilizando un ejemplo de un jugador que lleva un auricular mientras juega una experiencia con su laptop:

  • El AudioTextToSpeech carga y convierte texto en audio cada vez que un jugador toca una parte cerca de un personaje no jugable (NPC).
  • El AudioEmitter emite un flujo de audio TTS del NPC al entorno 3D.
  • Un Wire transporta el flujo desde el AudioTextToSpeech al AudioEmitter para que el flujo salga del NPC.
  • El objeto hijo AudioListener del personaje escucha ese sonido dentro del entorno 3D y lo retroalimenta a sus auriculares.
  • El objeto AudioDeviceOutput transporta el sonido desde el AudioListener al altavoz físico del jugador, o en este caso, sus auriculares.

Las siguientes secciones profundizan más y hacen referencia a estos objetos mientras aprendes a reproducir tanto audio básico como sensible al contexto. A medida que revises estos objetos con las próximas técnicas, podrás predecir con mayor precisión cómo captar y alimentar sonido de la experiencia al jugador.

TTS Básico

El TTS básico es la forma más común de texto a voz en la que la voz artificial lee una cadena de texto sin considerar el contexto del jugador o del entorno. Esto significa que cada vez que el jugador activa el audio TTS, las palabras y la forma en que la voz artificial lee las palabras permanecen consistentes independientemente del estado del jugador, sus acciones o el estado ambiental.

Esta forma de TTS es útil en la mayoría de los escenarios de juego, como jugadores interactuando con menús de la interfaz de usuario, tutoriales o interacciones rutinarias con NPC como ofertas de vendedores o gritos de enemigos. Roblox proporciona los siguientes tipos de voces con las que puedes experimentar para cualquiera de estas interacciones:

VoiceIDDescripción de la VozEjemplo de Audio
1Masculino británico
2Femenino británico
3Masculino de Estados Unidos #1
4Femenino de Estados Unidos #1
5Masculino de Estados Unidos #2
6Femenino de Estados Unidos #2
7Masculino australiano
8Femenino australiano
9Voz retro #1
10Voz retro #2
11Voz de presentador
101Masculino español
102Femenino español
201Masculino alemán
202Femenino alemán
301Masculino italiano
302Femenino italiano
401Masculino francés
402Femenino francés

Para recrear el audio TTS 3D básico en el archivo de muestra Gingerbread House - Texto a Voz:

  1. Habilita un oyente predeterminado que esté adjunto a tu personaje jugador.
    1. En la ventana Explorer, selecciona SoundService.
    2. En la ventana Properties, establece DefaultListenerLocation en Character. Cuando ejecutes la experiencia, el motor automáticamente:
      • Crea un AudioListener bajo Humanoid.RootPart de cada personaje jugador para que puedas escuchar los sonidos cambiar en tus altavoces del mundo real de acuerdo con la posición y escala de las fuentes de sonido dentro de la experiencia.
      • Crea un AudioDeviceOutput bajo SoundService.
  2. En la ventana Explorer, navega a WorkspaceDialogueVolume, luego:
    1. Inserta un objeto AudioTextToSpeech para crear un generador de audio de voz para el volumen alrededor del muñeco de nieve.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde DialogueVolume.
    3. Inserta un objeto Wire para llevar el flujo desde el generador de voz de audio hasta el emisor de audio.
  3. Selecciona el objeto AudioTextToSpeech, luego en la ventana Properties:
    1. Establece Text en "¡Recolecta cada galleta de gumpdrop para abrir mi casa!"
    2. Establece VoiceId en 2 para que la voz artificial emule a una mujer británica.
    3. Establece el Volume en 3 para reproducir el audio a un volumen alto para que escuches el sonido TTS sobre otras fuentes de audio dentro de la experiencia.
  4. Selecciona el Wire, luego en la ventana Properties:
    1. Establece SourceInstance en tu nuevo AudioTextToSpeech para especificar que quieres que el cable lleve audio de este generador de voz específico.
    2. Establece TargetInstance en tu nuevo AudioEmitter para especificar que quieres que el cable lleve audio a este emisor de audio específico dentro del volumen.
  5. De regreso en la ventana Explorer, navega a StarterPlayerStarterCharacterScripts, luego inserta un LocalScript, renómbralo PlayBasicTTSAudioWhenInVolume, y pega el siguiente código en el script local:

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoid = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.DialogueVolume
local trigger = humanoid:WaitForChild("Animator")
local debounce = false
local localPlayer = Players.LocalPlayer
volumeDetector.Touched:Connect(function(hit)
if debounce then
return
end
local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
if hitPlayer ~= localPlayer then
return
end
debounce = true
local audioTextToSpeech = Workspace.DialogueVolume.AudioTextToSpeech
audioTextToSpeech:Play()
audioTextToSpeech.Ended:Wait()
debounce = false
end)

Este script comienza obteniendo los servicios Workspace y Players para poder hacer referencia a sus hijos y funcionalidades. Para cada personaje jugador que carga o reaparece en la experiencia, el script espera por:

  • Los objetos Humanoid y Animator del personaje.
  • El objeto de volumen en el espacio de trabajo llamado DialogueVolume.

Cuando algo colisiona con el volumen, la función del manejador de eventos Touched obtiene el primer ancestro que es un Model, que debería ser el personaje si la BasePart que colisionó con el volumen es un descendiente de un modelo de personaje. Si lo es, la función luego:

  • Establece debounce en true.
  • Reproduce y espera a que el audio TTS termine.
  • Establece debounce de nuevo en false.

Cambiar debounce de false a true y de nuevo a false después de que el audio TTS básico termine de reproducirse es un patrón de debounce que evita que el audio se active repetidamente a medida que los jugadores colisionan continuamente con el volumen. Para más información sobre este patrón de debounce, consulta Debounce - Detectar colisiones.

  1. Realiza pruebas del juego para escuchar el diálogo instructivo del personaje cuando tu personaje jugador toca el volumen alrededor del muñeco de nieve.

Puedes experimentar aún más con este audio modificando las propiedades Text, VoiceID, Pitch, y Speed a nuevos valores. El discurso generado se vuelve completamente diferente sin necesidad de grabar y subir un nuevo archivo de audio para cada escenario.

TTS Sensible al Contexto

El TTS sensible al contexto es una forma más avanzada de texto a voz en la que la voz artificial lee una cadena de texto en relación con el jugador, el estado de su entorno o el estado del juego. Esto significa que cada vez que el jugador activa el audio TTS, las palabras y la forma en que la voz artificial lee las palabras se adapta en consecuencia.

Esta forma de TTS es útil para escenarios de juego que están en constante cambio, como indicaciones de audio direccionales, estado de objetivos o interacciones únicas con NPC. Como consecuencia, dado que el TTS sensible al contexto necesita transformarse para ser preciso, debes configurar elementos del juego de manera que puedas rastrear su estado a medida que los jugadores navegan a través del entorno y completan objetivos de juego.

Aunque hay muchas formas de lograr esta tarea, la muestra utiliza atributos personalizados para rastrear el color y ubicación de cada galleta que el jugador debe recolectar para entrar en la casa de jengibre. Para más información sobre atributos, consulta Propiedades y atributos.


Cada objeto galleta tiene atributos que describen su color y ubicación en el entorno.
Una vista cercana de la galleta amarilla
Una vista cercana de la galleta verde
Una vista cercana de la galleta roja

Para recrear el audio TTS 3D sensible al contexto en el archivo de muestra Gingerbread House - Texto a Voz:

  1. En la ventana Explorer, navega a WorkspaceGumDrops.

  2. Configura tres atributos personalizados para rastrear la galleta amarilla.

    1. Selecciona la galleta amarilla, luego en la ventana Properties, navega a la sección Attributes, luego haz clic en el icono de más. Se mostrará un cuadro de diálogo emergente.
    2. En el campo Name, ingresa ColorDescription.
    3. En el menú desplegable Type, selecciona string.
    4. Haz clic en el botón Save.
    5. Establece el nuevo atributo ColorDescription en yellow.
    6. Usando este proceso, crea dos atributos más con los siguientes valores.
    NombreTipoValor
    HintOrdernumber0
    LocationDescriptionstringjunto a la cascada
  3. Configura tres atributos personalizados para rastrear la galleta verde.

    1. En la ventana Explorer, selecciona la galleta verde.
    2. En la ventana Properties, crea tres atributos usando los siguientes valores.
    NombreTipoValor
    ColorDescriptionstringgreen
    HintOrdernumber1
    LocationDescriptionstringen la cornisa
  4. Configura tres atributos personalizados para rastrear la galleta roja.

    1. En la ventana Explorer, selecciona la galleta roja.
    2. En la ventana Properties, crea tres atributos usando los siguientes valores.
    NombreTipoValor
    ColorDescriptionstringred
    HintOrdernumber2
    LocationDescriptionstringdetrás de la cerca
  5. En la ventana Explorer, navega a WorkspaceHintVolume, luego:

    1. Inserta un objeto AudioTextToSpeech para crear un generador de voz para el volumen alrededor de los renos.
    2. Inserta un objeto AudioEmitter para emitir un flujo posicional desde HintVolume.
    3. Inserta un objeto Wire para llevar el flujo desde el generador de voz al emisor de audio.
  6. Selecciona el Wire, luego en la ventana Properties:

    1. Establece SourceInstance en tu nuevo AudioTextToSpeech para especificar que quieres que el cable lleve audio de este generador de voz específico.
    2. Establece TargetInstance en tu nuevo AudioEmitter para especificar que quieres que el cable lleve audio a este emisor de audio específico dentro del volumen.
  7. De regreso en la ventana Explorer, navega a StarterPlayerStarterCharacterScripts, luego inserta un LocalScript, renómbralo PlayContextTTSAudioWhenInVolume, y pega el siguiente código en el script local:


local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoid = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.HintVolume
local trigger = humanoid:WaitForChild("Animator")
local debounce = false
local localPlayer = Players.LocalPlayer
function getRemainingGumdrops(): {Part}
local gumdropsFolder = Workspace.Gumdrops
local gumdrops = gumdropsFolder:GetChildren()
local remainingGumdrops = {};
for _, gumdrop in gumdrops do
if gumdrop:GetAttribute("Active") then
remainingGumdrops[#remainingGumdrops + 1] = gumdrop
end
end
table.sort(remainingGumdrops, function(a, b)
return a:GetAttribute("HintOrder") < b:GetAttribute("HintOrder")
end)
return remainingGumdrops
end
function getReindeerHint(remainingGumdrops: {Part}): string
local remainingGumdrops = getRemainingGumdrops()
if (#remainingGumdrops == 0) then
return "No quedan galletas. Revisa dentro de la casa."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Quedan " .. #remainingGumdrops .. " galletas. Busca la " .. colorDescription .. " " .. locationDescription .. "."
or "Queda una galleta. Es " .. colorDescription .. " y está " .. locationDescription .. "."
return message
end
volumeDetector.Touched:Connect(function(hit)
if debounce then
return
end
local hitCharacter = hit:FindFirstAncestorWhichIsA("Model")
local hitPlayer = Players:GetPlayerFromCharacter(hitCharacter)
if hitPlayer ~= localPlayer then
return
end
print("Player touched volume.")
debounce = true
local remainingGumdrops = getRemainingGumdrops()
local message = getReindeerHint(remainingGumdrops)
local audioTextToSpeech = Workspace.HintVolume.AudioTextToSpeech
audioTextToSpeech.Text = message
audioTextToSpeech:Play()
audioTextToSpeech.Ended:Wait()
debounce = false
end)

Este script comienza obteniendo los servicios Workspace y Players para poder hacer referencia a sus hijos y funcionalidades. Para cada personaje jugador que carga o reaparece en la experiencia, el script espera por:

  • Los objetos Humanoid y Animator del personaje.
  • El objeto de volumen en el espacio de trabajo llamado HintVolume.

La función getRemainingGumdrops() del script devuelve una lista de objetos galleta Part dentro de la carpeta Gumdrops y filtra cualquier parte que el jugador ha recolectado. Las galletas restantes se ordenan en un orden específico de acuerdo con el atributo HintOrder de cada galleta.

La función getReindeerHint(remainingGumdrops) del script toma esa lista de getRemainingGumdrops() y devuelve un mensaje en forma de cadena que describe dónde el jugador puede encontrar las galletas restantes, incluyendo tanto la descripción de color como la descripción de ubicación de la siguiente galleta que el jugador necesita recolectar. Sin embargo, si el jugador ha recolectado todas las galletas en el entorno, el mensaje en forma de cadena describe a dónde ir después de que han recolectado todas las galletas en el entorno.

Cuando algo colisiona con el volumen, la función del manejador de eventos Touched obtiene el primer ancestro que es un Model, que debería ser el personaje si la BasePart que colisionó con el volumen es un descendiente de un modelo de personaje. Si lo es, la función luego:

  • Establece debounce en true.
  • Obtiene la lista de galletas restantes y el mensaje en forma de cadena que describe la siguiente galleta que el jugador necesita encontrar.
  • Convierte la cadena en audio usando el objeto AudioTextToSpeech, reproduce el audio y espera a que termine.
  • Establece debounce de nuevo en false.

Cambiar debounce de false a true y de nuevo a false después de que el audio TTS sensible al contexto termine de reproducirse es un patrón de debounce que evita que el audio se active repetidamente a medida que los jugadores colisionan continuamente con el volumen. Para más información sobre este patrón de debounce, consulta Debounce - Detectar colisiones.

  1. Realiza pruebas de las experiencias para escuchar pistas contextuales cuando tu personaje jugador toca el volumen alrededor de los renos. El audio TTS cambia de acuerdo con el número y color de las galletas que el personaje jugador ya ha encontrado en el entorno.

©2026 Roblox Corporation. Roblox, el logotipo de Roblox y "Powering Imagination" son algunas de nuestras marcas registradas y no registradas en los Estados Unidos y otros países.