Text-zu-Sprache ist eine Form von unterstützender Technologie, die Textzeichenfolgen in Sprachlaute mithilfe einer künstlichen Stimme umwandelt. Neben der Verbesserung der Zugänglichkeit deiner Erlebnisse für Spieler mit Seh-, Mobilitäts- oder kognitiven Beeinträchtigungen ermöglicht TTS die dynamische Generierung von Sprache, sodass du Audio nicht für alle möglichen narrativen Szenarien im Voraus aufnehmen musst.
Mit der Gingerbread House - Start .rbxl-Datei als Ausgangspunkt und Gingerbread House - Text-zu-Sprache als Referenz zeigt dir dieses Tutorial, wie du sowohl grundlegende als auch kontextbezogene TTS-Audios zu deinen Erlebnissen hinzufügst, einschließlich Anleitungen zu:
- Auslösen von TTS für gängige Gameplay-Szenarien, die sich nie ändern werden, wie z. B. UI-Interaktionen und Tutorials.
- Konfigurieren von TTS, sodass es sich an die Spieleraktionen, den Umweltstatus oder flexible Ziele anpasst.
Wenn du während des Prozesses an einem Punkt feststeckst, kannst du Gingerbread House - Text-zu-Sprache als Referenz verwenden, um deinen Fortschritt zu vergleichen.
Audioobjekte
Um TTS-Audio zu erzeugen, ist es wichtig, die Audioobjekte zu verstehen, mit denen du im Laufe dieses Tutorials arbeiten wirst. Es gibt fünf Haupttypen von Audioobjekten für TTS:
- Das AudioTextToSpeech-Objekt wandelt Textzeichenfolgen in Sprachlaute um.
- Das AudioEmitter-Objekt ist ein virtueller Lautsprecher, der Audio in die 3D-Umgebung ausstrahlt.
- Das AudioListener-Objekt ist ein virtuelles Mikrofon, das Audio aus der 3D-Umgebung aufnimmt.
- Das AudioDeviceOutput-Objekt ist ein physisches Hardwaregerät in der realen Welt, wie ein Lautsprecher oder Kopfhörer.
- Wires transportieren Audioströme von einem Objekt zum anderen.
Alle diese Audioobjekte arbeiten zusammen, um TTS-Geräusche als Reaktion auf Spieleraktionen auszugeben. Schauen wir uns an, wie das in der Praxis für 3D-Audio funktioniert, indem wir ein Beispiel eines Spielers betrachten, der einen Kopfhörer trägt, während er mit seinem Laptop ein Erlebnis spielt:
- Das AudioTextToSpeech lädt und wandelt Text in Audio um, wann immer ein Spieler ein Teil in der Nähe eines nicht spielbaren Charakters (NPC) berührt.
- Das AudioEmitter strahlt einen Stream des TTS-Audios vom NPC in die 3D-Umgebung aus.
- Ein Wire transportiert den Stream vom AudioTextToSpeech zum AudioEmitter, sodass der Stream aus dem NPC kommt.
- Das Kindobjekt AudioListener des Charakters hört diesen Sound in der 3D-Umgebung und gibt ihn zurück an seinen Kopfhörer.
- Das AudioDeviceOutput-Objekt transportiert den Sound vom AudioListener zum physikalischen Lautsprecher des Spielers oder in diesem Fall zu seinen Kopfhörern.
Die folgenden Abschnitte gehen tiefer und verweisen auf diese Objekte, während du lernst, sowohl grundlegende als auch kontextbezogene Audios abzuspielen. Während du diese Objekte mit den kommenden Techniken überprüfst, kannst du genauer vorhersagen, wie du Sound aus dem Erlebnis an den Spieler aufnehmen und weitergeben kannst.
Grundlegendes TTS
Grundlegendes TTS ist die häufigste Form von Text-zu-Sprache, bei der die künstliche Stimme eine Textzeichenfolge liest, unabhängig vom Kontext des Spielers oder der Umgebung. Das bedeutet, dass immer wenn der Spieler das TTS-Audio auslöst, die Wörter und die Art und Weise, wie die künstliche Stimme die Wörter liest, konsistent bleibt, egal wie der Zustand des Spielers, seine Aktionen oder der Umweltstatus sind.
Diese Form von TTS ist in den meisten Gameplay-Szenarien nützlich, z. B. wenn Spieler mit UI-Menüs, Tutorials oder routinemäßigen NPC-Interaktionen wie Verkäuferangeboten oder Feindeschreien interagieren. Roblox stellt die folgenden Arten von Stimmen zur Verfügung, mit denen du für jede dieser Interaktionen experimentieren kannst:
| VoiceID | Stimmenbeschreibung | Audio-Beispiel |
|---|---|---|
| 1 | Britischer Mann | |
| 2 | Britische Frau | |
| 3 | Vereinigte Staaten männlich #1 | |
| 4 | Vereinigte Staaten weiblich #1 | |
| 5 | Vereinigte Staaten männlich #2 | |
| 6 | Vereinigte Staaten weiblich #2 | |
| 7 | Australischer Mann | |
| 8 | Australische Frau | |
| 9 | Retro-Stimme #1 | |
| 10 | Retro-Stimme #2 | |
| 11 | Host-Stimme | |
| 101 | Spanischer Mann | |
| 102 | Spanische Frau | |
| 201 | Deutsch männlich | |
| 202 | Deutsch weiblich | |
| 301 | Italienisch männlich | |
| 302 | Italienisch weiblich | |
| 401 | Französisch männlich | |
| 402 | Französisch weiblich |
Um das grundlegende 3D-TTS-Audio in der Beispieldatei Gingerbread House - Text-zu-Sprache nachzubilden:
- Aktiviere einen Standardlistener, der an deinen Spielercharakter angehängt ist.
- Wähle im Explorer-Fenster den SoundService aus.
- Setze im Eigenschaften-Fenster DefaultListenerLocation auf Character. Wenn du das Erlebnis startest, erstellt die Engine automatisch:
- Ein AudioListener unter dem Humanoid.RootPart jedes Spielercharakters, sodass du Geräusche in deinen realen Lautsprechern entsprechend der Position und der Größe der Schallquellen innerhalb des Erlebnisses hören kannst.
- Ein AudioDeviceOutput unter SoundService.
- Navigiere im Explorer-Fenster zu Workspace ⟩ DialogueVolume und:
- Füge ein AudioTextToSpeech-Objekt ein, um einen Audio-Sprechgenerator für das Volumen um den Schneemann zu erstellen.
- Füge ein AudioEmitter-Objekt ein, um einen positionalen Stream aus DialogueVolume auszustrahlen.
- Füge ein Wire-Objekt hinzu, um den Stream vom Audio-Sprechgenerator zum Audio-Abstrahler zu transportieren.
- Wähle das AudioTextToSpeech-Objekt aus, und setze im Eigenschaften-Fenster:
- Setze Text auf "Sammle jede letzte Gumpdrop, um mein Zuhause zu öffnen!"
- Setze VoiceId auf 2, um die künstliche Stimme als britische Frau zu emulieren.
- Setze die Lautstärke auf 3, um das Audio bei hoher Lautstärke abzuspielen, sodass du das TTS-Geräusch über anderen Audioquellen im Erlebnis hörst.
- Wähle das Wire-Objekt aus, und setze im Eigenschaften-Fenster:
- Setze SourceInstance auf dein neues AudioTextToSpeech, um anzugeben, dass du das Kabel für den Transport von Audio von diesem speziellen Audio-Sprechgenerator verwenden möchtest.
- Setze TargetInstance auf dein neues AudioEmitter, um anzugeben, dass du das Kabel für den Transport von Audio zu diesem speziellen Audio-Abstrahler innerhalb des Volumens verwenden möchtest.
- Gehe zurück im Explorer-Fenster, navigiere zu StarterPlayer ⟩ StarterCharacterScripts, füge ein LocalScript hinzu, benenne es in PlayBasicTTSAudioWhenInVolume um und füge den folgenden Code in das lokale Skript ein:
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)
Dieses Skript beginnt damit, die Dienste Workspace und Players abzurufen, sodass es auf deren Kinder und Funktionen zugreifen kann. Für jeden Spielercharakter, der in das Erlebnis geladen wird oder respawnt, wartet das Skript auf:
- Das Volumenobjekt im Arbeitsbereich mit dem Namen DialogueVolume.
Wenn etwas mit dem Volumen kollidiert, ruft die Touched-Ereignisbehandlungsfunktion den ersten Vorfahren ab, der ein Model ist, was der Charakter sein sollte, wenn das BasePart, das mit dem Volumen kollidierte, ein Nachkomme eines Charaktermodells ist. Wenn ja, führt die Funktion dann Folgendes aus:
- Setzt debounce auf true.
- Spielt das TTS-Audio ab und wartet, bis es endet.
- Setzt debounce zurück auf false.
Das Setzen von debounce von false auf true und wieder zurück auf false nach dem Abspielen des grundlegenden TTS-Audios ist ein Entprellmuster, das verhindert, dass das Audio wiederholt ausgelöst wird, während Spieler kontinuierlich mit dem Volumen kollidieren. Weitere Informationen zu diesem Entprellmuster findest du unter Debounce - Kollisionen erkennen.
- Teste das Erlebnis, um den Anleitungstext zu hören, wenn dein Spielercharakter das Volumen um den Schneemann berührt.
Du kannst mit diesem Audio weiter experimentieren, indem du die Eigenschaften Text, VoiceID, Pitch und Speed auf neue Werte änderst. Die erzeugte Sprache wird völlig anders, ohne dass du eine neue Audiodatei für jedes Szenario aufnehmen und hochladen musst.
Kontextbezogene TTS
Kontextbezogene TTS ist eine fortgeschrittenere Form von Text-zu-Sprache, bei der die künstliche Stimme eine Textzeichenfolge in Bezug auf den Spieler, den Zustand ihrer Umgebung oder den Gameplay-Status liest. Das bedeutet, dass immer wenn der Spieler das TTS-Audio auslöst, die Wörter und die Art und Weise, wie die künstliche Stimme die Wörter liest, entsprechend angepasst wird.
Diese Form von TTS ist nützlich für Gameplay-Szenarien, die sich ständig ändern, wie z. B. richtungsbezogene Audiohinweise, Zielstatus oder einzigartige NPC-Interaktionen. Dementsprechend, weil kontextbezogene TTS transformiert werden muss, um genau zu sein, musst du Gameplay-Elemente konfigurieren, sodass du deren Status nachverfolgen kannst, während Spieler durch die Umgebung navigieren und Gameplay-Ziele abschließen.
Es gibt viele Möglichkeiten, diese Aufgabe zu erfüllen, das Beispiel verwendet benutzerdefinierte Attribute, um die Farbe und Standort jedes Gumpdrops zu verfolgen, den der Spieler sammeln muss, um das Lebkuchenhaus zu betreten. Weitere Informationen zu Attributen findest du unter Eigenschaften und Attribute.



Um das kontextbezogene 3D-TTS-Audio in der Beispieldatei Gingerbread House - Text-zu-Sprache nachzubilden:
- Navigiere im Explorer-Fenster zu Workspace ⟩ GumDrops.
- Konfiguriere drei benutzerdefinierte Attribute, um den gelben Gumpdrop zu verfolgen.
- Wähle den gelben Gumpdrop aus, navigiere dann im Eigenschaften-Fenster zum Abschnitt Attribute und klicke auf das Pluszeichen. Ein Popup-Dialog wird angezeigt.
- Gib im Feld Name ColorDescription ein.
- Wähle im Dropdown-Menü Typ string aus.
- Klicke auf die Schaltfläche Speichern.
- Setze das neue Attribut ColorDescription auf gelb.
- Erstelle mit diesem Verfahren zwei weitere Attribute mit den folgenden Werten.
| Name | Typ | Wert |
|---|---|---|
| HinweisReihenfolge | number | 0 |
| Standortbeschreibung | string | am Wasserfall |
- Konfiguriere drei benutzerdefinierte Attribute, um den grünen Gumpdrop zu verfolgen.
- Wähle im Explorer-Fenster den grünen Gumpdrop aus.
- Erstelle im Eigenschaften-Fenster drei Attribute mit den folgenden Werten.
| Name | Typ | Wert |
|---|---|---|
| ColorDescription | string | grün |
| HinweisReihenfolge | number | 1 |
| Standortbeschreibung | string | auf der Kante |
- Konfiguriere drei benutzerdefinierte Attribute, um den roten Gumpdrop zu verfolgen.
- Wähle im Explorer-Fenster den roten Gumpdrop aus.
- Erstelle im Eigenschaften-Fenster drei Attribute mit den folgenden Werten.
| Name | Typ | Wert |
|---|---|---|
| ColorDescription | string | rot |
| HinweisReihenfolge | number | 2 |
| Standortbeschreibung | string | hinter dem Zaun |
- Navigiere im Explorer-Fenster zu Workspace ⟩ HintVolume, dann:
- Füge ein AudioTextToSpeech-Objekt ein, um einen Audio-Sprechgenerator für das Volumen um das Rentier zu erstellen.
- Füge ein AudioEmitter-Objekt ein, um einen positionalen Stream aus HintVolume auszustrahlen.
- Füge ein Wire-Objekt hinzu, um den Stream vom Audio-Sprechgenerator zum Audio-Abstrahler zu transportieren.
- Wähle das Wire-Objekt aus, und setze im Eigenschaften-Fenster:
- Setze SourceInstance auf dein neues AudioTextToSpeech, um anzugeben, dass du das Kabel für den Transport von Audio von diesem speziellen Audio-Sprechgenerator verwenden möchtest.
- Setze TargetInstance auf dein neues AudioEmitter, um anzugeben, dass du das Kabel für den Transport von Audio zu diesem speziellen Audio-Abstrahler innerhalb des Volumens verwenden möchtest.
- Gehe zurück im Explorer-Fenster, navigiere zu StarterPlayer ⟩ StarterCharacterScripts, füge ein LocalScript hinzu, benenne es in PlayContextTTSAudioWhenInVolume um und füge den folgenden Code in das lokale Skript ein:
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 "Es sind keine Gumpdrops mehr übrig. Schau im Haus nach."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Es sind noch " .. #remainingGumdrops .. " Gumpdrops übrig. Suche nach dem " .. colorDescription .. "en " .. locationDescription .. "."
or "Es ist noch ein Gumpdrop übrig. Er ist " .. colorDescription .. " und er ist " .. 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("Spieler hat das Volumen berührt.")
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)
Dieses Skript beginnt damit, die Dienste Workspace und Players abzurufen, sodass es auf deren Kinder und Funktionen zugreifen kann. Für jeden Spielercharakter, der in das Erlebnis geladen wird oder respawnt, wartet das Skript auf:
- Das Volumenobjekt im Arbeitsbereich mit dem Namen HintVolume.
Die Funktion getRemainingGumdrops() des Skripts gibt eine Liste von Gumpdrop Part-Objekten innerhalb des Gumdrops-Ordners zurück und filtert alle Teile heraus, die der Spieler gesammelt hat. Die verbleibenden Gumpdrops werden in einer bestimmten Reihenfolge gemäß dem HintOrder-Attribut jedes Gumpdrops sortiert.
Die Funktion getReindeerHint(remainingGumdrops) des Skripts nimmt diese Liste von getRemainingGumdrops() und gibt eine Zeichenfolgennachricht zurück, die beschreibt, wo der Spieler die verbleibenden Gumpdrops finden kann, einschließlich der Farb- und Standortbeschreibung des nächsten Gumpdrops, den der Spieler sammeln muss. Wenn der Spieler jedoch alle Gumpdrops in der Umgebung gesammelt hat, beschreibt die Zeichenfolgen Nachricht, wo er als Nächstes hingehen soll, nachdem er alle Gumpdrops in der Umgebung gesammelt hat.
Wenn etwas mit dem Volumen kollidiert, ruft die Touched-Ereignisbehandlungsfunktion den ersten Vorfahren ab, der ein Model ist, was der Charakter sein sollte, wenn das BasePart, das mit dem Volumen kollidiert ist, ein Nachkomme eines Charaktermodells ist. Wenn ja, führt die Funktion dann Folgendes aus:
- Setzt debounce auf true.
- Ruft die Liste der verbleibenden Gumpdrops und die Zeichenfolgennachricht ab, die beschreibt, wo der Spieler den nächsten Gumpdrop finden muss.
- Wandelt die Zeichenfolge in Audio mithilfe des AudioTextToSpeech-Objekts um, spielt das Audio ab und wartet, bis das Audio endet.
- Setzt debounce zurück auf false.
Das Setzen von debounce von false auf true und wieder zurück auf false, nachdem das kontextbezogene TTS-Audio zu Ende gespielt wurde, ist ein Entprellmuster, das verhindert, dass das Audio wiederholt ausgelöst wird, während Spieler kontinuierlich mit dem Volumen kollidieren. Weitere Informationen zu diesem Entprellmuster findest du unter Debounce - Kollisionen erkennen.
- Teste die Erlebnisse, um kontextuelle Hinweise zu hören, wenn dein Spielercharakter das Volumen um das Rentier berührt. Das TTS-Audio ändert sich je nach Anzahl und Farbe der Gumpdrops, die der Spielercharakter bereits in der Umgebung gefunden hat.