Metin-okuma (TTS - Text-to-Speech), metin dizilerini yapay bir ses kullanarak konuşma seslerine dönüştüren bir yardımcı teknolojidir. Bu, görme, hareket veya bilişsel engelleri olan oyuncular için deneyimlerinizi daha erişilebilir hale getirmeye ek olarak, tüm olası anlatı senaryoları için sesleri önceden kaydetmek zorunda kalmadan dinamik olarak ses üretmenizi sağlar.
Gingerbread House - Başlangıç .rbxl dosyasını bir başlangıç noktası olarak kullanarak ve Gingerbread House - Metin-okuma dosyasını bir referans olarak alarak, bu eğitimde deneyimlerinize hem temel hem de bağlama duyarlı TTS seslerini nasıl ekleyeceğinizi gösteren bilgiler sunulmaktadır. Aşağıdaki konularda rehberlik edilecektir:
- Kullanıcı arayüzü (UI) etkileşimleri ve eğitimler gibi değişmeyecek ortak oyun senaryoları için TTS'nin tetiklenmesi.
- TTS'yi oyuncu eylemleri, çevresel durum veya esnek hedeflere uyum sağlayacak şekilde yapılandırma.
İşlem sırasında herhangi bir noktada zorlanırsanız, ilerlemenizi karşılaştırmak için Gingerbread House - Metin-okuma dosyasını referans olarak kullanabilirsiniz.
Ses Nesneleri
TTS sesi oluşturmak için, bu eğitim boyunca çalışacağınız ses nesnelerini anlamak önemlidir. TTS için beş ana türde ses nesnesi vardır:
- AudioTextToSpeech nesnesi, metin dizilerini konuşma seslerine dönüştürür.
- AudioEmitter nesnesi, 3D ortamda sesi yaymak için kullanılan bir sanalfon'dur.
- AudioListener nesnesi, 3D ortamdan sesi almak için kullanılan bir sanalmikrofon'dur.
- AudioDeviceOutput nesnesi, gerçek dünyada bulunan bir fiziksel donanım cihazı, örneğin bir hoparlör veya kulaklıktır.
- Wires, ses akışlarını bir nesneden diğerine taşır.
Bu ses nesnelerinin tümü, oyuncu eylemlerine yanıt olarak TTS sesi yaymak için birlikte çalışır. Bir oyuncunun bir deneyimdeki başlığı takarken uygulanan 3D sesi gösteren bir örneğe bakalım:
- AudioTextToSpeech, bir oyuncu bir oynanamaz karakterin (NPC) etrafındaki bir parçaya dokunduğunda metni yükler ve sesi dönüştürür.
- AudioEmitter, NPC'den 3D ortama bir TTS sesi akışını yayıyor.
- Bir Wire, akışı AudioTextToSpeech nesnesinden AudioEmitter nesnesine taşır, böylece akış NPC'den çıkar.
- Karakterin çocuk AudioListener nesnesi, 3D ortamda bu sesi dinler ve geri kulaklığa iletir.
- AudioDeviceOutput nesnesi sesi AudioListener'dan oyuncunun fiziksel hoparlörüne veya bu durumda kulaklığa taşır.
Aşağıdaki bölümler daha derinlemesine iniyor ve bu nesneleri inceleyerek temel ve bağlama duyarlı seslerin nasıl oynatılacağını öğreniyorsunuz. Bu nesneleri inceleyerek, deneyimden oyuncuya sesi nasıl yakalayacağınızı ve ileteceğinizi daha doğru bir şekilde tahmin edebilirsiniz.
Temel TTS
Temel TTS, yapay sesin metin dizilerini, oyuncu veya çevre bağlamı gözetmeksizin okuduğu en yaygın metin-okuma şeklidir. Bu, oyuncu TTS sesini tetiklediğinde, metinlerin ve yapay sesin kelimeleri okuma şeklinin, oyuncunun durumu, eylemleri veya çevresel durumu ne olursa olsun tutarlı kalacağı anlamına gelir.
Bu TTS biçimi, oyuncuların UI menüleriyle, eğitimlerle veya satıcı teklifleri veya düşman sesleri gibi rutin NPC etkileşimleriyle etkileşim kurduğu çoğu oyun senaryosu için faydalıdır. Roblox, bu etkileşimler için deneyebileceğiniz aşağıdaki ses türlerini sağlar:
| VoiceID | Ses Açıklaması | Sesi Örnekle |
|---|---|---|
| 1 | Britanyalı erkek | |
| 2 | Britanyalı kadın | |
| 3 | Amerika Birleşik Devletleri erkek #1 | |
| 4 | Amerika Birleşik Devletleri kadın #1 | |
| 5 | Amerika Birleşik Devletleri erkek #2 | |
| 6 | Amerika Birleşik Devletleri kadın #2 | |
| 7 | Avustralyalı erkek | |
| 8 | Avustralyalı kadın | |
| 9 | Retro ses #1 | |
| 10 | Retro ses #2 | |
| 11 | Sunucu sesi | |
| 101 | İspanyol erkek | |
| 102 | İspanyol kadın | |
| 201 | Alman erkek | |
| 202 | Alman kadın | |
| 301 | İtalyan erkek | |
| 302 | İtalyan kadın | |
| 401 | Fransız erkek | |
| 402 | Fransız kadın |
Örnek Gingerbread House - Metin-okuma alan dosyasında temel 3D TTS sesini yeniden oluşturmak için:
- Oyuncu karakterinize bağlı varsayılan bir dinleyici etkinleştirin.
- Explorer penceresinde SoundService'i seçin.
- Properties penceresinde DefaultListenerLocation'u Character olarak ayarlayın. Deneyimi çalıştırdığınızda, motor otomatik olarak:
- Her bir oyuncu karakterinin Humanoid.RootPart altında bir AudioListener oluşturur, böylece ses kaynaklarının deneyim içindeki konumu ve ölçeğine göre gerçek dünya hoparlörlerinizde seslerin kaymasını duyabilirsiniz.
- SoundService altında bir AudioDeviceOutput oluşturur.
- Explorer penceresinde Workspace ⟩ DialogueVolume'a gidin, ardından:
- Bir ses konuşma üreteci oluşturmak için bir AudioTextToSpeech nesnesi ekleyin.
- DialogueVolume'dan bir konumsal akış yaymak için bir AudioEmitter nesnesi ekleyin.
- Ses konuşma üretecinden ses yayımcısına akışı taşımak için bir Wire nesnesi ekleyin.
- AudioTextToSpeech nesnesini seçin, ardından Properties penceresinde:
- Text değerini "Evimi açmak için her bir gumpdrop'u topla!" şeklinde ayarlayın.
- Yapay sesi Britanyalı kadını taklit edecek şekilde ayarlamak için VoiceId değerini 2 olarak ayarlayın.
- Diğer ses kaynaklarının deneyim içindeki sesi duyabilmeniz için Volume değerini 3 olarak ayarlayın.
- Wire nesnesini seçin, ardından Properties penceresinde:
- Bu belirli ses konuşma üretecinden ses taşımak istediğinizi belirtmek için SourceInstance değerini yeni AudioTextToSpeech'inize ayarlayın.
- Bu belirli ses yayımcısına ses taşımak istediğinizi belirtmek için TargetInstance değerini yeni AudioEmitter'ınıza ayarlayın.
- Explorer penceresine geri dönün, StarterPlayer ⟩ StarterCharacterScripts'e gidin, bir LocalScript ekleyin, adını PlayBasicTTSAudioWhenInVolume olarak değiştirin, ve aşağıdaki kodu yerel script'e yapıştırın:
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)
Bu script, Workspace ve Players hizmetlerini alarak çocuklarını ve işlevlerini referans alır. Deneyime yüklenen veya yeniden doğan her bir oyuncu karakteri için, script şu nesneleri bekler:
- DialogueVolume adlı hacim nesnesi.
Hacme bir şey çarptığında, Touched olayı işleyici fonksiyonu, bir Model olan ilk nesneyi alır. Eğer BasePart hacme çarpmışsa ve bir karakter modelinin altındaysa, fonksiyon daha sonra:
- Debounce'u true olarak ayarlar.
- TTS sesini çalar ve sesin bitmesini bekler.
- Debounce'u yeniden false olarak ayarlar.
Debounce değerini TTS sesinin bitiminde false'dan true'ya geçip tekrar false'a ayarlamak, oyuncuların sürekli olarak hacimle çarpıştıklarında sesin tekrar tetiklenmesini önleyen bir işlem modelidir. Bu debounce işlemi hakkında daha fazla bilgi için Debounce - Çarpışmaları tespit etme sayfasına bakabilirsiniz.
Deneyimi oynatıp gözlemleyin ve oyuncu karakterinizin kardan adamın etrafındaki hacmi yaptığı etkileşimde öğretici karakter konuşmasını duyun.
Bu sesi daha fazla denemek için Text, VoiceID, Pitch ve Speed özelliklerini yeni değerlere değiştirebilirsiniz. Üretilen konuşma farklı olur ve her senaryo için yeni bir ses dosyası kaydedip yüklemeye ihtiyaç duymazsınız.
Bağlama duyarlı TTS
Bağlama duyarlı TTS, yapay sesin bir metin dizisini oyuncuya, çevresinin durumuna veya oyun durumuna göre okuduğu daha gelişmiş bir metin-okuma biçimidir. Bu, oyuncu TTS sesini tetiklediğinde, kelimelerin ve yapay sesin kelimeleri okuma şeklinin uygun şekilde uyum sağladığı anlamına gelir.
Bu TTS biçimi, yönlendirme ses ipuçları, hedef durumu veya benzersiz NPC etkileşimleri gibi sürekli değişen oyun senaryoları için faydalıdır. Bu nedenle, bağlama duyarlı TTS'nin doğru olması için dönüşüm yapması gerektiğinden, oyuncuların çevredeki durumu nasıl takip edeceğinizi yapılandırmak önemlidir.
Bu görevi gerçekleştirmenin birçok yolu olmasına rağmen, örnek, oyuncunun zencefilli evin içine girmek için toplaması gereken her gumpdrop'un renk ve konum bilgilerini takip etmek için özel öznitelikler kullanmaktadır. Öznitelikler hakkında daha fazla bilgi için Özellikler ve nitelikler sayfasını inceleyin.



Örnek Gingerbread House - Metin-okuma alan dosyasında bağlama duyarlı 3D TTS sesini yeniden oluşturmak için:
Explorer penceresinde Workspace ⟩ GumDrops içine gidin.
Sarı gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.
- Sarı gumpdrop'u seçin, ardından Properties penceresinde Attributes bölümüne gidin ve artı simgesine tıklayın. Bir açılır iletişim kutusu açılır.
- Name alanına ColorDescription yazın.
- Type açılır menüsünden string seçin.
- Save butonuna tıklayın.
- Yeni ColorDescription özniteliğini sarı olarak ayarlayın.
- Bu işlemle, aşağıdaki değerlere sahip iki öznitelik daha oluşturun.
İsim Tip Değer HintOrder sayı 0 LocationDescription string şelalenin yanında Yeşil gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.
- Explorer penceresinde yeşil gumpdrop'u seçin.
- Properties penceresinde aşağıdaki değerlere sahip üç öznitelik oluşturun.
İsim Tip Değer ColorDescription string yeşil HintOrder sayı 1 LocationDescription string kenarda Kırmızı gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.
- Explorer penceresinde kırmızı gumpdrop'u seçin.
- Properties penceresinde aşağıdaki değerlere sahip üç öznitelik oluşturun.
İsim Tip Değer ColorDescription string kırmızı HintOrder sayı 2 LocationDescription string çitin arkasında Explorer penceresinde Workspace ⟩ HintVolume içine gidin, ardından:
- HintVolume etrafındaki ses konuşma üretecini oluşturmak için bir AudioTextToSpeech nesnesi ekleyin.
- HintVolume'dan bir konumsal akış yayıcı olarak bir AudioEmitter ekleyin.
- Ses konuşma üretecinden ses yayımcısına akışı taşımak için bir Wire nesnesi ekleyin.
Wire nesnesini seçin, ardından Properties penceresinde:
- Bu belirli ses konuşma üretecinden ses taşımak istediğinizi belirtmek için SourceInstance değerini yeni AudioTextToSpeech nesnesi olarak ayarlayın.
- Bu belirli ses yayımcısına ses taşımak istediğinizi belirtmek için TargetInstance değerini yeni AudioEmitter nesnesi olarak ayarlayın.
Explorer penceresine geri dönün, StarterPlayer ⟩ StarterCharacterScripts'e gidin, bir LocalScript ekleyin, adını PlayContextTTSAudioWhenInVolume olarak değiştirin, ve aşağıdaki kodu yerel script'e yapıştırın:
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 "Gumpdrop kalmadı. Evin içinde kontrol et."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "Toplam " .. #remainingGumdrops .. " gumpdrop kaldı. " .. colorDescription .. " olanı " .. locationDescription .. " bul."
or "Bir gumpdrop kaldı. O " .. colorDescription .. " rengi ve " .. 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("Oyuncu hacme dokundu.")
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)
Bu script, Workspace ve Players hizmetlerini alarak çocuklarını ve işlevlerini referans alır. Deneyime yüklenen veya yeniden doğan her bir oyuncu karakteri için, script şu nesneleri bekler:
- HintVolume adlı hacim nesnesi.
Script'in getRemainingGumdrops() fonksiyonu, Gumdrops klasöründe bulunan gumpdrop Part nesnelerinin bir listesini döndürür ve oyuncunun topladığı herhangi bir parçayı filtreler. Geriye kalan gumpdrop'lar, her bir gumpdrop'un HintOrder niteliğine göre belirli bir sıraya konur.
Script'in getReindeerHint(remainingGumdrops) fonksiyonu, getRemainingGumdrops() fonksiyonundan gelen listeyi alır ve oyuncunun bulması gereken herhangi bir kalan gumpdrop'un nerede olduğunu tanımlayan bir dize mesajı döndürür. Ayrıca, oyuncunun çevredeki tüm gumpdrop'ları topladığında nereye gideceğini tanımlayan bir dize mesajı verir.
Hacme bir şey çarptığında, Touched olayı işleyici fonksiyonu, bir Model olan ilk nesneyi alır. Eğer BasePart hacme çarpmışsa ve bir karakter modelinin altındaysa, fonksiyon daha sonra:
- Debounce'u true olarak ayarlar.
- Kalan gumpdrop'ların listesini alır ve oyuncunun bulması gereken sonraki gumpdrop'un tanımını içeren dize mesajını alır.
- Dizeyi AudioTextToSpeech nesnesi kullanarak sese çevirir, sesi çalar ve sesin bitmesini bekler.
- Debounce'u yeniden false olarak ayarlar.
Debounce değerini TTS sesinin bitiminde false'dan true'ya geçip tekrar false'a ayarlamak, oyuncuların hacimle sürekli çarpıştıklarında sesin tekrar tetiklenmesini önleyen bir işlem modelidir. Bu debounce işlemi hakkında daha fazla bilgi için Debounce - Çarpışmaları tespit etme sayfasına bakabilirsiniz.
Deneyimleri oynatıp gözlemleyin ve oyuncu karakterinizin rengeyik etrafındaki hacme dokunduğunda bağlamsal ipuçlarını duyun. TTS sesi, oyuncu karakterinin çevrede bulduğu gumpdrop'ların sayısına ve rengine göre değişir.