Samouczki dla średnio zaawansowanych

Dodaj tekst-na-mowę

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Tekst-na-mowę to forma technologii wspomagającej, która przekształca ciągi tekstowe w dźwięki mowy przy użyciu sztucznego głosu. Oprócz poprawy dostępności twoich doświadczeń dla graczy z niepełnosprawnościami wzrokowymi, ruchowymi lub poznawczymi, TTS pozwala na dynamiczne generowanie mowy, tak abyś nie musiał wcześniej nagrywać audio dla wszystkich możliwych scenariuszy narracyjnych.

Używając pliku Gingerbread House - Start .rbxl jako miejsca początkowego oraz Gingerbread House - Text-to-Speech jako odniesienia, ten samouczek pokazuje, jak dodać zarówno podstawowe, jak i kontekstowe dźwięki TTS do twoich doświadczeń, w tym wskazówki dotyczące:

  • Uruchamiania TTS dla typowych scenariuszy rozgrywki, które nigdy się nie zmieniają, takich jak interakcje z interfejsem użytkownika i samouczki.
  • Konfigurowania TTS tak, aby dostosowywał się do działań gracza, statusu otoczenia lub elastycznych celów.

Jeśli w pewnym momencie utkniesz w procesie, możesz użyć Gingerbread House - Text-to-Speech jako odniesienia do porównania swoich postępów.

Obiekty audio

Aby stworzyć dźwięk TTS, ważne jest, aby zrozumieć obiekty audio, z którymi będziesz pracować w trakcie tego samouczka. Istnieje pięć głównych typów obiektów audio dla TTS:

  • Obiekt AudioTextToSpeech przekształca ciągi tekstowe w dźwięki mowy.
  • Obiekt AudioEmitter to wirtualny głośnik, który emituje dźwięk w środowisku 3D.
  • Obiekt AudioListener to wirtualny mikrofon, który odbiera dźwięk z środowiska 3D.
  • Obiekt AudioDeviceOutput to fizyczne urządzenie sprzętowe w rzeczywistości, takie jak głośnik lub słuchawki.
  • Wires przenoszą strumienie audio z jednego obiektu do drugiego.

Wszystkie te obiekty audio współpracują ze sobą, aby emitować dźwięk TTS w odpowiedzi na działania gracza. Przyjrzyjmy się, jak to działa w praktyce w kontekście audio 3D, używając przykładu gracza noszącego zestaw słuchawkowy podczas grania na laptopie:

  • Obiekt AudioTextToSpeech ładowany jest i przekształca tekst w audio za każdym razem, gdy gracz dotyka części blisko postaci niezagrającej (NPC).
  • Obiekt AudioEmitter emituje strumień audio TTS z NPC w środowisku 3D.
  • Wire przenosi strumień z AudioTextToSpeech do AudioEmitter, aby strumień wychodził z NPC.
  • Podobiekt AudioListener postaci nasłuchuje ten dźwięk w środowisku 3D i przekazuje go z powrotem do ich zestawu słuchawkowego.
  • Obiekt AudioDeviceOutput przenosi dźwięk z AudioListener do fizycznego głośnika gracza, lub w tym przypadku, ich słuchawek.

Następujące sekcje zagłębiają się w te obiekty i odnoszą się do nich, gdy uczysz się, jak odtwarzać zarówno podstawowe, jak i kontekstowe dźwięki. Przeglądając te obiekty z nadchodzącymi technikami, możesz dokładniej przewidzieć, jak uchwycić i przekazać dźwięk z doświadczenia do gracza.

Podstawowe TTS

Podstawowe TTS to najczęstsza forma tekst-u-mowę, w której sztuczny głos odczytuje ciąg tekstowy bez względu na kontekst gracza lub otoczenia. Oznacza to, że za każdym razem, gdy gracz uruchamia dźwięk TTS, słowa i sposób, w jaki sztuczny głos je odczytuje, pozostają spójne, niezależnie od stanu gracza, ich działań lub statusu otoczenia.

Ta forma TTS jest przydatna w większości scenariuszy rozgrywki, takich jak interakcje graczy z menu UI, samouczki lub rutynowe interakcje z NPC, takie jak oferty sprzedawców czy odgłosy wrogów. Roblox dostarcza następujące typy głosów, które możesz przetestować dla dowolnej z tych interakcji:

VoiceIDOpis głosuPrzykład audio
1Brytyjski mężczyzna
2Brytyjska kobieta
3Mężczyzna z USA #1
4Kobieta z USA #1
5Mężczyzna z USA #2
6Kobieta z USA #2
7Mężczyzna z Australii
8Kobieta z Australii
9Retro głos #1
10Retro głos #2
11Głos narratora
101Mężczyzna hiszpański
102Kobieta hiszpańska
201Mężczyzna niemiecki
202Kobieta niemiecka
301Mężczyzna włoski
302Kobieta włoska
401Mężczyzna francuski
402Kobieta francuska

Aby odtworzyć podstawowy dźwięk TTS 3D w próbce Gingerbread House - Text-to-Speech:

  1. Włącz domyślnego słuchacza, który jest przypisany do postaci gracza.
    1. W oknie Eksplorator wybierz SoundService.
    2. W oknie Właściwości ustaw DefaultListenerLocation na Character. Kiedy uruchomisz doświadczenie, silnik automatycznie:
      • Tworzy AudioListener pod Humanoid.RootPart każdej postaci gracza, aby można było słyszeć dźwięki przesuwające się w głośnikach w rzeczywistym świecie w zależności od pozycji i skali źródeł dźwięku w doświadczeniu.
      • Tworzy AudioDeviceOutput pod SoundService.
  2. W oknie Eksplorator, przejdź do WorkspaceDialogueVolume, a następnie:
    1. Wstaw obiekt AudioTextToSpeech, aby stworzyć generator mowy audio dla objętości wokół bałwana.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień z pozycji z DialogueVolume.
    3. Wstaw obiekt Wire, aby przenieść strumień z generatora mowy audio do emitera audio.
  3. Wybierz obiekt AudioTextToSpeech, a następnie w oknie Właściwości:
    1. Ustaw Text na "Zbierz każdy ostatni gumpdrop, aby otworzyć mój dom!"
    2. Ustaw VoiceId na 2, aby ustawić sztuczny głos na naśladujący brytyjską kobietę.
    3. Ustaw Volume na 3, aby odtwarzać dźwięk przy dużej głośności, abyś mógł usłyszeć dźwięk TTS ponad inne źródła dźwięku w doświadczeniu.
  4. Wybierz Wire, a następnie w oknie Właściwości:
    1. Ustaw SourceInstance na nowy AudioTextToSpeech, aby określić, że chcesz, aby przewód przenosił dźwięk z tego konkretnego generatora mowy audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił dźwięk do tego konkretnego emitera dźwięku w obrębie objętości.
  5. W oknie Eksplorator przejdź do StarterPlayerStarterCharacterScripts, a następnie wstaw LocalScript, zmień jego nazwę na PlayBasicTTSAudioWhenInVolume, i wklej następujący kod do lokalnego skryptu:

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)

Ten skrypt rozpoczyna się od uzyskania dostępu do usług Workspace i Players, aby móc odwołać się do ich dzieci i funkcjonalności. Dla każdej postaci gracza, która ładowana jest lub respawnowana w doświadczeniu, skrypt czeka na:

  • Obiekty Humanoid i Animator postaci.
  • Obiekt objętości w przestrzeni roboczej nazwany DialogueVolume.

Kiedy coś koliduje z objętością, funkcja obsługująca zdarzenie Touched uzyskuje pierwszego przodka, który jest Model, co powinno być postacią, jeśli BasePart, która kolidowała z objętością, jest potomkiem modelu postaci. Jeśli tak jest, funkcja następnie:

  • Ustawia debounce na true.
  • Odtwarza i czeka na zakończenie dźwięku TTS.
  • Ustawia debounce z powrotem na false.

Ustawienie debounce z false na true, a potem z powrotem na false po zakończeniu odtwarzania podstawowego dźwięku TTS to wzór debouncowania, który zapobiega wielokrotnemu uruchamianiu dźwięku, gdy gracze ciągle kolidują z objętością. Aby uzyskać więcej informacji na temat tego wzoru debouncowania, zapoznaj się z Debounce - Wykrywanie kolizji.

  1. Testuj doświadczenie, aby usłyszeć dialogi instruktażowe postaci, gdy twoja postać gracza dotknie objętości wokół bałwana.

Możesz dalej eksperymentować z tym dźwiękiem, modyfikując właściwości Text, VoiceID, Pitch i Speed na nowe wartości. Generowana mowa staje się zupełnie inna bez potrzeby nagrywania i przesyłania nowego pliku audio dla każdego scenariusza.

TTS kontekstowe

TTS kontekstowe to bardziej zaawansowana forma tekst-u-mowę, w której sztuczny głos odczytuje ciąg tekstowy w odniesieniu do gracza, stanu ich otoczenia lub statusu rozgrywki. Oznacza to, że za każdym razem, gdy gracz uruchamia dźwięk TTS, słowa i sposób, w jaki sztuczny głos je odczytuje, dostosowują się odpowiednio.

Ta forma TTS jest przydatna dla scenariuszy rozgrywki, które są ciągle zmieniające się, takich jak kierunkowe wskazówki dźwiękowe, statusy celów czy unikalne interakcje z NPC. W związku z tym, ponieważ TTS kontekstowe musi się transformować, aby być dokładne, musisz skonfigurować elementy rozgrywki, aby śledzić ich status, gdy gracze poruszają się po otoczeniu i realizują cele w grze.

Istnieje wiele sposobów, aby osiągnąć ten cel, a próbka używa niestandardowych atrybutów do śledzenia koloru i lokalizacji każdego gumpdropa, który gracz musi zebrać, aby wejść do domu piernikowego. Aby uzyskać więcej informacji na temat atrybutów, zobacz Właściwości i atrybuty.


Każdy obiekt gumpdrop ma atrybuty, które opisują ich kolor i lokalizację w otoczeniu.
Zbliżenie na żółty gumpdrop
Zbliżenie na zielony gumpdrop
Zbliżenie na czerwony gumpdrop

Aby odtworzyć kontekstowe dźwięki TTS 3D w próbce Gingerbread House - Text-to-Speech:

  1. W oknie Eksplorator przejdź do WorkspaceGumDrops.

  2. Skonfiguruj trzy niestandardowe atrybuty, aby śledzić żółty gumpdrop.

    1. Wybierz żółty gumpdrop, a następnie w oknie Właściwości przejdź do sekcji Atrybuty, a następnie kliknij ikonę plusa. Pojawi się okno dialogowe.
    2. W polu Nazwa wpisz ColorDescription.
    3. W menu rozwijanym Typ wybierz string.
    4. Kliknij przycisk Zapisz.
    5. Ustaw nowy atrybut ColorDescription na żółty.
    6. Używając tego procesu, stwórz jeszcze dwa atrybuty, używając następujących wartości.
    NazwaTypWartość
    HintOrdernumber0
    LocationDescriptionstringprzy wodospadzie
  3. Skonfiguruj trzy niestandardowe atrybuty, aby śledzić zielony gumpdrop.

    1. W oknie Eksplorator wybierz zielony gumpdrop.
    2. W oknie Właściwości stwórz trzy atrybuty, używając następujących wartości.
    NazwaTypWartość
    ColorDescriptionstringzielony
    HintOrdernumber1
    LocationDescriptionstringna krawędzi
  4. Skonfiguruj trzy niestandardowe atrybuty, aby śledzić czerwony gumpdrop.

    1. W oknie Eksplorator wybierz czerwony gumpdrop.
    2. W oknie Właściwości stwórz trzy atrybuty, używając następujących wartości.
    NazwaTypWartość
    ColorDescriptionstringczerwony
    HintOrdernumber2
    LocationDescriptionstringza płotem
  5. W oknie Eksplorator przejdź do WorkspaceHintVolume, a następnie:

    1. Wstaw obiekt AudioTextToSpeech, aby stworzyć generator mowy audio dla objętości wokół renifera.
    2. Wstaw obiekt AudioEmitter, aby emitować strumień pozycyjny z HintVolume.
    3. Wstaw obiekt Wire, aby przenieść strumień z generatora mowy audio do emitera.
  6. Wybierz Wire, a następnie w oknie Właściwości:

    1. Ustaw SourceInstance na nowy AudioTextToSpeech, aby określić, że chcesz, aby przewód przenosił audio z tego konkretnego generatora mowy audio.
    2. Ustaw TargetInstance na nowy AudioEmitter, aby określić, że chcesz, aby przewód przenosił audio do tego konkretnego emitera audio w obrębie objętości.
  7. W oknie Eksplorator przejdź do StarterPlayerStarterCharacterScripts, a następnie wstaw LocalScript, zmień jego nazwę na PlayContextTTSAudioWhenInVolume, i wklej następujący kod do lokalnego skryptu:


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 "Nie ma już gumpdropów. Sprawdź w środku domu."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Pozostało " .. #remainingGumdrops .. " gumpdropów. Szukaj " .. colorDescription .. " w " .. locationDescription .. "."
or "Został jeden gumpdrop. Jest " .. colorDescription .. " i znajduje się " .. 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("Gracz dotknął objętości.")
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)

Ten skrypt rozpoczyna się od uzyskania dostępu do usług Workspace i Players, aby móc odwołać się do ich dzieci i funkcjonalności. Dla każdej postaci gracza, która ładowana jest lub respawnowana w doświadczeniu, skrypt czeka na:

  • Obiekty Humanoid i Animator postaci.
  • Obiekt objętości w przestrzeni roboczej nazwany HintVolume.

Funkcja getRemainingGumdrops() skryptu zwraca listę obiektów gumpdrop Part w folderze Gumdrops i filtruje wszelkie części, które gracz już zebrał. Pozostałe gumpdropy są sortowane w określonym porządku zgodnie z atrybutem HintOrder każdego gumpdropa.

Funkcja getReindeerHint(remainingGumdrops) skryptu przyjmuje tę listę z getRemainingGumdrops() i zwraca tekstową wiadomość opisującą, gdzie gracz może znaleźć inne pozostałe gumpdropy, w tym zarówno opis koloru, jak i lokalizacji następnego gumpdropa, który gracz musi zebrać. Jednakże, jeśli gracz zebrał już wszystkie gumpdropy w otoczeniu, wiadomość tekstowa opisuje, gdzie udać się dalej po zebraniu wszystkich gumpdropów w otoczeniu.

Kiedy coś koliduje z objętością, funkcja obsługująca zdarzenie Touched uzyskuje pierwszego przodka, który jest Model, co powinno być postacią, jeśli BasePart, która kolidowała z objętością, jest potomkiem modelu postaci. Jeśli tak jest, funkcja następnie:

  • Ustawia debounce na true.
  • Uzyskuje listę pozostałych gumpdropów i wiadomość tekstową opisującą następnego gumpdropa, którego gracz musi znaleźć.
  • Przekształca tę wiadomość tekstową w audio za pomocą obiektu AudioTextToSpeech, odtwarza dźwięk i czeka na jego zakończenie.
  • Ustawia debounce z powrotem na false.

Ustawienie debounce z false na true, a następnie z powrotem na false po zakończeniu odtwarzania dźwięku TTS kontekstowego to wzór debouncowania, który zapobiega wielokrotnemu uruchamianiu dźwięku, gdy gracze ciągle kolidują z objętością. Aby uzyskać więcej informacji na temat tego wzoru debouncowania, zapoznaj się z Debounce - Wykrywanie kolizji.

  1. Testuj doświadczenia, aby usłyszeć kontekstowe wskazówki, gdy twoja postać gracza dotknie objętości wokół renifera. Dźwięk TTS zmienia się w zależności od liczby i koloru gumpdropów, które postać gracza już znalazła w otoczeniu.

©2026 Roblox Corporation. Nazwa Roblox, logo Roblox oraz hasło „Powering Imagination” należą do naszych zarejestrowanych i niezarejestrowanych znaków towarowych na terenie Stanów Zjednoczonych oraz w innych krajach.