Memulai
Tutorial menengah

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 bantuan yang mengubah string teks menjadi suara menggunakan suara buatan. Selain meningkatkan aksesibilitas pengalaman Anda bagi pemain dengan gangguan penglihatan, mobilitas, atau kognisi, TTS memungkinkan Anda untuk menghasilkan suara secara dinamis sehingga Anda tidak perlu merekam audio sebelumnya untuk semua kemungkinan skenario naratif.

Dengan menggunakan file Gingerbread House - Start .rbxl sebagai tempat awal dan Gingerbread House - Teks ke Suara sebagai referensi, tutorial ini menunjukkan cara menambahkan baik audio TTS dasar maupun konteks-sensitif ke pengalaman 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 suatu saat 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 audio 3D menggunakan contoh seorang pemain yang mengenakan headset saat bermain pengalaman dengan laptop mereka:

  • AudioTextToSpeech memuat dan mengubah teks menjadi audio setiap kali pemain menyentuh bagian di 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 karakter mendengarkan suara tersebut 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-bagian berikut membahas lebih dalam dan merujuk pada objek-objek ini saat Anda belajar cara memutar audio baik dasar maupun konteks-sensitif. Saat Anda meninjau objek-objek ini dengan teknik yang akan datang, Anda dapat lebih akurat memprediksi cara menangkap dan memutar suara dari pengalaman ke pemain.

TTS Dasar

TTS dasar adalah bentuk paling umum dari teks-ke-suara di mana suara buatan membacakan string teks tanpa mempedulikan konteks pemain atau lingkungan. Ini berarti bahwa kapan pun pemain memicu audio TTS, kata-kata dan cara suara buatan membaca kata-kata tersebut tetap konsisten terlepas dari 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:

ID SuaraDeskripsi SuaraContoh Audio
1Laki-laki Inggris
2Perempuan Inggris
3Laki-laki Amerika #1
4Perempuan Amerika #1
5Laki-laki Amerika #2
6Perempuan Amerika #2
7Laki-laki Australia
8Perempuan Australia
9Suara retro #1
10Suara retro #2
11Suara pembawa acara
101Laki-laki Spanyol
102Perempuan Spanyol
201Laki-laki Jerman
202Perempuan Jerman
301Laki-laki Italia
302Perempuan Italia
401Laki-laki Prancis
402Perempuan Prancis

Untuk membuat 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 Eksplorer, pilih SoundService.
    2. Di jendela Properti, atur DefaultListenerLocation ke Karakter. Ketika Anda menjalankan pengalaman, mesin secara otomatis:
      • Membuat AudioListener di bawah Humanoid.RootPart setiap karakter pemain sehingga Anda dapat mendengar suara berubah di speaker dunia nyata Anda sesuai dengan posisi dan skala sumber suara di dalam pengalaman.
      • Membuat AudioDeviceOutput di bawah SoundService.
  2. Di jendela Eksplorer, navigasikan ke WorkspaceDialogueVolume, kemudian:
    1. Masukkan objek AudioTextToSpeech untuk membuat generator suara di sekitar salju.
    2. Masukkan objek AudioEmitter untuk memancarkan aliran dari DialogueVolume.
    3. Masukkan objek Wire untuk membawa aliran dari generator suara audio ke emitter audio.
  3. Pilih objek AudioTextToSpeech, kemudian di jendela Properti:
    1. Atur Text ke "Kumpulkan setiap gumpdrop terakhir untuk membuka rumah saya!"
    2. Atur VoiceId ke 2 untuk mengatur suara buatan agar menyerupai suara perempuan Inggris.
    3. Atur Volume ke 3 untuk memutar audio pada volume tinggi agar Anda dapat mendengar suara TTS di atas sumber audio lainnya di dalam pengalaman.
  4. Pilih Wire, kemudian di jendela Properti:
    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 emitter audio spesifik ini dalam volume.
  5. Kembali di jendela Eksplorer, 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 ke anak-anak mereka dan fungsionalitas. Untuk setiap karakter pemain yang dimuat atau respawn kembali ke pengalaman, skrip menunggu:

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

Ketika apapun bertabrakan dengan volume, fungsi pengendali 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 tersebut 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 dimainkan adalah pola debounce yang mencegah audio dari terus-menerus terpicu seiring pemain terus bertabrakan dengan volume. Untuk informasi lebih lanjut tentang pola debounce ini, lihat Debounce - Deteksi tabrakan.

  1. Uji coba pengalaman untuk mendengar dialog karakter instruksional saat karakter pemain Anda menyentuh volume di sekitar salju.

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

TTS yang Sadar Konteks

TTS yang sadar konteks adalah bentuk yang lebih lanjut dari teks ke suara di mana suara buatan membaca string teks terkait dengan pemain, status lingkungan mereka, atau status permainan. Ini berarti bahwa kapan pun pemain memicu audio TTS, kata-kata dan cara suara buatan membaca kata-kata tersebut beradaptasi sesuai.

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

Meskipun ada banyak cara untuk menyelesaikan tugas ini, contoh ini menggunakan atribut khusus untuk melacak warna dan lokasi dari setiap gumpdrop yang harus pemain kumpulkan untuk masuk ke rumah jahe. Untuk informasi lebih lanjut tentang atribut, lihat Properti dan atribut.


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

Untuk membuat audio TTS 3D yang sadar konteks dalam file contoh Gingerbread House - Teks ke Suara:

  1. Di jendela Eksplorer, navigasikan ke WorkspaceGumDrops.

  2. Konfigurasikan tiga atribut khusus untuk melacak gumpdrop kuning.

    1. Pilih gumpdrop kuning, kemudian di jendela Properti, navigasikan ke bagian Atribut, lalu klik ikon plus. Dialog pop-up ditampilkan.
    2. Di field Nama, masukkan ColorDescription.
    3. Di menu dropdown Tipe, pilih string.
    4. Klik tombol Simpan.
    5. Atur atribut ColorDescription baru menjadi kuning.
    6. Dengan proses ini, buat dua atribut lagi menggunakan nilai berikut.
    NamaTipeNilai
    HintOrdernumber0
    LocationDescriptionstringdi samping air terjun
  3. Konfigurasikan tiga atribut khusus untuk melacak gumpdrop hijau.

    1. Di jendela Eksplorer, pilih gumpdrop hijau.
    2. Di jendela Properti, buat tiga atribut menggunakan nilai berikut.
    NamaTipeNilai
    ColorDescriptionstringhijau
    HintOrdernumber1
    LocationDescriptionstringdi tepi
  4. Konfigurasikan tiga atribut khusus untuk melacak gumpdrop merah.

    1. Di jendela Eksplorer, pilih gumpdrop merah.
    2. Di jendela Properti, buat tiga atribut menggunakan nilai berikut.
    NamaTipeNilai
    ColorDescriptionstringmerah
    HintOrdernumber2
    LocationDescriptionstringdi balik pagar
  5. Di jendela Eksplorer, navigasikan ke WorkspaceHintVolume, kemudian:

    1. Masukkan objek AudioTextToSpeech untuk membuat generator suara 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 emitter audio.
  6. Pilih Wire, kemudian di jendela Properti:

    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 emitter audio spesifik ini dalam volume.
  7. Kembali di jendela Eksplorer, 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 yang tersisa. Cari yang " .. colorDescription .. " di " .. locationDescription .. "."
or "Hanya ada satu gumpdrop yang tersisa. Itu " .. colorDescription .. " dan terletak 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 ke anak-anak mereka dan fungsionalitas. Untuk setiap karakter pemain yang dimuat atau respawn kembali ke pengalaman, skrip menunggu:

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

Fungsi skrip getRemainingGumdrops() mengembalikan daftar objek gumpdrop Part di dalam folder Gumdrops dan memfilter setiap bagian yang telah dikumpulkan oleh pemain. Gumpdrop yang tersisa diurutkan dalam urutan tertentu berdasarkan atribut HintOrder masing-masing gumpdrop.

Fungsi skrip getReindeerHint(remainingGumdrops) mengambil daftar dari getRemainingGumdrops() dan mengembalikan pesan string yang menjelaskan 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 mereka harus pergi setelah mereka mengumpulkan semua gumpdrop di lingkungan.

Ketika apapun bertabrakan dengan volume, fungsi pengendali 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 tersebut kemudian:

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

Mengatur debounce dari false ke true ke false lagi setelah audio TTS yang sadar konteks selesai dimainkan adalah pola debounce yang mencegah audio dari terus-menerus terpicu seiring pemain terus bertabrakan dengan volume. Untuk informasi lebih lanjut tentang pola debounce ini, lihat Debounce - Deteksi tabrakan.

  1. Uji coba pengalaman 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 oleh karakter pemain di dalam 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.