Voeg tekst-naar-spraak toe

*Deze inhoud is vertaald met behulp van AI (bèta) en kan fouten bevatten. Klik hier om deze pagina in het Engels te bekijken.

Tekst-naar-spraak is een vorm van assistieve technologie die tekststrings omzet in spraakgeluiden met behulp van een kunstmatige stem. Naast het verbeteren van de toegankelijkheid van je games voor spelers met visuele, motorische of cognitieve beperkingen, stelt TTS je in staat om spraak dynamisch te genereren, zodat je geen audio voor alle mogelijke verhaalscenario's van tevoren hoeft op te nemen.

Met het Gingerbread House - Start .rbxl bestand als startpunt en Gingerbread House - Tekst-naar-spraak als referentie, laat deze tutorial je zien hoe je zowel basis- als contextbewuste TTS-audio aan je games toevoegt, inclusief richtlijnen over:

  • Het activeren van TTS voor veelvoorkomende gameplay-scenario's die nooit veranderen, zoals UI-interacties en tutorials.
  • Het configureren van TTS zodat het zich aanpast aan spelersacties, omgevingsstatus of flexibele doelstellingen.

Als je op enig moment vastloopt in het proces, kun je Gingerbread House - Tekst-naar-spraak als referentie gebruiken om je voortgang te vergelijken.

Audio-objecten

Om TTS-audio te creëren, is het belangrijk om de audio-objecten te begrijpen waarmee je gedurende deze tutorial zult werken. Er zijn vijf hoofdtypen audio-objecten voor TTS:

  • Het AudioTextToSpeech object zet tekststrings om in spraakgeluiden.
  • Het AudioEmitter object is een virtuele luidspreker die audio in de 3D-omgeving uitzendt.
  • Het AudioListener object is een virtuele microfoon die audio uit de 3D-omgeving opvangt.
  • Het AudioDeviceOutput object is een fysiek hardware-apparaat in de echte wereld, zoals een luidspreker of hoofdtelefoon.
  • Wires dragen audiostreams van het ene object naar het andere.

Al deze audio-objecten werken samen om TTS-geluid uit te zenden als reactie op spelersacties. Laten we eens kijken hoe dit in de praktijk werkt voor 3D-audio met een voorbeeld van een speler die een headset draagt terwijl hij een game speelt met zijn laptop:

  • De AudioTextToSpeech laadt en zet tekst om in audio telkens wanneer een speler een deel aanraakt in de buurt van een niet-speelbaar personage (NPC).
  • De AudioEmitter zendt een stroom van de TTS-audio van de NPC in de 3D-omgeving uit.
  • Een Wire draagt de stroom van de AudioTextToSpeech naar de AudioEmitter, zodat de stroom uit de NPC komt.
  • Het kind AudioListener object van het personage luistert naar dat geluid binnen de 3D-omgeving en geeft het terug aan hun headset.
  • Het AudioDeviceOutput object draagt het geluid van de AudioListener naar de fysieke luidspreker van de speler, of in dit geval, hun hoofdtelefoon.

De volgende secties gaan dieper in op deze objecten terwijl je leert hoe je zowel basis- als contextbewuste audio afspeelt. Terwijl je deze objecten met de komende technieken bekijkt, kun je nauwkeuriger voorspellen hoe je geluid uit het spel naar de speler kunt vastleggen en doorgeven.

Basis TTS

Basis TTS is de meest voorkomende vorm van tekst-naar-spraak waarin de kunstmatige stem een tekststring voorleest, ongeacht de context van de speler of de omgeving. Dit betekent dat telkens wanneer de speler de TTS-audio activeert, de woorden en de manier waarop de kunstmatige stem de woorden voorleest consistent blijven, ongeacht de staat van de speler, hun acties of de omgevingsstatus.

Deze vorm van TTS is nuttig in de meeste gameplay-scenario's, zoals spelers die interactie hebben met UI-menu's, tutorials of routinematige NPC-interacties zoals aanbiedingen van verkopers of vijandelijke kreten. Roblox levert de volgende soorten stemmen die je kunt uitproberen voor een van deze interacties:

VoiceIDStem BeschrijvingAudio Voorbeeld
1Britse man
2Britse vrouw
3Verenigde Staten man #1
4Verenigde Staten vrouw #1
5Verenigde Staten man #2
6Verenigde Staten vrouw #2
7Australische man
8Australische vrouw
9Retro stem #1
10Retro stem #2
11Host stem
101Spaanse man
102Spaanse vrouw
201Duitse man
202Duitse vrouw
301Italiaanse man
302Italiaanse vrouw
401Franse man
402Franse vrouw

Om de basis 3D TTS-audio in het voorbeeld Gingerbread House - Tekst-naar-spraak plaatsbestand te recreëren:

  1. Schakel een standaard luisteraar in die aan je speler karakter is gekoppeld.
    1. In het Explorer venster, selecteer de SoundService.
    2. In het Properties venster, stel DefaultListenerLocation in op Character. Wanneer je het spel uitvoert, maakt de engine automatisch:
      • Een AudioListener onder elk Humanoid.RootPart van de speler karakter, zodat je geluiden kunt horen verschuiven in je echte luidsprekers volgens de positie en schaal van geluidsbronnen binnen het spel.
      • Een AudioDeviceOutput onder SoundService.
  2. In het Explorer venster, navigeer naar Workspace ⟩ DialogueVolume, dan:
    1. Voeg een AudioTextToSpeech object toe om een audio spraakgenerator voor het volume rond de sneeuwman te creëren.
    2. Voeg een AudioEmitter object toe om een positionele stroom van DialogueVolume uit te zenden.
    3. Voeg een Wire object toe om de stroom van de audio spraakgenerator naar de audio emitter te dragen.
  3. Selecteer het AudioTextToSpeech object, dan in het Properties venster:
    1. Stel Text in op "Verzamel elke laatste gumpdrop om mijn huis te openen!"
    2. Stel VoiceId in op 2 om de kunstmatige stem in te stellen als een Britse vrouw.
    3. Stel het Volume in op 3 om de audio op een hoog volume af te spelen, zodat je het TTS-geluid boven andere audiobronnen binnen het spel hoort.
  4. Selecteer de Wire, dan in het Properties venster:
    1. Stel SourceInstance in op je nieuwe AudioTextToSpeech om aan te geven dat je wilt dat de draad audio van deze specifieke audio spraakgenerator draagt.
    2. Stel TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen het volume draagt.
  5. Terug in het Explorer venster, navigeer naar StarterPlayer ⟩ StarterCharacterScripts, voeg dan een LocalScript toe, hernoem het naar PlayBasicTTSAudioWhenInVolume, en plak de volgende code in het lokale script:
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)

Dit script begint met het verkrijgen van de Workspace en Players services, zodat het hun kinderen en functionaliteit kan refereren. Voor elk speler karakter dat in het spel laadt of opnieuw spawnt, wacht het script op:

  • De Humanoid en Animator objecten van het karakter.
  • Het volume-object in de workspace genaamd DialogueVolume.

Wanneer iets met het volume botst, krijgt de Touched event handler functie de eerste voorouder die een Model is, wat het karakter zou moeten zijn als de BasePart die met het volume botste een afgeleide is van een karaktermodel. Als dat zo is, dan:

  • Zet debounce op true.
  • Speelt en wacht op het eindigen van de TTS-audio.
  • Zet debounce terug op false.

Het instellen van debounce van false naar true en weer terug naar false nadat de basis TTS-audio is afgelopen met afspelen is een debounce-patroon dat voorkomt dat de audio herhaaldelijk wordt geactiveerd terwijl spelers continu met het volume botsen. Voor meer informatie over dit debounce-patroon, zie Debounce - Detecteer botsingen.

  1. Speel het spel om de instructieve karakterdialoog te horen wanneer je speler karakter het volume rond de sneeuwman aanraakt.

Je kunt verder experimenteren met deze audio door de Text, VoiceID, Pitch, en Speed eigenschappen naar nieuwe waarden te wijzigen. De gegenereerde spraak wordt volledig anders zonder dat je een nieuw audiobestand voor elk scenario hoeft op te nemen en te uploaden.

Contextbewuste TTS

Contextbewuste TTS is een geavanceerdere vorm van tekst-naar-spraak waarin de kunstmatige stem een tekststring voorleest in relatie tot de speler, de staat van hun omgeving of de gameplay-status. Dit betekent dat telkens wanneer de speler de TTS-audio activeert, de woorden en de manier waarop de kunstmatige stem de woorden voorleest zich dienovereenkomstig aanpast.

Deze vorm van TTS is nuttig voor gameplay-scenario's die voortdurend veranderen, zoals directionele audio-indicaties, doelstatus of unieke NPC-interacties. Daarom, omdat contextbewuste TTS moet transformeren om nauwkeurig te zijn, moet je gameplay-elementen configureren zodat je hun status kunt volgen terwijl spelers door de omgeving navigeren en gameplay-doelstellingen voltooien.

Hoewel er veel manieren zijn om deze taak te volbrengen, gebruikt het voorbeeld aangepaste attributen om de kleur en locatie van elke gumpdrop bij te houden die de speler moet verzamelen om het peperkoekhuis binnen te gaan. Voor meer informatie over attributen, zie Eigenschappen en attributen.


Elk gumpdrop-object heeft attributen die hun kleur en locatie in de omgeving beschrijven.
Een close-up van de gele gumpdrop
Een close-up van de groene gumpdrop
Een close-up van de rode gumpdrop

Om de contextbewuste 3D TTS-audio in het voorbeeld Gingerbread House - Tekst-naar-spraak plaatsbestand te recreëren:

  1. In het Explorer venster, navigeer naar Workspace ⟩ GumDrops.

  2. Configureer drie aangepaste attributen om de gele gumpdrop bij te houden.

    1. Selecteer de gele gumpdrop, ga dan in het Properties venster naar de sectie Attributes, en klik op het pluspictogram. Een pop-updialoog verschijnt.
    2. Vul in het Name veld ColorDescription in.
    3. Selecteer in het dropdownmenu Type string.
    4. Klik op de Opslaan knop.
    5. Stel het nieuwe ColorDescription attribuut in op geel.
    6. Gebruik dit proces om nog twee attributen te maken met de volgende waarden.
    NaamTypeWaarde
    HintOrdernummer0
    LocationDescriptionstringbij de waterval
  3. Configureer drie aangepaste attributen om de groene gumpdrop bij te houden.

    1. In het Explorer venster, selecteer de groene gumpdrop.
    2. In het Properties venster, maak drie attributen met de volgende waarden.
    NaamTypeWaarde
    ColorDescriptionstringgroen
    HintOrdernummer1
    LocationDescriptionstringop de rand
  4. Configureer drie aangepaste attributen om de rode gumpdrop bij te houden.

    1. In het Explorer venster, selecteer de rode gumpdrop.
    2. In het Properties venster, maak drie attributen met de volgende waarden.
    NaamTypeWaarde
    ColorDescriptionstringrood
    HintOrdernummer2
    LocationDescriptionstringachter het hek
  5. In het Explorer venster, navigeer naar Workspace ⟩ HintVolume, dan:

    1. Voeg een AudioTextToSpeech object toe om een audio spraakgenerator voor het volume rond de rendier te creëren.
    2. Voeg een AudioEmitter object toe om een positionele stroom van HintVolume uit te zenden.
    3. Voeg een Wire object toe om de stroom van de audio spraakgenerator naar de audio emitter te dragen.
  6. Selecteer de Wire, dan in het Properties venster:

    1. Stel SourceInstance in op je nieuwe AudioTextToSpeech om aan te geven dat je wilt dat de draad audio van deze specifieke audio spraakgenerator draagt.
    2. Stel TargetInstance in op je nieuwe AudioEmitter om aan te geven dat je wilt dat de draad audio naar deze specifieke audio emitter binnen het volume draagt.
  7. Terug in het Explorer venster, navigeer naar StarterPlayer ⟩ StarterCharacterScripts, voeg dan een LocalScript toe, hernoem het naar PlayContextTTSAudioWhenInVolume, en plak de volgende code in het lokale script:

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 "Er zijn geen gumpdrops meer. Kijk binnen in het huis."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Er zijn " .. #remainingGumdrops .. " gumpdrops over. Zoek de " .. colorDescription .. " een " .. locationDescription .. "."
or "Er is één gumpdrop over. Het is " .. colorDescription .. " en het is " .. 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("Speler raakte volume aan.")
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)

Dit script begint met het verkrijgen van de Workspace en Players services, zodat het hun kinderen en functionaliteit kan refereren. Voor elk speler karakter dat in het spel laadt of opnieuw spawnt, wacht het script op:

  • De Humanoid en Animator objecten van het karakter.
  • Het volume-object in de workspace genaamd HintVolume.

De functie getRemainingGumdrops() van het script retourneert een lijst van gumpdrop Part objecten binnen de Gumdrops map en filtert alle delen die de speler heeft verzameld. De overgebleven gumpdrops worden gesorteerd in een specifieke volgorde volgens het HintOrder attribuut van elke gumpdrop.

De functie getReindeerHint(remainingGumdrops) van het script neemt die lijst van getRemainingGumdrops() en retourneert een stringbericht dat beschrijft waar de speler de overgebleven gumpdrops kan vinden, inclusief zowel de kleur- als locatiebeschrijving van de volgende gumpdrop die de speler moet verzamelen. Als de speler echter alle gumpdrops in de omgeving heeft verzameld, beschrijft het stringbericht waar ze naartoe moeten gaan nadat ze alle gumpdrops in de omgeving hebben verzameld.

Wanneer iets met het volume botst, krijgt de Touched event handler functie de eerste voorouder die een Model is, wat het karakter zou moeten zijn als de BasePart die met het volume botste een afgeleide is van een karaktermodel. Als dat zo is, dan:

  • Zet debounce op true.
  • Krijgt de lijst van overgebleven gumpdrops en het stringbericht dat de volgende gumpdrop beschrijft die de speler moet vinden.
  • Zet de string om in audio met behulp van het AudioTextToSpeech object, speelt de audio af en wacht tot de audio is afgelopen.
  • Zet debounce terug op false.

Het instellen van debounce van false naar true en weer terug naar false nadat de contextbewuste TTS-audio is afgelopen met afspelen is een debounce-patroon dat voorkomt dat de audio herhaaldelijk wordt geactiveerd terwijl spelers continu met het volume botsen. Voor meer informatie over dit debounce-patroon, zie Debounce - Detecteer botsingen.

  1. Speel het spel om contextuele hints te horen wanneer je speler karakter het volume rond de rendier aanraakt. De TTS-audio verandert op basis van het aantal en de kleur van gumpdrops die het speler karakter al in de omgeving heeft gevonden.

©2026 Roblox Corporation. Roblox, het Roblox-logo en Powering Imagination behoren tot onze geregistreerde en niet-geregistreerde handelsmerken in de VS en andere landen.