Orta seviye öğreticiler

Metin-okuma ekleme

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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:

VoiceIDSes AçıklamasıSesi Örnekle
1Britanyalı erkek
2Britanyalı kadın
3Amerika Birleşik Devletleri erkek #1
4Amerika Birleşik Devletleri kadın #1
5Amerika Birleşik Devletleri erkek #2
6Amerika Birleşik Devletleri kadın #2
7Avustralyalı erkek
8Avustralyalı kadın
9Retro ses #1
10Retro ses #2
11Sunucu sesi
101İspanyol erkek
102İspanyol kadın
201Alman erkek
202Alman kadın
301İtalyan erkek
302İtalyan kadın
401Fransız erkek
402Fransız kadın

Örnek Gingerbread House - Metin-okuma alan dosyasında temel 3D TTS sesini yeniden oluşturmak için:

  1. Oyuncu karakterinize bağlı varsayılan bir dinleyici etkinleştirin.
    1. Explorer penceresinde SoundService'i seçin.
    2. 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.
  2. Explorer penceresinde WorkspaceDialogueVolume'a gidin, ardından:
    1. Bir ses konuşma üreteci oluşturmak için bir AudioTextToSpeech nesnesi ekleyin.
    2. DialogueVolume'dan bir konumsal akış yaymak için bir AudioEmitter nesnesi ekleyin.
    3. Ses konuşma üretecinden ses yayımcısına akışı taşımak için bir Wire nesnesi ekleyin.
  3. AudioTextToSpeech nesnesini seçin, ardından Properties penceresinde:
    1. Text değerini "Evimi açmak için her bir gumpdrop'u topla!" şeklinde ayarlayın.
    2. Yapay sesi Britanyalı kadını taklit edecek şekilde ayarlamak için VoiceId değerini 2 olarak ayarlayın.
    3. Diğer ses kaynaklarının deneyim içindeki sesi duyabilmeniz için Volume değerini 3 olarak ayarlayın.
  4. Wire nesnesini seçin, ardından Properties penceresinde:
    1. Bu belirli ses konuşma üretecinden ses taşımak istediğinizi belirtmek için SourceInstance değerini yeni AudioTextToSpeech'inize ayarlayın.
    2. Bu belirli ses yayımcısına ses taşımak istediğinizi belirtmek için TargetInstance değerini yeni AudioEmitter'ınıza ayarlayın.
  5. Explorer penceresine geri dönün, StarterPlayerStarterCharacterScripts'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:

  • Karakterin Humanoid ve Animator nesneleri.
  • 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.

  1. 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.


Her gumpdrop nesnesinin renk ve çevredeki konumlarını tanımlayan öznitelikleri vardır.
Sarı gumpdrop'un yakın plan görüntüsü
Yeşil gumpdrop'un yakın plan görüntüsü
Kırmızı gumpdrop'un yakın plan görüntüsü

Örnek Gingerbread House - Metin-okuma alan dosyasında bağlama duyarlı 3D TTS sesini yeniden oluşturmak için:

  1. Explorer penceresinde WorkspaceGumDrops içine gidin.

  2. Sarı gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.

    1. 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.
    2. Name alanına ColorDescription yazın.
    3. Type açılır menüsünden string seçin.
    4. Save butonuna tıklayın.
    5. Yeni ColorDescription özniteliğini sarı olarak ayarlayın.
    6. Bu işlemle, aşağıdaki değerlere sahip iki öznitelik daha oluşturun.
    İsimTipDeğer
    HintOrdersayı0
    LocationDescriptionstringşelalenin yanında
  3. Yeşil gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.

    1. Explorer penceresinde yeşil gumpdrop'u seçin.
    2. Properties penceresinde aşağıdaki değerlere sahip üç öznitelik oluşturun.
    İsimTipDeğer
    ColorDescriptionstringyeşil
    HintOrdersayı1
    LocationDescriptionstringkenarda
  4. Kırmızı gumpdrop'u takip etmek için üç özel öznitelik yapılandırın.

    1. Explorer penceresinde kırmızı gumpdrop'u seçin.
    2. Properties penceresinde aşağıdaki değerlere sahip üç öznitelik oluşturun.
    İsimTipDeğer
    ColorDescriptionstringkırmızı
    HintOrdersayı2
    LocationDescriptionstringçitin arkasında
  5. Explorer penceresinde WorkspaceHintVolume içine gidin, ardından:

    1. HintVolume etrafındaki ses konuşma üretecini oluşturmak için bir AudioTextToSpeech nesnesi ekleyin.
    2. HintVolume'dan bir konumsal akış yayıcı olarak bir AudioEmitter ekleyin.
    3. Ses konuşma üretecinden ses yayımcısına akışı taşımak için bir Wire nesnesi ekleyin.
  6. Wire nesnesini seçin, ardından Properties penceresinde:

    1. Bu belirli ses konuşma üretecinden ses taşımak istediğinizi belirtmek için SourceInstance değerini yeni AudioTextToSpeech nesnesi olarak ayarlayın.
    2. Bu belirli ses yayımcısına ses taşımak istediğinizi belirtmek için TargetInstance değerini yeni AudioEmitter nesnesi olarak ayarlayın.
  7. Explorer penceresine geri dönün, StarterPlayerStarterCharacterScripts'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:

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.

  1. 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.

©2026 Roblox Corporation. Roblox, the Roblox logo and Powering Imagination are among our registered and unregistered trademarks in the U.S. and other countries.