Testo-voce è una forma di tecnologia assistiva che converte le stringhe di testo in suoni vocali utilizzando una voce artificiale. Oltre a migliorare l'accessibilità delle tue esperienze per i giocatori con disabilità visive, motorie o cognitive, il TTS ti consente di generare discorsi dinamicamente in modo da non dover registrare audio in anticipo per tutti gli scenari narrativi possibili.
Utilizzando il file Gingerbread House - Start .rbxl come punto di partenza e Gingerbread House - Testo-voce come riferimento, questo tutorial ti mostra come aggiungere sia audio TTS di base che contestuali alle tue esperienze, inclusa la guida su:
- Attivare il TTS per scenari di gioco comuni che non cambieranno mai, come le interazioni UI e i tutorial.
- Configurare il 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 - Testo-voce come riferimento per confrontare i tuoi progressi.
Oggetti Audio
Per creare audio TTS, è importante capire gli oggetti audio con cui lavorerai durante questo tutorial. Ci sono cinque principali tipi di oggetti audio per il TTS:
- L'oggetto AudioTextToSpeech converte le 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 trasporta flussi audio da un oggetto all'altro.
Tutti questi oggetti audio lavorano insieme per emettere suoni TTS in risposta alle azioni dei giocatori. Diamo un'occhiata a come funziona questo nella pratica per l'audio 3D utilizzando un esempio di un giocatore che indossa un visore mentre gioca a un'esperienza 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 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 allo speaker fisico del giocatore, o in questo caso, alle loro cuffie.
Le sezioni seguenti approfondiscono e fanno riferimento a questi oggetti mentre impari a riprodurre sia audio di base che contestuale. Man mano che rivedi questi oggetti con le prossime tecniche, puoi prevedere più accuratamente come catturare e restituire suoni dall'esperienza al giocatore.
TTS di Base
Il TTS di base è la forma più comune di testo-voce 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 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 narratrice | |
| 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 3D di base nel file di esempio Gingerbread House - Testo-voce:
- Abilita un ascoltatore predefinito che sia collegato al personaggio del tuo giocatore.
- Nella finestra Explorer, seleziona SoundService.
- Nella finestra Properties, imposta DefaultListenerLocation su Character. Quando esegui l'esperienza, il motore crea automaticamente:
- Un AudioListener sotto Humanoid.RootPart di ciascun personaggio del giocatore in modo da poter sentire i suoni spostarsi nei tuoi altoparlanti reali in base alla posizione e alla dimensione delle sorgenti sonore all'interno dell'esperienza.
- Un AudioDeviceOutput sotto SoundService.
- Nella finestra Explorer, naviga a Workspace ⟩ DialogueVolume, quindi:
- Inserisci un oggetto AudioTextToSpeech per creare un generatore audio di discorsi 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 audio di discorsi all'emettitore audio.
- Seleziona l'oggetto AudioTextToSpeech, quindi nella finestra Properties:
- Imposta Text su "Colleziona ogni singolo gumpdrop per aprire la mia casa!"
- Imposta VoiceId su 2 per impostare la voce artificiale in modo che emuli una femmina britannica.
- Imposta il Volume su 3 per riprodurre l'audio a un volume elevato in modo da sentire il suono TTS rispetto ad altre sorgenti audio all'interno dell'esperienza.
- Seleziona il Wire, quindi nella finestra Properties:
- Imposta SourceInstance sulla tua nuova AudioTextToSpeech per specificare che desideri che il filo trasporti audio da questo specifico generatore audio di discorsi.
- 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 uno LocalScript, rinominalo in 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 ciascun personaggio giocatore che si carica o rinasce nell'esperienza, lo script attende:
- L'oggetto volume nell'area di lavoro denominato DialogueVolume.
Quando qualcosa 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 sì, la funzione quindi:
- Imposta il debounce su true.
- Riproduce e attende la fine dell'audio TTS.
- Imposta di nuovo il debounce su false.
Impostare il debounce da false a true e poi di nuovo a false dopo che l'audio TTS di base ha finito di riprodursi è 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 dell'esperienza per ascoltare il dialogo istruttivo del personaggio 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 diventerà completamente diverso senza la necessità di registrare e caricare un nuovo file audio per ciascun scenario.
TTS Contestuale
Il TTS contestuale è una forma più avanzata di testo-voce in cui la voce artificiale legge una stringa di testo in relazione al giocatore, allo stato del loro ambiente o allo stato di gioco. Questo 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 cambiano continuamente, come segnali audio direzionali, stato degli obiettivi, o interazioni uniche con l'NPC. Di conseguenza, poiché il TTS contestuale deve trasformarsi per essere accurato, devi configurare elementi del gioco in modo da poter monitorare il loro stato mentre i giocatori navigano nell'ambiente e completano gli obiettivi di gioco.
Ci sono molti modi per realizzare questo compito, l'esempio utilizza attributi personalizzati per monitorare il colore e la posizione di ogni gumbdrop 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 3D contestuale nel file di esempio Gingerbread House - Testo-voce:
Nella finestra Explorer, naviga a Workspace ⟩ GumDrops.
Configura tre attributi personalizzati per monitorare il gumbdrop giallo.
- Seleziona il gumbdrop giallo, quindi nella finestra Properties, naviga alla sezione Attributes, quindi fai clic sull'icona più. Una finestra di dialogo a comparsa viene visualizzata.
- 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 due ulteriori attributi utilizzando i seguenti valori.
Nome Tipo Valore HintOrder number 0 LocationDescription string vicino alla cascata Configura tre attributi personalizzati per monitorare il gumbdrop verde.
- Nella finestra Explorer, seleziona il gumbdrop verde.
- Nella finestra Properties, crea tre attributi utilizzando i seguenti valori.
Nome Tipo Valore ColorDescription string verde HintOrder number 1 LocationDescription string su ledge Configura tre attributi personalizzati per monitorare il gumbdrop rosso.
- Nella finestra Explorer, seleziona il gumbdrop 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 audio di discorsi 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 audio di discorsi all'emettitore audio.
Seleziona il Wire, quindi nella finestra Properties:
- Imposta SourceInstance sulla tua nuova AudioTextToSpeech per specificare che desideri che il filo trasporti audio da questo specifico generatore audio di discorsi.
- 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 uno LocalScript, rinominalo in 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ù gumbdrop. Controlla dentro casa."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Ci sono " .. #remainingGumdrops .. " gumbdrops rimanenti. Cerca il " .. colorDescription .. " " .. locationDescription .. "."
or "C'è una gumbdrop rimasta. È " .. 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("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 ciascun personaggio giocatore che si carica o rinasce nell'esperienza, lo script attende:
- L'oggetto volume nell'area di lavoro denominato HintVolume.
La funzione getRemainingGumdrops() dello script restituisce un elenco di oggetti gumbdrop Part all'interno della cartella Gumdrops e filtra qualsiasi parte che il giocatore ha raccolto. I gumbdrops rimanenti vengono ordinati in un ordine specifico in base all'attributo HintOrder di ciascun gumbdrop.
La funzione getReindeerHint(remainingGumdrops) dello script prende quell'elenco da getRemainingGumdrops() e restituisce un messaggio stringa che descrive dove il giocatore può trovare eventuali gumbdrops rimanenti, inclusa la descrizione del colore e della posizione del prossimo gumbdrop che il giocatore deve raccogliere. Tuttavia, se il giocatore ha raccolto tutti i gumbdrops nell'ambiente, il messaggio stringa descrive dove andare dopo che hanno raccolto tutti i gumbdrops nell'ambiente.
Quando qualcosa 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 è così, la funzione quindi:
- Imposta il debounce su true.
- Ottiene l'elenco dei gumbdrops rimanenti e il messaggio stringa che descrive il prossimo gumbdrop che il giocatore deve trovare.
- Converte la stringa in audio utilizzando l'oggetto AudioTextToSpeech, riproduce l'audio e attende la fine dell'audio.
- Imposta di nuovo il debounce su false.
Impostare il debounce da false a true e poi di nuovo a false dopo che l'audio TTS contestuale ha terminato di essere riprodotto è 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 delle esperienze per ascoltare 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 gumbdrops che il personaggio giocatore ha già trovato nell'ambiente.