Tutoriais intermediários

Adicionar texto-para-fala

*Este conteúdo é traduzido por IA (Beta) e pode conter erros. Para ver a página em inglês, clique aqui.

Texto-para-fala é uma forma de tecnologia assistiva que converte strings de texto em sons de fala usando uma voz artificial. Além de melhorar a acessibilidade de suas experiências para jogadores com deficiências visuais, de mobilidade ou cognitivas, o TTS permite que você gere fala dinamicamente, para que não precise gravar áudio previamente para todos os possíveis cenários narrativos.

Usando o arquivo Gingerbread House - Start .rbxl como ponto de partida e Gingerbread House - Texto-Para-Fala como referência, este tutorial mostra como adicionar áudio TTS básico e adaptado ao contexto às suas experiências, incluindo orientações sobre:

  • Acionar TTS para cenários de jogo comuns que nunca mudarão, como interações com a interface do usuário e tutoriais.
  • Configurar o TTS para que se adapte às ações dos jogadores, ao estado ambiental ou a objetivos flexíveis.

Se a qualquer momento você ficar preso no processo, poderá usar Gingerbread House - Texto-Para-Fala como referência para comparar seu progresso.

Objetos de Áudio

Para criar áudio TTS, é importante entender os objetos de áudio com os quais você estará trabalhando ao longo deste tutorial. Existem cinco tipos principais de objetos de áudio para TTS:

  • O objeto AudioTextToSpeech converte strings de texto em sons de fala.
  • O objeto AudioEmitter é um alto-falante virtual que emite áudio no ambiente 3D.
  • O objeto AudioListener é um microfone virtual que capta áudio do ambiente 3D.
  • O objeto AudioDeviceOutput é um dispositivo de hardware físico no mundo real, como um alto-falante ou fones de ouvido.
  • Wires transporta streams de áudio de um objeto para outro.

Todos esses objetos de áudio trabalham juntos para emitir som TTS em resposta às ações dos jogadores. Vamos dar uma olhada em como isso funciona na prática para áudio 3D usando um exemplo de um jogador usando um fone de ouvido enquanto joga uma experiência com seu laptop:

  • O AudioTextToSpeech carrega e converte texto em áudio sempre que um jogador toca uma parte próxima a um personagem não jogável (NPC).
  • O AudioEmitter emite um stream do áudio TTS do NPC para o ambiente 3D.
  • Um Wire transporta o stream do AudioTextToSpeech para o AudioEmitter para que o stream saia do NPC.
  • O objeto filho AudioListener do personagem escuta esse som dentro do ambiente 3D e o retroalimenta para seus fones de ouvido.
  • O objeto AudioDeviceOutput transporta o som do AudioListener para o alto-falante físico do jogador ou, neste caso, para seus fones de ouvido.

As próximas seções aprofundam-se e referenciam esses objetos enquanto você aprende a reproduzir áudio básico e adaptado ao contexto. À medida que você revisa esses objetos com as técnicas que se seguirão, poderá prever com mais precisão como capturar e alimentar o som da experiência para o jogador.

TTS Básico

TTS básico é a forma mais comum de texto-para-fala em que a voz artificial lê uma string de texto independentemente do contexto do jogador ou do ambiente. Isso significa que sempre que o jogador aciona o áudio TTS, as palavras e a forma como a voz artificial lê as palavras permanecem consistentes, não importando o estado do jogador, suas ações ou o status ambiental.

Essa forma de TTS é útil na maioria dos cenários de jogo, como jogadores interagindo com menus de interface do usuário, tutoriais ou interações rotineiras com NPCs, como ofertas de vendedores ou chamadas de inimigos. O Roblox fornece os seguintes tipos de vozes com as quais você pode experimentar para qualquer uma dessas interações:

VoiceIDDescrição da VozExemplo de Áudio
1Masculino britânico
2Feminino britânico
3Masculino dos Estados Unidos #1
4Feminino dos Estados Unidos #1
5Masculino dos Estados Unidos #2
6Feminino dos Estados Unidos #2
7Masculino australiano
8Feminino australiano
9Voz retro #1
10Voz retro #2
11Voz de apresentador
101Masculino espanhol
102Feminino espanhol
201Masculino alemão
202Feminino alemão
301Masculino italiano
302Feminino italiano
401Masculino francês
402Feminino francês

Para recriar o áudio TTS básico em 3D no arquivo de exemplo Gingerbread House - Texto-Para-Fala:

  1. Ative um ouvinte padrão que esteja anexado ao seu personagem jogador.
    1. Na janela Explorer, selecione o SoundService.
    2. Na janela Properties, defina DefaultListenerLocation como Character. Quando você executar a experiência, o mecanismo automaticamente:
      • Cria um AudioListener sob o Humanoid.RootPart de cada personagem jogador, para que você possa ouvir os sons mudarem em seus alto-falantes do mundo real de acordo com a posição e escala das fontes de som dentro da experiência.
      • Cria um AudioDeviceOutput sob o SoundService.
  2. Na janela Explorer, navegue até WorkspaceDialogueVolume, então:
    1. Insira um objeto AudioTextToSpeech para criar um gerador de fala de áudio para o volume ao redor do boneco de neve.
    2. Insira um objeto AudioEmitter para emitir um stream posicional do DialogueVolume.
    3. Insira um objeto Wire para carregar o stream do gerador de fala de áudio para o emissor de áudio.
  3. Selecione o objeto AudioTextToSpeech, então na janela Properties:
    1. Defina Text como "Cole cada último gumpdrop para abrir minha casa!"
    2. Defina VoiceId para 2 para configurar a voz artificial para emular uma feminina britânica.
    3. Defina o Volume como 3 para tocar o áudio em um volume alto, para que você ouça o som do TTS sobre outras fontes de áudio dentro da experiência.
  4. Selecione o Wire, então na janela Properties:
    1. Defina SourceInstance para seu novo AudioTextToSpeech para especificar que você quer que o fio carregue áudio deste gerador de fala específico.
    2. Defina TargetInstance para seu novo AudioEmitter para especificar que você quer que o fio carregue áudio para este emissor de áudio específico dentro do volume.
  5. De volta na janela Explorer, navegue até StarterPlayerStarterCharacterScripts, então insira um LocalScript, renomeie-o como PlayBasicTTSAudioWhenInVolume, e cole o seguinte código no script local:

local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoide = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.DialogueVolume
local trigger = humanoide: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 começa obtendo os serviços Workspace e Players para que possa referenciar seus filhos e funcionalidades. Para cada personagem jogador que carrega ou renasce na experiência, o script espera por:

  • O Humanoid e os objetos Animator do personagem.
  • O objeto de volume no espaço de trabalho chamado DialogueVolume.

Quando qualquer coisa colide com o volume, a função manipuladora de eventos Touched obtém o primeiro ancestral que é um Model, que deve ser o personagem se a BasePart que colidiu com o volume for um descendente de um modelo de personagem. Se for, a função então:

  • Define debounce como true.
  • Toca e aguarda o áudio TTS finalizar.
  • Define debounce de volta como false.

Definir debounce de false para true e novamente para false após a finalização do áudio TTS básico é um padrão de debounce que impede que o áudio seja acionado repetidamente à medida que os jogadores colidem continuamente com o volume. Para mais informações sobre este padrão de debounce, consulte Debounce - Detectar colisões.

  1. Teste a experiência para ouvir o diálogo instrucional do personagem quando seu personagem jogador toca o volume ao redor do boneco de neve.

Você pode experimentar ainda mais com este áudio modificando as propriedades Text, VoiceID, Pitch e Speed para novos valores. A fala gerada se torna totalmente diferente sem a necessidade de gravar e enviar um novo arquivo de áudio para cada cenário.

TTS Adaptado ao Contexto

O TTS adaptado ao contexto é uma forma mais avançada de texto-para-fala na qual a voz artificial lê uma string de texto em relação ao jogador, ao estado de seu ambiente ou ao status do jogo. Isso significa que sempre que o jogador aciona o áudio TTS, as palavras e a forma como a voz artificial lê as palavras se adaptam de acordo.

Essa forma de TTS é útil para cenários de jogo que estão em constante mudança, como indicações de áudio direcionais, status de objetivos ou interações únicas com NPCs. Consequentemente, como o TTS adaptado ao contexto precisa se transformar para ser preciso, você deve configurar elementos do jogo de modo que possa acompanhar seu status à medida que os jogadores navegam pelo ambiente e completam objetivos de jogo.

Embora haja muitas maneiras de realizar essa tarefa, o exemplo utiliza atributos personalizados para rastrear a cor e localização de cada gumpdrop que o jogador deve coletar para entrar na casa de gengibre. Para mais informações sobre atributos, consulte Propriedades e atributos.


Cada objeto gumpdrop tem atributos que descrevem sua cor e localização no ambiente.
Uma visão aproximada do gumpdrop amarelo
Uma visão aproximada do gumpdrop verde
Uma visão aproximada do gumpdrop vermelho

Para recriar o áudio TTS 3D adaptado ao contexto no arquivo de exemplo Gingerbread House - Texto-Para-Fala:

  1. Na janela Explorer, navegue até WorkspaceGumDrops.

  2. Configure três atributos personalizados para rastrear o gumpdrop amarelo.

    1. Selecione o gumpdrop amarelo, então na janela Properties, navegue até a seção Attributes, então clique no ícone de mais. Um diálogo pop-up será exibido.
    2. No campo Name, insira ColorDescription.
    3. No menu suspenso Type, selecione string.
    4. Clique no botão Save.
    5. Defina o novo atributo ColorDescription como amarelo.
    6. Usando este processo, crie mais dois atributos usando os seguintes valores.
    NomeTipoValor
    HintOrdernúmero0
    LocationDescriptionstringperto da cachoeira
  3. Configure três atributos personalizados para rastrear o gumpdrop verde.

    1. Na janela Explorer, selecione o gumpdrop verde.
    2. Na janela Properties, crie três atributos usando os seguintes valores.
    NomeTipoValor
    ColorDescriptionstringverde
    HintOrdernúmero1
    LocationDescriptionstringna borda
  4. Configure três atributos personalizados para rastrear o gumpdrop vermelho.

    1. Na janela Explorer, selecione o gumpdrop vermelho.
    2. Na janela Properties, crie três atributos usando os seguintes valores.
    NomeTipoValor
    ColorDescriptionstringvermelho
    HintOrdernúmero2
    LocationDescriptionstringatrás da cerca
  5. Na janela Explorer, navegue até WorkspaceHintVolume, então:

    1. Insira um objeto AudioTextToSpeech para criar um gerador de fala de áudio para o volume ao redor da rena.
    2. Insira um objeto AudioEmitter para emitir um stream posicional do HintVolume.
    3. Insira um objeto Wire para carregar o stream do gerador de fala de áudio para o emissor de áudio.
  6. Selecione o Wire, então na janela Properties:

    1. Defina SourceInstance para seu novo AudioTextToSpeech para especificar que você quer que o fio carregue áudio deste gerador de fala específico.
    2. Defina TargetInstance para seu novo AudioEmitter para especificar que você quer que o fio carregue áudio para este emissor de áudio específico dentro do volume.
  7. De volta na janela Explorer, navegue até StarterPlayerStarterCharacterScripts, então insira um LocalScript, renomeie-o como PlayContextTTSAudioWhenInVolume, e cole o seguinte código no script local:


local Workspace = game:GetService("Workspace")
local Players = game:GetService("Players")
local humanoide = script.Parent:WaitForChild("Humanoid")
local volumeDetector = Workspace.HintVolume
local trigger = humanoide: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 "Não há gumpdrops restantes. Verifique dentro da casa."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Ainda existem " .. #remainingGumdrops .. " gumpdrops restantes. Procure o " .. colorDescription .. " " .. locationDescription .. "."
or "Há um gumpdrop restante. É " .. colorDescription .. " e 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("O jogador tocou o 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 começa obtendo os serviços Workspace e Players para que possa referenciar seus filhos e funcionalidades. Para cada personagem jogador que carrega ou renasce na experiência, o script espera por:

  • O Humanoid e os objetos Animator do personagem.
  • O objeto de volume no espaço de trabalho chamado HintVolume.

A função getRemainingGumdrops() do script retorna uma lista de objetos Part gumpdrop dentro da pasta Gumdrops e filtra qualquer parte que o jogador tenha coletado. Os gumpdrops restantes são ordenados em uma ordem específica de acordo com o atributo HintOrder de cada gumpdrop.

A função getReindeerHint(remainingGumdrops) do script aceita essa lista da getRemainingGumdrops() e retorna uma mensagem em string que descreve onde o jogador pode encontrar quaisquer gumpdrops restantes, incluindo tanto a descrição da cor quanto a descrição da localização do próximo gumpdrop que o jogador precisa coletar. No entanto, se o jogador coletou todos os gumpdrops no ambiente, a mensagem em string descreve para onde ir a seguir depois que tiver coletado todos os gumpdrops no ambiente.

Quando qualquer coisa colide com o volume, a função manipuladora de eventos Touched obtém o primeiro ancestral que é um Model, que deve ser o personagem se a BasePart que colidiu com o volume for um descendente de um modelo de personagem. Se for, a função então:

  • Define debounce como true.
  • Obtém a lista de gumpdrops restantes e a mensagem em string que descreve o próximo gumpdrop que o jogador precisa encontrar.
  • Converte a string em áudio usando o objeto AudioTextToSpeech, toca o áudio e aguarda o áudio terminar.
  • Define debounce de volta como false.

Definir debounce de false para true e novamente para false após a finalização do áudio TTS adaptado ao contexto é um padrão de debounce que impede que o áudio seja acionado repetidamente à medida que os jogadores colidem continuamente com o volume. Para mais informações sobre este padrão de debounce, consulte Debounce - Detectar colisões.

  1. Teste as experiências para ouvir dicas contextuais quando seu personagem jogador toca o volume ao redor da rena. O áudio TTS muda de acordo com o número e a cor dos gumpdrops que o personagem jogador já encontrou no ambiente.

©2026 Roblox Corporation, Roblox, o logotipo Roblox e Powering Imagination estão entre nossas marcas registradas e não registradas nos EUA e em outros países.