Tambahkan teks-ke-suara

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Teks-ke-suara adalah bentuk teknologi bantu yang mengubah string teks menjadi suara menggunakan suara buatan. Selain meningkatkan aksesibilitas permainan Anda untuk pemain dengan gangguan penglihatan, mobilitas, atau kognitif, TTS memungkinkan Anda untuk menghasilkan suara secara dinamis sehingga Anda tidak perlu merekam audio sebelumnya untuk semua kemungkinan skenario naratif.

Menggunakan file Gingerbread House - Start .rbxl sebagai tempat awal dan Gingerbread House - Teks-ke-Suara sebagai referensi, tutorial ini menunjukkan kepada Anda cara menambahkan audio TTS dasar dan kontekstual ke dalam permainan Anda, termasuk panduan tentang:

  • Memicu TTS untuk skenario gameplay umum yang tidak akan pernah berubah, seperti interaksi UI dan tutorial.
  • Mengonfigurasi TTS sehingga dapat beradaptasi dengan tindakan pemain, status lingkungan, atau tujuan yang fleksibel.

Jika pada titik mana pun Anda terjebak dalam proses, Anda dapat menggunakan Gingerbread House - Teks-ke-Suara sebagai referensi untuk membandingkan kemajuan Anda.

Objek Audio

Untuk membuat audio TTS, penting untuk memahami objek audio yang akan Anda kerjakan sepanjang tutorial ini. Ada lima jenis utama objek audio untuk TTS:

  • Objek AudioTextToSpeech mengubah string teks menjadi suara.
  • Objek AudioEmitter adalah speaker virtual yang memancarkan audio ke dalam lingkungan 3D.
  • Objek AudioListener adalah mikrofon virtual yang menangkap audio dari lingkungan 3D.
  • Objek AudioDeviceOutput adalah perangkat keras fisik di dunia nyata, seperti speaker atau headphone.
  • Wires membawa aliran audio dari satu objek ke objek lainnya.

Semua objek audio ini bekerja sama untuk memancarkan suara TTS sebagai respons terhadap tindakan pemain. Mari kita lihat bagaimana ini bekerja dalam praktik untuk audio 3D menggunakan contoh seorang pemain yang mengenakan headset saat bermain game dengan laptop mereka:

  • AudioTextToSpeech memuat dan mengubah teks menjadi audio setiap kali pemain menyentuh bagian dekat karakter non-playable (NPC).
  • AudioEmitter memancarkan aliran audio TTS dari NPC ke dalam lingkungan 3D.
  • Sebuah Wire membawa aliran dari AudioTextToSpeech ke AudioEmitter sehingga aliran keluar dari NPC.
  • Objek anak AudioListener dari karakter mendengarkan suara itu dalam lingkungan 3D dan mengirimkannya kembali ke headset mereka.
  • Objek AudioDeviceOutput membawa suara dari AudioListener ke speaker fisik pemain, atau dalam hal ini, headphone mereka.

Bagian berikut menyelami lebih dalam dan merujuk objek-objek ini saat Anda belajar bagaimana memainkan audio dasar dan kontekstual. Saat Anda meninjau objek-objek ini dengan teknik yang akan datang, Anda dapat lebih akurat memprediksi bagaimana menangkap dan mengalirkan suara dari permainan ke pemain.

TTS Dasar

TTS dasar adalah bentuk paling umum dari teks-ke-suara di mana suara buatan membaca string teks terlepas dari konteks pemain atau lingkungan. Ini berarti bahwa setiap kali pemain memicu audio TTS, kata-kata dan cara suara buatan membaca kata-kata tetap konsisten tidak peduli keadaan pemain, tindakan mereka, atau status lingkungan.

Bentuk TTS ini berguna dalam sebagian besar skenario gameplay, seperti pemain yang berinteraksi dengan menu UI, tutorial, atau interaksi rutin NPC seperti tawaran vendor atau suara musuh. Roblox menyediakan jenis suara berikut yang dapat Anda coba untuk interaksi ini:

VoiceIDDeskripsi SuaraContoh Audio
1Pria Inggris
2Wanita Inggris
3Pria Amerika Serikat #1
4Wanita Amerika Serikat #1
5Pria Amerika Serikat #2
6Wanita Amerika Serikat #2
7Pria Australia
8Wanita Australia
9Suara retro #1
10Suara retro #2
11Suara pembawa acara
101Pria Spanyol
102Wanita Spanyol
201Pria Jerman
202Wanita Jerman
301Pria Italia
302Wanita Italia
401Pria Prancis
402Wanita Prancis

Untuk mereproduksi audio TTS 3D dasar dalam file contoh Gingerbread House - Teks-ke-Suara:

  1. Aktifkan pendengar default yang terpasang pada karakter pemain Anda.
    1. Di jendela Explorer, pilih SoundService.
    2. Di jendela Properties, atur DefaultListenerLocation ke Character. Ketika Anda menjalankan permainan, mesin secara otomatis:
      • Membuat AudioListener di bawah Humanoid.RootPart setiap karakter pemain sehingga Anda dapat mendengar suara berpindah di speaker dunia nyata Anda sesuai dengan posisi dan skala sumber suara dalam permainan.
      • Membuat AudioDeviceOutput di bawah SoundService.
  2. Di jendela Explorer, navigasikan ke WorkspaceDialogueVolume, kemudian:
    1. Masukkan objek AudioTextToSpeech untuk membuat generator suara audio untuk volume di sekitar manusia salju.
    2. Masukkan objek AudioEmitter untuk memancarkan aliran posisi dari DialogueVolume.
    3. Masukkan objek Wire untuk membawa aliran dari generator suara audio ke pemancar audio.
  3. Pilih objek AudioTextToSpeech, kemudian di jendela Properties:
    1. Atur Text ke "Kumpulkan setiap gumpdrop terakhir untuk membuka rumah saya!"
    2. Atur VoiceId ke 2 untuk mengatur suara buatan agar meniru suara wanita Inggris.
    3. Atur Volume ke 3 untuk memutar audio pada volume tinggi sehingga Anda mendengar suara TTS di atas sumber audio lainnya dalam permainan.
  4. Pilih Wire, kemudian di jendela Properties:
    1. Atur SourceInstance ke AudioTextToSpeech baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio dari generator suara audio spesifik ini.
    2. Atur TargetInstance ke AudioEmitter baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio ke pemancar audio spesifik ini dalam volume.
  5. Kembali ke jendela Explorer, navigasikan ke StarterPlayerStarterCharacterScripts, kemudian masukkan LocalScript, ganti namanya menjadi PlayBasicTTSAudioWhenInVolume, dan tempelkan kode berikut ke dalam skrip lokal:
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)

Skrip ini dimulai dengan mendapatkan layanan Workspace dan Players sehingga dapat merujuk anak-anak dan fungsionalitas mereka. Untuk setiap karakter pemain yang dimuat atau respawn kembali ke dalam permainan, skrip menunggu:

  • Objek Humanoid dan Animator dari karakter.
  • Objek volume di workspace yang bernama DialogueVolume.

Ketika sesuatu bertabrakan dengan volume, fungsi penangan acara Touched mendapatkan nenek moyang pertama yang merupakan Model, yang seharusnya adalah karakter jika BasePart yang bertabrakan dengan volume adalah keturunan dari model karakter. Jika iya, fungsi kemudian:

  • Mengatur debounce ke true.
  • Memutar dan menunggu audio TTS untuk selesai.
  • Mengatur debounce kembali ke false.

Mengatur debounce dari false ke true ke false lagi setelah audio TTS dasar selesai diputar adalah pola debounce yang mencegah audio dipicu berulang kali saat pemain terus-menerus bertabrakan dengan volume. Untuk informasi lebih lanjut tentang pola debounce ini, lihat Debounce - Deteksi tabrakan.

  1. Uji permainan untuk mendengar dialog karakter instruksional ketika karakter pemain Anda menyentuh volume di sekitar manusia salju.

Anda dapat lebih bereksperimen dengan audio ini dengan memodifikasi properti Text, VoiceID, Pitch, dan Speed ke nilai baru. Suara yang dihasilkan menjadi sangat berbeda tanpa perlu merekam dan mengunggah file audio baru untuk setiap skenario.

TTS Kontekstual

TTS kontekstual adalah bentuk yang lebih maju dari teks-ke-suara di mana suara buatan membaca string teks sehubungan dengan pemain, status lingkungan mereka, atau status gameplay. Ini berarti bahwa setiap kali pemain memicu audio TTS, kata-kata dan cara suara buatan membaca kata-kata beradaptasi sesuai.

Bentuk TTS ini berguna untuk skenario gameplay yang selalu berubah, seperti petunjuk audio arah, status tujuan, atau interaksi NPC yang unik. Oleh karena itu, karena TTS kontekstual perlu bertransformasi untuk akurat, Anda harus mengonfigurasi elemen gameplay sehingga Anda dapat melacak status mereka saat pemain menjelajahi lingkungan dan menyelesaikan tujuan gameplay.

Sementara ada banyak cara untuk menyelesaikan tugas ini, contoh ini menggunakan atribut kustom untuk melacak warna dan lokasi setiap gumpdrop yang harus dikumpulkan pemain untuk memasuki rumah jahe. Untuk informasi lebih lanjut tentang atribut, lihat Properti dan atribut.


Setiap objek gumpdrop memiliki atribut yang menggambarkan warna dan lokasi mereka di lingkungan.
Tampilan dekat gumpdrop kuning
Tampilan dekat gumpdrop hijau
Tampilan dekat gumpdrop merah

Untuk mereproduksi audio TTS 3D kontekstual dalam file contoh Gingerbread House - Teks-ke-Suara:

  1. Di jendela Explorer, navigasikan ke WorkspaceGumDrops.

  2. Konfigurasikan tiga atribut kustom untuk melacak gumpdrop kuning.

    1. Pilih gumpdrop kuning, kemudian di jendela Properties, navigasikan ke bagian Attributes, lalu klik ikon plus. Dialog pop-up akan ditampilkan.
    2. Di kolom Name, masukkan ColorDescription.
    3. Di menu dropdown Type, pilih string.
    4. Klik tombol Save.
    5. Atur atribut ColorDescription baru ke kuning.
    6. Menggunakan proses ini, buat dua atribut lagi dengan nilai berikut.
    NamaTypeNilai
    HintOrdernumber0
    LocationDescriptionstringdi dekat air terjun
  3. Konfigurasikan tiga atribut kustom untuk melacak gumpdrop hijau.

    1. Di jendela Explorer, pilih gumpdrop hijau.
    2. Di jendela Properties, buat tiga atribut menggunakan nilai berikut.
    NamaTypeNilai
    ColorDescriptionstringhijau
    HintOrdernumber1
    LocationDescriptionstringdi tepi
  4. Konfigurasikan tiga atribut kustom untuk melacak gumpdrop merah.

    1. Di jendela Explorer, pilih gumpdrop merah.
    2. Di jendela Properties, buat tiga atribut menggunakan nilai berikut.
    NamaTypeNilai
    ColorDescriptionstringmerah
    HintOrdernumber2
    LocationDescriptionstringdi belakang pagar
  5. Di jendela Explorer, navigasikan ke WorkspaceHintVolume, kemudian:

    1. Masukkan objek AudioTextToSpeech untuk membuat generator suara audio untuk volume di sekitar rusa.
    2. Masukkan objek AudioEmitter untuk memancarkan aliran posisi dari HintVolume.
    3. Masukkan objek Wire untuk membawa aliran dari generator suara audio ke pemancar audio.
  6. Pilih Wire, kemudian di jendela Properties:

    1. Atur SourceInstance ke AudioTextToSpeech baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio dari generator suara audio spesifik ini.
    2. Atur TargetInstance ke AudioEmitter baru Anda untuk menentukan bahwa Anda ingin kabel membawa audio ke pemancar audio spesifik ini dalam volume.
  7. Kembali ke jendela Explorer, navigasikan ke StarterPlayerStarterCharacterScripts, kemudian masukkan LocalScript, ganti namanya menjadi PlayContextTTSAudioWhenInVolume, dan tempelkan kode berikut ke dalam skrip lokal:

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 "Tidak ada gumpdrop yang tersisa. Periksa di dalam rumah."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Ada " .. #remainingGumdrops .. " gumpdrop tersisa. Cari yang " .. colorDescription .. " di " .. locationDescription .. "."
or "Ada satu gumpdrop tersisa. Itu " .. colorDescription .. " dan berada di " .. 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("Pemain menyentuh 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)

Skrip ini dimulai dengan mendapatkan layanan Workspace dan Players sehingga dapat merujuk anak-anak dan fungsionalitas mereka. Untuk setiap karakter pemain yang dimuat atau respawn kembali ke dalam permainan, skrip menunggu:

  • Objek Humanoid dan Animator dari karakter.
  • Objek volume di workspace yang bernama HintVolume.

Fungsi getRemainingGumdrops() dari skrip mengembalikan daftar objek gumpdrop Part dalam folder Gumdrops dan menyaring bagian mana pun yang telah dikumpulkan pemain. Gumpdrop yang tersisa diurutkan dalam urutan tertentu sesuai dengan atribut HintOrder masing-masing gumpdrop.

Fungsi getReindeerHint(remainingGumdrops) dari skrip mengambil daftar dari getRemainingGumdrops() dan mengembalikan pesan string yang menggambarkan di mana pemain dapat menemukan gumpdrop yang tersisa, termasuk deskripsi warna dan lokasi dari gumpdrop berikutnya yang perlu dikumpulkan pemain. Namun, jika pemain telah mengumpulkan semua gumpdrop di lingkungan, pesan string menggambarkan ke mana harus pergi setelah mereka mengumpulkan semua gumpdrop di lingkungan.

Ketika sesuatu bertabrakan dengan volume, fungsi penangan acara Touched mendapatkan nenek moyang pertama yang merupakan Model, yang seharusnya adalah karakter jika BasePart yang bertabrakan dengan volume adalah keturunan dari model karakter. Jika iya, fungsi kemudian:

  • Mengatur debounce ke true.
  • Mendapatkan daftar gumpdrop yang tersisa dan pesan string yang menggambarkan gumpdrop berikutnya yang perlu ditemukan pemain.
  • Mengubah string menjadi audio menggunakan objek AudioTextToSpeech, memutar audio, dan menunggu audio selesai.
  • Mengatur debounce kembali ke false.

Mengatur debounce dari false ke true ke false lagi setelah audio TTS kontekstual selesai diputar adalah pola debounce yang mencegah audio dipicu berulang kali saat pemain terus-menerus bertabrakan dengan volume. Untuk informasi lebih lanjut tentang pola debounce ini, lihat Debounce - Deteksi tabrakan.

  1. Uji permainan untuk mendengar petunjuk kontekstual ketika karakter pemain Anda menyentuh volume di sekitar rusa. Audio TTS berubah sesuai dengan jumlah dan warna gumpdrop yang telah ditemukan karakter pemain di lingkungan.

©2026 Roblox Corporation. Roblox, logo Roblox, dan Powering Imagination termasuk dalam merek dagang kami yang terdaftar dan tidak terdaftar di AS dan negara lainnya.