Sintesi vocale è una forma di tecnologia assistiva che converte stringhe di testo in suoni vocali utilizzando una voce artificiale. Oltre a migliorare l'accessibilità dei tuoi giochi per i giocatori con disabilità visive, motorie o cognitive, la TTS ti consente di generare discorsi dinamicamente in modo da non dover registrare audio in anticipo per tutti i possibili scenari narrativi.
Utilizzando il file Gingerbread House - Start .rbxl come punto di partenza e Gingerbread House - Sintesi Vocale come riferimento, questo tutorial ti mostra come aggiungere audio TTS sia di base che consapevole del contesto ai tuoi giochi, inclusa la guida su:
- Attivare la TTS per scenari di gioco comuni che non cambieranno mai, come interazioni UI e tutorial.
- Configurare la TTS in modo che si adatti alle azioni del giocatore, allo stato ambientale o agli obiettivi flessibili.
Se in qualsiasi momento ti trovi bloccato nel processo, puoi utilizzare Gingerbread House - Sintesi Vocale come riferimento per confrontare i tuoi progressi.
Oggetti Audio
Per creare audio TTS, è importante comprendere gli oggetti audio con cui lavorerai durante questo tutorial. Ci sono cinque tipi principali di oggetti audio per la TTS:
- L'oggetto AudioTextToSpeech converte stringhe di testo in suoni vocali.
- L'oggetto AudioEmitter è un altoparlante virtuale che emette audio nell'ambiente 3D.
- L'oggetto AudioListener è un microfono virtuale che raccoglie audio dall'ambiente 3D.
- L'oggetto AudioDeviceOutput è un dispositivo hardware fisico nel mondo reale, come un altoparlante o delle cuffie.
- Wires trasportano flussi audio da un oggetto all'altro.
Tutti questi oggetti audio lavorano insieme per emettere suoni TTS in risposta alle azioni del giocatore. Diamo un'occhiata a come funziona in pratica per l'audio 3D utilizzando un esempio di un giocatore che indossa un auricolare mentre gioca con il proprio laptop:
- Il AudioTextToSpeech carica e converte il testo in audio ogni volta che un giocatore tocca una parte vicino a un personaggio non giocabile (NPC).
- Il AudioEmitter emette un flusso dell'audio TTS dall'NPC nell'ambiente 3D.
- Un oggetto Wire trasporta il flusso dal AudioTextToSpeech all'AudioEmitter in modo che il flusso esca dall'NPC.
- L'oggetto figlio AudioListener del personaggio ascolta quel suono all'interno dell'ambiente 3D e lo restituisce alle loro cuffie.
- L'oggetto AudioDeviceOutput trasporta il suono dal AudioListener all'altoparlante fisico del giocatore, o in questo caso, alle loro cuffie.
Le sezioni seguenti approfondiscono e fanno riferimento a questi oggetti mentre impari a riprodurre audio sia di base che consapevole del contesto. Man mano che rivedi questi oggetti con le tecniche in arrivo, puoi prevedere più accuratamente come catturare e restituire il suono dal gioco al giocatore.
TTS di Base
La TTS di base è la forma più comune di sintesi vocale in cui la voce artificiale legge una stringa di testo indipendentemente dal contesto del giocatore o dell'ambiente. Ciò significa che ogni volta che il giocatore attiva l'audio TTS, le parole e il modo in cui la voce artificiale legge le parole rimangono coerenti indipendentemente dallo stato del giocatore, dalle loro azioni o dallo stato ambientale.
Questa forma di TTS è utile nella maggior parte degli scenari di gioco, come i giocatori che interagiscono con menu UI, tutorial o interazioni di routine con NPC come offerte di venditori o grida di nemici. Roblox fornisce i seguenti tipi di voci con cui puoi sperimentare per qualsiasi di queste interazioni:
| VoiceID | Descrizione Voce | Esempio Audio |
|---|---|---|
| 1 | Maschio britannico | |
| 2 | Femmina britannica | |
| 3 | Maschio degli Stati Uniti #1 | |
| 4 | Femmina degli Stati Uniti #1 | |
| 5 | Maschio degli Stati Uniti #2 | |
| 6 | Femmina degli Stati Uniti #2 | |
| 7 | Maschio australiano | |
| 8 | Femmina australiana | |
| 9 | Voce retro #1 | |
| 10 | Voce retro #2 | |
| 11 | Voce del presentatore | |
| 101 | Maschio spagnolo | |
| 102 | Femmina spagnola | |
| 201 | Maschio tedesco | |
| 202 | Femmina tedesca | |
| 301 | Maschio italiano | |
| 302 | Femmina italiana | |
| 401 | Maschio francese | |
| 402 | Femmina francese |
Per ricreare l'audio TTS di base 3D nel file di esempio Gingerbread House - Sintesi Vocale:
- Abilita un ascoltatore predefinito che è attaccato al tuo personaggio giocatore.
- Nella finestra Explorer, seleziona SoundService.
- Nella finestra Properties, imposta DefaultListenerLocation su Character. Quando esegui il gioco, il motore crea automaticamente:
- Un AudioListener sotto il Humanoid.RootPart di ciascun personaggio giocatore in modo che tu possa sentire i suoni spostarsi nei tuoi altoparlanti reali in base alla posizione e alla scala delle sorgenti sonore all'interno del gioco.
- Un AudioDeviceOutput sotto SoundService.
- Nella finestra Explorer, naviga a Workspace ⟩ DialogueVolume, quindi:
- Inserisci un oggetto AudioTextToSpeech per creare un generatore di discorsi audio per il volume intorno al pupazzo di neve.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da DialogueVolume.
- Inserisci un oggetto Wire per trasportare il flusso dal generatore di discorsi audio all'emettitore audio.
- Seleziona l'oggetto AudioTextToSpeech, quindi nella finestra Properties:
- Imposta Text su "Raccogli ogni singolo gumpdrop per aprire la mia casa!"
- Imposta VoiceId su 2 per impostare la voce artificiale per emulare una femmina britannica.
- Imposta il Volume su 3 per riprodurre l'audio a un volume elevato in modo da sentire il suono TTS sopra altre sorgenti audio all'interno del gioco.
- Seleziona il Wire, quindi nella finestra Properties:
- Imposta SourceInstance sul tuo nuovo AudioTextToSpeech per specificare che desideri che il filo trasporti audio da questo specifico generatore di discorsi audio.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico emettitore audio all'interno del volume.
- Torna alla finestra Explorer, naviga a StarterPlayer ⟩ StarterCharacterScripts, quindi inserisci un LocalScript, rinominalo PlayBasicTTSAudioWhenInVolume, e incolla il seguente codice nello script locale:
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)Questo script inizia ottenendo i servizi Workspace e Players in modo da poter fare riferimento ai loro figli e funzionalità. Per ogni personaggio giocatore che carica o rinasce nel gioco, lo script attende:
- L'oggetto volume nell'area di lavoro chiamato DialogueVolume.
Quando qualsiasi cosa collide con il volume, la funzione gestore dell'evento Touched ottiene il primo antenato che è un Model, che dovrebbe essere il personaggio se il BasePart che è colliso con il volume è un discendente di un modello di personaggio. Se lo è, la funzione quindi:
- Imposta debounce su true.
- Riproduce e attende che l'audio TTS finisca.
- Imposta debounce di nuovo su false.
Impostare debounce da false a true e di nuovo a false dopo che l'audio TTS di base ha finito di suonare è un modello di debounce che impedisce all'audio di attivarsi ripetutamente mentre i giocatori collidono continuamente con il volume. Per ulteriori informazioni su questo modello di debounce, vedere Debounce - Rileva collisioni.
Esegui un test del gioco per sentire il dialogo del personaggio istruttivo quando il tuo personaggio giocatore tocca il volume intorno al pupazzo di neve.
Puoi ulteriormente sperimentare con questo audio modificando le proprietà Text, VoiceID, Pitch e Speed a nuovi valori. Il discorso generato diventa completamente diverso senza la necessità di registrare e caricare un nuovo file audio per ogni scenario.
TTS Consapevole del Contesto
La TTS consapevole del contesto è una forma più avanzata di sintesi vocale in cui la voce artificiale legge una stringa di testo in relazione al giocatore, allo stato del loro ambiente o allo stato del gioco. Ciò significa che ogni volta che il giocatore attiva l'audio TTS, le parole e il modo in cui la voce artificiale legge le parole si adattano di conseguenza.
Questa forma di TTS è utile per scenari di gioco che sono in continua evoluzione, come segnali audio direzionali, stato degli obiettivi o interazioni uniche con NPC. Di conseguenza, poiché la TTS consapevole del contesto deve trasformarsi per essere accurata, devi configurare gli elementi di gioco in modo da poter tenere traccia del loro stato mentre i giocatori navigano attraverso l'ambiente e completano gli obiettivi di gioco.
Sebbene ci siano molti modi per svolgere questo compito, il campione utilizza attributi personalizzati per tenere traccia del colore e posizione di ogni gumpdrop che il giocatore deve raccogliere per entrare nella casa di pan di zenzero. Per ulteriori informazioni sugli attributi, vedere Proprietà e attributi.



Per ricreare l'audio TTS consapevole del contesto 3D nel file di esempio Gingerbread House - Sintesi Vocale:
Nella finestra Explorer, naviga a Workspace ⟩ GumDrops.
Configura tre attributi personalizzati per tenere traccia del gumpdrop giallo.
- Seleziona il gumpdrop giallo, quindi nella finestra Properties, naviga alla sezione Attributes, quindi fai clic sull'icona più. Viene visualizzata una finestra di dialogo pop-up.
- Nel campo Name, inserisci ColorDescription.
- Nel menu a discesa Type, seleziona string.
- Fai clic sul pulsante Save.
- Imposta il nuovo attributo ColorDescription su giallo.
- Utilizzando questo processo, crea altri due attributi utilizzando i seguenti valori.
Nome Tipo Valore HintOrder number 0 LocationDescription string vicino alla cascata Configura tre attributi personalizzati per tenere traccia del gumpdrop verde.
- Nella finestra Explorer, seleziona il gumpdrop verde.
- Nella finestra Properties, crea tre attributi utilizzando i seguenti valori.
Nome Tipo Valore ColorDescription string verde HintOrder number 1 LocationDescription string sulla sporgenza Configura tre attributi personalizzati per tenere traccia del gumpdrop rosso.
- Nella finestra Explorer, seleziona il gumpdrop rosso.
- Nella finestra Properties, crea tre attributi utilizzando i seguenti valori.
Nome Tipo Valore ColorDescription string rosso HintOrder number 2 LocationDescription string dietro la recinzione Nella finestra Explorer, naviga a Workspace ⟩ HintVolume, quindi:
- Inserisci un oggetto AudioTextToSpeech per creare un generatore di discorsi audio per il volume intorno alla renna.
- Inserisci un oggetto AudioEmitter per emettere un flusso posizionale da HintVolume.
- Inserisci un oggetto Wire per trasportare il flusso dal generatore di discorsi audio all'emettitore audio.
Seleziona il Wire, quindi nella finestra Properties:
- Imposta SourceInstance sul tuo nuovo AudioTextToSpeech per specificare che desideri che il filo trasporti audio da questo specifico generatore di discorsi audio.
- Imposta TargetInstance sul tuo nuovo AudioEmitter per specificare che desideri che il filo trasporti audio a questo specifico emettitore audio all'interno del volume.
Torna alla finestra Explorer, naviga a StarterPlayer ⟩ StarterCharacterScripts, quindi inserisci un LocalScript, rinominalo PlayContextTTSAudioWhenInVolume, e incolla il seguente codice nello script locale:
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 "Non ci sono più gumpdrop. Controlla dentro la casa."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Ci sono " .. #remainingGumdrops .. " gumpdrop rimasti. Cerca il " .. colorDescription .. " " .. locationDescription .. "."
or "C'è un gumpdrop rimasto. È " .. colorDescription .. " e si trova " .. 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("Il giocatore ha toccato il 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)Questo script inizia ottenendo i servizi Workspace e Players in modo da poter fare riferimento ai loro figli e funzionalità. Per ogni personaggio giocatore che carica o rinasce nel gioco, lo script attende:
- L'oggetto volume nell'area di lavoro chiamato HintVolume.
La funzione getRemainingGumdrops() dello script restituisce un elenco di oggetti gumpdrop Part all'interno della cartella Gumdrops e filtra qualsiasi parte che il giocatore ha raccolto. I gumpdrop rimanenti vengono ordinati in un ordine specifico in base all'attributo HintOrder di ciascun gumpdrop.
La funzione getReindeerHint(remainingGumdrops) dello script prende quell'elenco da getRemainingGumdrops() e restituisce un messaggio stringa che descrive dove il giocatore può trovare eventuali gumpdrop rimanenti, inclusa sia la descrizione del colore che quella della posizione del prossimo gumpdrop che il giocatore deve raccogliere. Tuttavia, se il giocatore ha raccolto tutti i gumpdrop nell'ambiente, il messaggio stringa descrive dove andare dopo aver raccolto tutti i gumpdrop nell'ambiente.
Quando qualsiasi cosa collide con il volume, la funzione gestore dell'evento Touched ottiene il primo antenato che è un Model, che dovrebbe essere il personaggio se il BasePart che è colliso con il volume è un discendente di un modello di personaggio. Se lo è, la funzione quindi:
- Imposta debounce su true.
- Ottiene l'elenco dei gumpdrop rimanenti e il messaggio stringa che descrive il prossimo gumpdrop che il giocatore deve trovare.
- Converte la stringa in audio utilizzando l'oggetto AudioTextToSpeech, riproduce l'audio e attende che l'audio finisca.
- Imposta debounce di nuovo su false.
Impostare debounce da false a true e di nuovo a false dopo che l'audio TTS consapevole del contesto ha finito di suonare è un modello di debounce che impedisce all'audio di attivarsi ripetutamente mentre i giocatori collidono continuamente con il volume. Per ulteriori informazioni su questo modello di debounce, vedere Debounce - Rileva collisioni.
Esegui un test del gioco per sentire suggerimenti contestuali quando il tuo personaggio giocatore tocca il volume intorno alla renna. L'audio TTS cambia in base al numero e al colore dei gumpdrop che il personaggio giocatore ha già trovato nell'ambiente.