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 asistiva que convierte cadenas de texto en sonidos de voz utilizando una voz artificial. Además de mejorar la accesibilidad de tus juegos para jugadores con discapacidades visuales, de movilidad o cognitivas, TTS te permite generar voz de manera dinámica para que no tengas que grabar audio previamente para todos los posibles escenarios narrativos.

Usando el archivo Gingerbread House - Start .rbxl como punto de partida y Gingerbread House - Text-to-Speech como referencia, este tutorial te muestra cómo agregar audio TTS básico y consciente del contexto a tus juegos, incluyendo orientación sobre:

  • Activar TTS para escenarios de juego comunes que nunca cambiarán, como interacciones de UI y tutoriales.
  • Configurar TTS para que se adapte a las acciones del jugador, el estado ambiental o los objetivos flexibles.

Si en algún momento te quedas atascado en el proceso, puedes usar Gingerbread House - Text-to-Speech 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 transportan 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 usando un ejemplo de un jugador que usa auriculares mientras juega en su computadora portátil:

  • 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 del audio TTS desde el 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 devuelve a sus auriculares.
  • El objeto AudioDeviceOutput transporta el sonido desde el AudioListener al altavoz físico del jugador, o en este caso, a sus auriculares.

Las siguientes secciones profundizan más y hacen referencia a estos objetos mientras aprendes a reproducir audio tanto básico como consciente del contexto. A medida que revises estos objetos con las próximas técnicas, podrás predecir con mayor precisión cómo capturar y alimentar sonido del juego 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 importar 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 sin importar el 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 UI, 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 anfitrión
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 - Text-to-Speech:

  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 el juego, el motor automáticamente:
      • Crea un AudioListener bajo el 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 del juego.
      • 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 transportar el flujo desde el generador de audio de voz al emisor de audio.
  3. Selecciona el objeto AudioTextToSpeech, luego en la ventana Properties:
    1. Establece Text en "¡Recoge cada último 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 del juego.
  4. Selecciona el Wire, luego en la ventana Properties:
    1. Establece SourceInstance en tu nuevo AudioTextToSpeech para especificar que deseas que el cable transporte audio desde este generador de audio específico.
    2. Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro del volumen.
  5. De vuelta en la ventana Explorer, navega a StarterPlayerStarterCharacterScripts, luego inserta un LocalScript, renómbralo a 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 funcionalidad. Para cada personaje jugador que carga o respawnea en el juego, 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 manejadora del evento 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 entonces:

  • 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 previene 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. Prueba el 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 la necesidad de grabar y subir un nuevo archivo de audio para cada escenario.

TTS Consciente del Contexto

El TTS consciente del 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 adaptan en consecuencia.

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

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


Cada objeto gumpdrop tiene atributos que describen su color y ubicación en el entorno.
Una vista cercana del gumpdrop amarillo
Una vista cercana del gumpdrop verde
Una vista cercana del gumpdrop rojo

Para recrear el audio TTS 3D consciente del contexto en el archivo de muestra Gingerbread House - Text-to-Speech:

  1. En la ventana Explorer, navega a WorkspaceGumDrops.

  2. Configura tres atributos personalizados para rastrear el gumpdrop amarillo.

    1. Selecciona el gumpdrop amarillo, luego en la ventana Properties, navega a la sección Attributes, luego haz clic en el ícono de más. Se muestra 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 utilizando los siguientes valores.
    NombreTipoValor
    HintOrdernumber0
    LocationDescriptionstringjunto a la cascada
  3. Configura tres atributos personalizados para rastrear el gumpdrop verde.

    1. En la ventana Explorer, selecciona el gumpdrop verde.
    2. En la ventana Properties, crea tres atributos utilizando los siguientes valores.
    NombreTipoValor
    ColorDescriptionstringgreen
    HintOrdernumber1
    LocationDescriptionstringen el borde
  4. Configura tres atributos personalizados para rastrear el gumpdrop rojo.

    1. En la ventana Explorer, selecciona el gumpdrop rojo.
    2. En la ventana Properties, crea tres atributos utilizando 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 audio 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 transportar el flujo desde el generador de audio 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 deseas que el cable transporte audio desde este generador de audio específico.
    2. Establece TargetInstance en tu nuevo AudioEmitter para especificar que deseas que el cable transporte audio a este emisor de audio específico dentro del volumen.
  7. De vuelta en la ventana Explorer, navega a StarterPlayerStarterCharacterScripts, luego inserta un LocalScript, renómbralo a 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 gumpdrops. 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 .. " gumpdrops. Busca el " .. colorDescription .. " " .. locationDescription .. "."
or "Queda un gumpdrop. 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("El jugador tocó el volumen.")
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 funcionalidad. Para cada personaje jugador que carga o respawnea en el juego, 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 gumpdrop Part dentro de la carpeta Gumdrops y filtra cualquier parte que el jugador haya recogido. Los gumpdrops restantes se ordenan en un orden específico de acuerdo con el atributo HintOrder de cada gumpdrop.

La función getReindeerHint(remainingGumdrops) del script toma esa lista de getRemainingGumdrops() y devuelve un mensaje de cadena que describe dónde el jugador puede encontrar los gumpdrops restantes, incluyendo tanto la descripción de color como la descripción de ubicación del siguiente gumpdrop que el jugador necesita recoger. Sin embargo, si el jugador ha recogido todos los gumpdrops en el entorno, el mensaje de cadena describe a dónde ir a continuación después de que haya recogido todos los gumpdrops en el entorno.

Cuando algo colisiona con el volumen, la función manejadora del evento 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 entonces:

  • Establece debounce en true.
  • Obtiene la lista de gumpdrops restantes y el mensaje de cadena que describe el siguiente gumpdrop que el jugador necesita encontrar.
  • Convierte la cadena en audio usando el objeto AudioTextToSpeech, reproduce el audio y espera a que el audio 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 consciente del contexto termine de reproducirse es un patrón de debounce que previene 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. Prueba el juego 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 los gumpdrops 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.