ข้อความเป็นเสียงพูด เป็นรูปแบบของเทคโนโลยีช่วยเหลือที่แปลงข้อความเป็นเสียงพูดโดยใช้เสียงเทียม นอกจากจะช่วยปรับปรุงการเข้าถึงเกมของคุณสำหรับผู้เล่นที่มีปัญหาทางสายตา การเคลื่อนไหว หรือความคิดแล้ว TTS ยังช่วยให้คุณสร้างเสียงพูดแบบไดนามิกได้ เพื่อที่คุณจะไม่ต้องบันทึกเสียงล่วงหน้าสำหรับทุกสถานการณ์เล่าเรื่องที่เป็นไปได้
โดยใช้ไฟล์ Gingerbread House - Start .rbxl เป็นจุดเริ่มต้นและ Gingerbread House - Text-to-Speech เป็นข้อมูลอ้างอิง บทช่วยสอนนี้จะแสดงให้คุณเห็นวิธีการเพิ่มเสียง TTS ทั้งแบบพื้นฐานและแบบที่รับรู้บริบทในเกมของคุณ รวมถึงคำแนะนำเกี่ยวกับ:
- การเรียกใช้ TTS สำหรับสถานการณ์การเล่นเกมทั่วไปที่ไม่เคยเปลี่ยนแปลง เช่น การโต้ตอบกับ UI และบทช่วยสอน
- การกำหนดค่า TTS เพื่อให้มันปรับตัวตามการกระทำของผู้เล่น สถานะของสิ่งแวดล้อม หรือวัตถุประสงค์ที่ยืดหยุ่น
หากคุณติดขัดในกระบวนการใด ๆ คุณสามารถใช้ Gingerbread House - Text-to-Speech เป็นข้อมูลอ้างอิงเพื่อเปรียบเทียบความก้าวหน้าของคุณ
วัตถุเสียง
ในการสร้างเสียง TTS สิ่งสำคัญคือต้องเข้าใจวัตถุเสียงที่คุณจะทำงานด้วยตลอดบทช่วยสอนนี้ มีวัตถุเสียงหลักห้าประเภทสำหรับ TTS:
- วัตถุ AudioTextToSpeech แปลงข้อความเป็นเสียงพูด
- วัตถุ AudioEmitter เป็น ลำโพงเสมือน ที่ปล่อยเสียงเข้าสู่สภาพแวดล้อม 3D
- วัตถุ AudioListener เป็น ไมโครโฟนเสมือน ที่รับเสียงจากสภาพแวดล้อม 3D
- วัตถุ AudioDeviceOutput เป็น อุปกรณ์ฮาร์ดแวร์จริง ในโลกจริง เช่น ลำโพงหรือหูฟัง
- Wires ส่งเสียงจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง
วัตถุเสียงทั้งหมดนี้ทำงานร่วมกันเพื่อปล่อยเสียง TTS เพื่อตอบสนองต่อการกระทำของผู้เล่น มาดูวิธีการทำงานในทางปฏิบัติสำหรับเสียง 3D โดยใช้ตัวอย่างของผู้เล่นที่สวมหูฟังขณะเล่นเกมด้วยแล็ปท็อปของพวกเขา:
- วัตถุ AudioTextToSpeech จะโหลดและแปลงข้อความเป็นเสียงเมื่อผู้เล่นสัมผัสส่วนใกล้กับตัวละครที่ไม่สามารถเล่นได้ (NPC)
- วัตถุ AudioEmitter จะปล่อยเสียง TTS จาก NPC สู่สภาพแวดล้อม 3D
- วัตถุ AudioListener ของตัวละครจะฟังเสียงนั้นในสภาพแวดล้อม 3D และส่งกลับไปยังหูฟังของพวกเขา
- วัตถุ AudioDeviceOutput จะส่งเสียงจาก AudioListener ไปยังลำโพงจริงของผู้เล่น หรือในกรณีนี้คือหูฟังของพวกเขา
ส่วนถัดไปจะเจาะลึกและอ้างอิงถึงวัตถุเหล่านี้เมื่อคุณเรียนรู้วิธีการเล่นเสียงพื้นฐานและเสียงที่รับรู้บริบท เมื่อคุณตรวจสอบวัตถุเหล่านี้ด้วยเทคนิคที่กำลังจะมาถึง คุณจะสามารถคาดการณ์ได้อย่างแม่นยำมากขึ้นว่าคุณจะจับเสียงและส่งเสียงจากเกมไปยังผู้เล่นได้อย่างไร
TTS พื้นฐาน
TTS พื้นฐานเป็นรูปแบบที่พบบ่อยที่สุดของข้อความเป็นเสียงพูด ซึ่งเสียงเทียมจะอ่านข้อความโดยไม่คำนึงถึงบริบทของผู้เล่นหรือสิ่งแวดล้อม นั่นหมายความว่าเมื่อใดก็ตามที่ผู้เล่นเรียกใช้เสียง TTS คำและวิธีที่เสียงเทียมอ่านคำจะยังคงสอดคล้องกันไม่ว่าในสถานะของผู้เล่น การกระทำของพวกเขา หรือสถานะของสิ่งแวดล้อม
รูปแบบ TTS นี้มีประโยชน์ในสถานการณ์การเล่นเกมส่วนใหญ่ เช่น ผู้เล่นที่โต้ตอบกับเมนู UI บทช่วยสอน หรือการโต้ตอบกับ NPC ตามปกติ เช่น ข้อเสนอของผู้ขายหรือเสียงของศัตรู Roblox มีเสียงประเภทต่าง ๆ ที่คุณสามารถทดลองใช้สำหรับการโต้ตอบเหล่านี้:
| VoiceID | คำอธิบายเสียง | ตัวอย่างเสียง |
|---|---|---|
| 1 | ชายอังกฤษ | |
| 2 | หญิงอังกฤษ | |
| 3 | ชายสหรัฐอเมริกา #1 | |
| 4 | หญิงสหรัฐอเมริกา #1 | |
| 5 | ชายสหรัฐอเมริกา #2 | |
| 6 | หญิงสหรัฐอเมริกา #2 | |
| 7 | ชายออสเตรเลีย | |
| 8 | หญิงออสเตรเลีย | |
| 9 | เสียงย้อนยุค #1 | |
| 10 | เสียงย้อนยุค #2 | |
| 11 | เสียงผู้บรรยาย | |
| 101 | ชายสเปน | |
| 102 | หญิงสเปน | |
| 201 | ชายเยอรมัน | |
| 202 | หญิงเยอรมัน | |
| 301 | ชายอิตาลี | |
| 302 | หญิงอิตาลี | |
| 401 | ชายฝรั่งเศส | |
| 402 | หญิงฝรั่งเศส |
ในการสร้างเสียง TTS 3D พื้นฐานในไฟล์ตัวอย่าง Gingerbread House - Text-to-Speech:
- เปิดใช้งานตัวฟังเริ่มต้นที่เชื่อมต่อกับตัวละครของผู้เล่น
- ในหน้าต่าง Explorer ให้เลือก SoundService
- ในหน้าต่าง Properties ให้ตั้งค่า DefaultListenerLocation เป็น Character เมื่อคุณรันเกม เอนจินจะสร้าง:
- AudioListener ภายใต้ Humanoid.RootPart ของแต่ละตัวละครผู้เล่น เพื่อให้คุณได้ยินเสียงที่เปลี่ยนแปลงในลำโพงจริงของคุณตามตำแหน่งและขนาดของแหล่งเสียงภายในเกม
- AudioDeviceOutput ภายใต้ SoundService
- ในหน้าต่าง Explorer ให้ไปที่ Workspace ⟩ DialogueVolume จากนั้น:
- แทรกวัตถุ AudioTextToSpeech เพื่อสร้างเครื่องกำเนิดเสียงพูดสำหรับปริมาณรอบ ๆ ตุ๊กตาหิมะ
- แทรกวัตถุ AudioEmitter เพื่อปล่อยเสียงที่มีตำแหน่งจาก DialogueVolume
- แทรกวัตถุ Wire เพื่อส่งเสียงจากเครื่องกำเนิดเสียงพูดไปยังเครื่องปล่อยเสียง
- เลือกวัตถุ AudioTextToSpeech จากนั้นในหน้าต่าง Properties:
- ตั้งค่า Text เป็น "เก็บกัมดรอปทุกชิ้นเพื่อเปิดบ้านของฉัน!"
- ตั้งค่า VoiceId เป็น 2 เพื่อกำหนดเสียงเทียมให้เลียนแบบหญิงอังกฤษ
- ตั้งค่า Volume เป็น 3 เพื่อเล่นเสียงที่ระดับเสียงสูงเพื่อให้คุณได้ยินเสียง TTS เหนือแหล่งเสียงอื่น ๆ ภายในเกม
- เลือก Wire จากนั้นในหน้าต่าง Properties:
- ตั้งค่า SourceInstance เป็น AudioTextToSpeech ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงจากเครื่องกำเนิดเสียงพูดเฉพาะนี้
- ตั้งค่า TargetInstance เป็น AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเครื่องปล่อยเสียงเฉพาะนี้ภายในปริมาณ
- กลับไปที่หน้าต่าง Explorer ให้ไปที่ StarterPlayer ⟩ StarterCharacterScripts จากนั้นแทรก LocalScript เปลี่ยนชื่อเป็น PlayBasicTTSAudioWhenInVolume และวางโค้ดต่อไปนี้ลงในสคริปต์ท้องถิ่น:
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)สคริปต์นี้เริ่มต้นด้วยการดึงบริการ Workspace และ Players เพื่อให้สามารถอ้างอิงถึงลูกและฟังก์ชันของพวกเขา สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่เกม สคริปต์จะรอ:
- วัตถุปริมาณในพื้นที่ทำงานที่ชื่อว่า DialogueVolume
เมื่อมีการชนกับปริมาณ ฟังก์ชันจัดการเหตุการณ์ Touched จะดึงบรรพบุรุษแรกที่เป็น Model ซึ่งควรจะเป็นตัวละครหาก BasePart ที่ชนกับปริมาณเป็นลูกหลานของโมเดลตัวละคร หากเป็นเช่นนั้น ฟังก์ชันจะ:
- ตั้งค่า debounce เป็น true
- เล่นและรอให้เสียง TTS จบ
- ตั้งค่า debounce กลับเป็น false
การตั้งค่า debounce จาก false เป็น true แล้วกลับเป็น false อีกครั้งหลังจากเสียง TTS พื้นฐานเล่นจบ เป็นรูปแบบ debounce ที่ป้องกันไม่ให้เสียงถูกเรียกซ้ำอย่างต่อเนื่องเมื่อผู้เล่นชนกับปริมาณอย่างต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ debounce นี้ ดูที่ Debounce - ตรวจจับการชน.
ทดสอบการเล่นเกมเพื่อฟังบทสนทนาของตัวละครที่ให้คำแนะนำเมื่อผู้เล่นตัวละครของคุณสัมผัสกับปริมาณรอบ ๆ ตุ๊กตาหิมะ
คุณสามารถทดลองกับเสียงนี้เพิ่มเติมโดยการปรับเปลี่ยนคุณสมบัติ Text, VoiceID, Pitch, และ Speed เป็นค่าใหม่ เสียงที่สร้างขึ้นจะเปลี่ยนไปโดยไม่ต้องบันทึกและอัปโหลดไฟล์เสียงใหม่สำหรับแต่ละสถานการณ์
TTS ที่รับรู้บริบท
TTS ที่รับรู้บริบทเป็นรูปแบบที่ซับซ้อนมากขึ้นของข้อความเป็นเสียงพูด ซึ่งเสียงเทียมจะอ่านข้อความในความสัมพันธ์กับผู้เล่น สถานะของสิ่งแวดล้อม หรือสถานะการเล่นเกม นั่นหมายความว่าเมื่อใดก็ตามที่ผู้เล่นเรียกใช้เสียง TTS คำและวิธีที่เสียงเทียมอ่านคำจะปรับตัวตามนั้น
รูปแบบ TTS นี้มีประโยชน์สำหรับสถานการณ์การเล่นเกมที่เปลี่ยนแปลงอยู่เสมอ เช่น สัญญาณเสียงตามทิศทาง สถานะวัตถุประสงค์ หรือการโต้ตอบกับ NPC ที่ไม่ซ้ำกัน ดังนั้น เนื่องจาก TTS ที่รับรู้บริบทต้องเปลี่ยนแปลงเพื่อให้ถูกต้อง คุณต้องกำหนดค่าองค์ประกอบการเล่นเกมเพื่อให้คุณสามารถติดตามสถานะของพวกเขาเมื่อผู้เล่นนำทางผ่านสภาพแวดล้อมและทำวัตถุประสงค์การเล่นเกมให้สำเร็จ
ในขณะที่มีหลายวิธีในการทำงานนี้ ตัวอย่างนี้ใช้คุณสมบัติที่กำหนดเองเพื่อติดตาม สี และ ตำแหน่ง ของกัมดรอปแต่ละชิ้นที่ผู้เล่นต้องเก็บเพื่อเข้าสู่บ้านขนมปังขิง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติ ดูที่ Properties and attributes.



ในการสร้างเสียง TTS 3D ที่รับรู้บริบทในไฟล์ตัวอย่าง Gingerbread House - Text-to-Speech:
ในหน้าต่าง Explorer ให้ไปที่ Workspace ⟩ GumDrops
กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีเหลือง
- เลือกกัมดรอปสีเหลือง จากนั้นในหน้าต่าง Properties ให้ไปที่ส่วน Attributes แล้วคลิกที่ไอคอนบวก กล่องโต้ตอบจะปรากฏขึ้น
- ในฟิลด์ Name ให้ป้อน ColorDescription
- ในเมนูดรอปดาวน์ Type ให้เลือก string
- คลิกที่ปุ่ม Save
- ตั้งค่า ColorDescription ใหม่เป็น yellow
- ใช้กระบวนการนี้สร้างคุณสมบัติอีกสองรายการโดยใช้ค่าต่อไปนี้
ชื่อ ประเภท ค่า HintOrder number 0 LocationDescription string ข้างน้ำตก กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีเขียว
- ในหน้าต่าง Explorer ให้เลือกกัมดรอปสีเขียว
- ในหน้าต่าง Properties ให้สร้างคุณสมบัติสามรายการโดยใช้ค่าต่อไปนี้
ชื่อ ประเภท ค่า ColorDescription string green HintOrder number 1 LocationDescription string บนขอบ กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีแดง
- ในหน้าต่าง Explorer ให้เลือกกัมดรอปสีแดง
- ในหน้าต่าง Properties ให้สร้างคุณสมบัติสามรายการโดยใช้ค่าต่อไปนี้
ชื่อ ประเภท ค่า ColorDescription string red HintOrder number 2 LocationDescription string หลังรั้ว ในหน้าต่าง Explorer ให้ไปที่ Workspace ⟩ HintVolume จากนั้น:
- แทรกวัตถุ AudioTextToSpeech เพื่อสร้างเครื่องกำเนิดเสียงพูดสำหรับปริมาณรอบ ๆ กวางเรนเดียร์
- แทรกวัตถุ AudioEmitter เพื่อปล่อยเสียงที่มีตำแหน่งจาก HintVolume
- แทรกวัตถุ Wire เพื่อส่งเสียงจากเครื่องกำเนิดเสียงพูดไปยังเครื่องปล่อยเสียง
เลือก Wire จากนั้นในหน้าต่าง Properties:
- ตั้งค่า SourceInstance เป็น AudioTextToSpeech ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงจากเครื่องกำเนิดเสียงพูดเฉพาะนี้
- ตั้งค่า TargetInstance เป็น AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเครื่องปล่อยเสียงเฉพาะนี้ภายในปริมาณ
กลับไปที่หน้าต่าง Explorer ให้ไปที่ StarterPlayer ⟩ StarterCharacterScripts จากนั้นแทรก LocalScript เปลี่ยนชื่อเป็น PlayContextTTSAudioWhenInVolume และวางโค้ดต่อไปนี้ลงในสคริปต์ท้องถิ่น:
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 "ไม่มีการกัมดรอปเหลืออยู่ ตรวจสอบภายในบ้าน."
end
local nextGumdrop = remainingGumdrops[1]
local colorDescription = nextGumdrop:GetAttribute("ColorDescription")
local locationDescription = nextGumdrop:GetAttribute("LocationDescription")
local message = #remainingGumdrops > 1
and "ยังมีการกัมดรอป " .. #remainingGumdrops .. " ชิ้นเหลืออยู่ มองหากัมดรอปสี " .. colorDescription .. " ที่ " .. locationDescription .. "."
or "มีการกัมดรอปหนึ่งชิ้นเหลืออยู่ มันคือ " .. colorDescription .. " และมันอยู่ที่ " .. 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("ผู้เล่นสัมผัสปริมาณ.")
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)สคริปต์นี้เริ่มต้นด้วยการดึงบริการ Workspace และ Players เพื่อให้สามารถอ้างอิงถึงลูกและฟังก์ชันของพวกเขา สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่เกม สคริปต์จะรอ:
- วัตถุปริมาณในพื้นที่ทำงานที่ชื่อว่า HintVolume
ฟังก์ชัน getRemainingGumdrops() ของสคริปต์จะส่งคืนรายการของวัตถุ Part ของกัมดรอปภายในโฟลเดอร์ Gumdrops และกรองออกจากส่วนใด ๆ ที่ผู้เล่นได้เก็บไปแล้ว กัมดรอปที่เหลือจะถูกจัดเรียงตามลำดับเฉพาะตามคุณสมบัติ HintOrder ของแต่ละกัมดรอป
ฟังก์ชัน getReindeerHint(remainingGumdrops) ของสคริปต์จะรับรายการนั้นจาก getRemainingGumdrops() และส่งคืนข้อความสตริงที่อธิบายว่าผู้เล่นสามารถหากัมดรอปที่เหลืออยู่ได้ที่ไหน รวมถึงคำอธิบายสีและตำแหน่งของกัมดรอปถัดไปที่ผู้เล่นต้องเก็บ อย่างไรก็ตาม หากผู้เล่นได้เก็บกัมดรอปทั้งหมดในสภาพแวดล้อมแล้ว ข้อความสตริงจะอธิบายว่าต้องไปที่ไหนถัดไปหลังจากที่พวกเขาเก็บกัมดรอปทั้งหมดในสภาพแวดล้อม
เมื่อมีการชนกับปริมาณ ฟังก์ชันจัดการเหตุการณ์ Touched จะดึงบรรพบุรุษแรกที่เป็น Model ซึ่งควรจะเป็นตัวละครหาก BasePart ที่ชนกับปริมาณเป็นลูกหลานของโมเดลตัวละคร หากเป็นเช่นนั้น ฟังก์ชันจะ:
- ตั้งค่า debounce เป็น true
- ดึงรายการของกัมดรอปที่เหลืออยู่และข้อความสตริงที่อธิบายกัมดรอปถัดไปที่ผู้เล่นต้องหามา
- แปลงข้อความสตริงเป็นเสียงโดยใช้วัตถุ AudioTextToSpeech เล่นเสียงและรอให้เสียงจบ
- ตั้งค่า debounce กลับเป็น false
การตั้งค่า debounce จาก false เป็น true แล้วกลับเป็น false อีกครั้งหลังจากเสียง TTS ที่รับรู้บริบทเล่นจบ เป็นรูปแบบ debounce ที่ป้องกันไม่ให้เสียงถูกเรียกซ้ำอย่างต่อเนื่องเมื่อผู้เล่นชนกับปริมาณอย่างต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ debounce นี้ ดูที่ Debounce - ตรวจจับการชน.
ทดสอบการเล่นเกมเพื่อฟังคำแนะนำตามบริบทเมื่อผู้เล่นตัวละครของคุณสัมผัสกับปริมาณรอบ ๆ กวางเรนเดียร์ เสียง TTS จะเปลี่ยนแปลงตามจำนวนและสีของกัมดรอปที่ผู้เล่นตัวละครได้พบในสภาพแวดล้อมแล้ว