คู่มือการใช้งานระดับกลาง

เพิ่มข้อความเป็นเสียงพูด

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ข้อความเป็นเสียงพูด เป็นรูปแบบของเทคโนโลยีช่วยเหลือที่แปลงข้อความเป็นเสียงพูดโดยใช้เสียงเทียม นอกจากจะช่วยปรับปรุงการเข้าถึงเกมของคุณสำหรับผู้เล่นที่มีปัญหาทางสายตา การเคลื่อนไหว หรือความคิดแล้ว 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
  • วัตถุ Wire จะส่งเสียงจาก AudioTextToSpeech ไปยัง AudioEmitter เพื่อให้เสียงออกมาจาก NPC
  • วัตถุ 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:

  1. เปิดใช้งานตัวฟังเริ่มต้นที่เชื่อมต่อกับตัวละครของผู้เล่น
    1. ในหน้าต่าง Explorer ให้เลือก SoundService
    2. ในหน้าต่าง Properties ให้ตั้งค่า DefaultListenerLocation เป็น Character เมื่อคุณรันเกม เอนจินจะสร้าง:
      • AudioListener ภายใต้ Humanoid.RootPart ของแต่ละตัวละครผู้เล่น เพื่อให้คุณได้ยินเสียงที่เปลี่ยนแปลงในลำโพงจริงของคุณตามตำแหน่งและขนาดของแหล่งเสียงภายในเกม
      • AudioDeviceOutput ภายใต้ SoundService
  2. ในหน้าต่าง Explorer ให้ไปที่ WorkspaceDialogueVolume จากนั้น:
    1. แทรกวัตถุ AudioTextToSpeech เพื่อสร้างเครื่องกำเนิดเสียงพูดสำหรับปริมาณรอบ ๆ ตุ๊กตาหิมะ
    2. แทรกวัตถุ AudioEmitter เพื่อปล่อยเสียงที่มีตำแหน่งจาก DialogueVolume
    3. แทรกวัตถุ Wire เพื่อส่งเสียงจากเครื่องกำเนิดเสียงพูดไปยังเครื่องปล่อยเสียง
  3. เลือกวัตถุ AudioTextToSpeech จากนั้นในหน้าต่าง Properties:
    1. ตั้งค่า Text เป็น "เก็บกัมดรอปทุกชิ้นเพื่อเปิดบ้านของฉัน!"
    2. ตั้งค่า VoiceId เป็น 2 เพื่อกำหนดเสียงเทียมให้เลียนแบบหญิงอังกฤษ
    3. ตั้งค่า Volume เป็น 3 เพื่อเล่นเสียงที่ระดับเสียงสูงเพื่อให้คุณได้ยินเสียง TTS เหนือแหล่งเสียงอื่น ๆ ภายในเกม
  4. เลือก Wire จากนั้นในหน้าต่าง Properties:
    1. ตั้งค่า SourceInstance เป็น AudioTextToSpeech ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงจากเครื่องกำเนิดเสียงพูดเฉพาะนี้
    2. ตั้งค่า TargetInstance เป็น AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเครื่องปล่อยเสียงเฉพาะนี้ภายในปริมาณ
  5. กลับไปที่หน้าต่าง Explorer ให้ไปที่ StarterPlayerStarterCharacterScripts จากนั้นแทรก 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 เพื่อให้สามารถอ้างอิงถึงลูกและฟังก์ชันของพวกเขา สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่เกม สคริปต์จะรอ:

  • วัตถุ Humanoid และ Animator ของตัวละคร
  • วัตถุปริมาณในพื้นที่ทำงานที่ชื่อว่า DialogueVolume

เมื่อมีการชนกับปริมาณ ฟังก์ชันจัดการเหตุการณ์ Touched จะดึงบรรพบุรุษแรกที่เป็น Model ซึ่งควรจะเป็นตัวละครหาก BasePart ที่ชนกับปริมาณเป็นลูกหลานของโมเดลตัวละคร หากเป็นเช่นนั้น ฟังก์ชันจะ:

  • ตั้งค่า debounce เป็น true
  • เล่นและรอให้เสียง TTS จบ
  • ตั้งค่า debounce กลับเป็น false

การตั้งค่า debounce จาก false เป็น true แล้วกลับเป็น false อีกครั้งหลังจากเสียง TTS พื้นฐานเล่นจบ เป็นรูปแบบ debounce ที่ป้องกันไม่ให้เสียงถูกเรียกซ้ำอย่างต่อเนื่องเมื่อผู้เล่นชนกับปริมาณอย่างต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ debounce นี้ ดูที่ Debounce - ตรวจจับการชน.

  1. ทดสอบการเล่นเกมเพื่อฟังบทสนทนาของตัวละครที่ให้คำแนะนำเมื่อผู้เล่นตัวละครของคุณสัมผัสกับปริมาณรอบ ๆ ตุ๊กตาหิมะ

คุณสามารถทดลองกับเสียงนี้เพิ่มเติมโดยการปรับเปลี่ยนคุณสมบัติ Text, VoiceID, Pitch, และ Speed เป็นค่าใหม่ เสียงที่สร้างขึ้นจะเปลี่ยนไปโดยไม่ต้องบันทึกและอัปโหลดไฟล์เสียงใหม่สำหรับแต่ละสถานการณ์

TTS ที่รับรู้บริบท

TTS ที่รับรู้บริบทเป็นรูปแบบที่ซับซ้อนมากขึ้นของข้อความเป็นเสียงพูด ซึ่งเสียงเทียมจะอ่านข้อความในความสัมพันธ์กับผู้เล่น สถานะของสิ่งแวดล้อม หรือสถานะการเล่นเกม นั่นหมายความว่าเมื่อใดก็ตามที่ผู้เล่นเรียกใช้เสียง TTS คำและวิธีที่เสียงเทียมอ่านคำจะปรับตัวตามนั้น

รูปแบบ TTS นี้มีประโยชน์สำหรับสถานการณ์การเล่นเกมที่เปลี่ยนแปลงอยู่เสมอ เช่น สัญญาณเสียงตามทิศทาง สถานะวัตถุประสงค์ หรือการโต้ตอบกับ NPC ที่ไม่ซ้ำกัน ดังนั้น เนื่องจาก TTS ที่รับรู้บริบทต้องเปลี่ยนแปลงเพื่อให้ถูกต้อง คุณต้องกำหนดค่าองค์ประกอบการเล่นเกมเพื่อให้คุณสามารถติดตามสถานะของพวกเขาเมื่อผู้เล่นนำทางผ่านสภาพแวดล้อมและทำวัตถุประสงค์การเล่นเกมให้สำเร็จ

ในขณะที่มีหลายวิธีในการทำงานนี้ ตัวอย่างนี้ใช้คุณสมบัติที่กำหนดเองเพื่อติดตาม สี และ ตำแหน่ง ของกัมดรอปแต่ละชิ้นที่ผู้เล่นต้องเก็บเพื่อเข้าสู่บ้านขนมปังขิง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคุณสมบัติ ดูที่ Properties and attributes.


แต่ละวัตถุกัมดรอปมีคุณสมบัติที่อธิบายสีและตำแหน่งในสภาพแวดล้อม
มุมมองใกล้ของกัมดรอปสีเหลือง
มุมมองใกล้ของกัมดรอปสีเขียว
มุมมองใกล้ของกัมดรอปสีแดง

ในการสร้างเสียง TTS 3D ที่รับรู้บริบทในไฟล์ตัวอย่าง Gingerbread House - Text-to-Speech:

  1. ในหน้าต่าง Explorer ให้ไปที่ WorkspaceGumDrops

  2. กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีเหลือง

    1. เลือกกัมดรอปสีเหลือง จากนั้นในหน้าต่าง Properties ให้ไปที่ส่วน Attributes แล้วคลิกที่ไอคอนบวก กล่องโต้ตอบจะปรากฏขึ้น
    2. ในฟิลด์ Name ให้ป้อน ColorDescription
    3. ในเมนูดรอปดาวน์ Type ให้เลือก string
    4. คลิกที่ปุ่ม Save
    5. ตั้งค่า ColorDescription ใหม่เป็น yellow
    6. ใช้กระบวนการนี้สร้างคุณสมบัติอีกสองรายการโดยใช้ค่าต่อไปนี้
    ชื่อประเภทค่า
    HintOrdernumber0
    LocationDescriptionstringข้างน้ำตก
  3. กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีเขียว

    1. ในหน้าต่าง Explorer ให้เลือกกัมดรอปสีเขียว
    2. ในหน้าต่าง Properties ให้สร้างคุณสมบัติสามรายการโดยใช้ค่าต่อไปนี้
    ชื่อประเภทค่า
    ColorDescriptionstringgreen
    HintOrdernumber1
    LocationDescriptionstringบนขอบ
  4. กำหนดคุณสมบัติที่กำหนดเองสามรายการเพื่อติดตามกัมดรอปสีแดง

    1. ในหน้าต่าง Explorer ให้เลือกกัมดรอปสีแดง
    2. ในหน้าต่าง Properties ให้สร้างคุณสมบัติสามรายการโดยใช้ค่าต่อไปนี้
    ชื่อประเภทค่า
    ColorDescriptionstringred
    HintOrdernumber2
    LocationDescriptionstringหลังรั้ว
  5. ในหน้าต่าง Explorer ให้ไปที่ WorkspaceHintVolume จากนั้น:

    1. แทรกวัตถุ AudioTextToSpeech เพื่อสร้างเครื่องกำเนิดเสียงพูดสำหรับปริมาณรอบ ๆ กวางเรนเดียร์
    2. แทรกวัตถุ AudioEmitter เพื่อปล่อยเสียงที่มีตำแหน่งจาก HintVolume
    3. แทรกวัตถุ Wire เพื่อส่งเสียงจากเครื่องกำเนิดเสียงพูดไปยังเครื่องปล่อยเสียง
  6. เลือก Wire จากนั้นในหน้าต่าง Properties:

    1. ตั้งค่า SourceInstance เป็น AudioTextToSpeech ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงจากเครื่องกำเนิดเสียงพูดเฉพาะนี้
    2. ตั้งค่า TargetInstance เป็น AudioEmitter ใหม่ของคุณเพื่อระบุว่าคุณต้องการให้สายส่งเสียงไปยังเครื่องปล่อยเสียงเฉพาะนี้ภายในปริมาณ
  7. กลับไปที่หน้าต่าง Explorer ให้ไปที่ StarterPlayerStarterCharacterScripts จากนั้นแทรก 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 เพื่อให้สามารถอ้างอิงถึงลูกและฟังก์ชันของพวกเขา สำหรับแต่ละตัวละครผู้เล่นที่โหลดหรือเกิดใหม่กลับเข้าสู่เกม สคริปต์จะรอ:

  • วัตถุ Humanoid และ Animator ของตัวละคร
  • วัตถุปริมาณในพื้นที่ทำงานที่ชื่อว่า HintVolume

ฟังก์ชัน getRemainingGumdrops() ของสคริปต์จะส่งคืนรายการของวัตถุ Part ของกัมดรอปภายในโฟลเดอร์ Gumdrops และกรองออกจากส่วนใด ๆ ที่ผู้เล่นได้เก็บไปแล้ว กัมดรอปที่เหลือจะถูกจัดเรียงตามลำดับเฉพาะตามคุณสมบัติ HintOrder ของแต่ละกัมดรอป

ฟังก์ชัน getReindeerHint(remainingGumdrops) ของสคริปต์จะรับรายการนั้นจาก getRemainingGumdrops() และส่งคืนข้อความสตริงที่อธิบายว่าผู้เล่นสามารถหากัมดรอปที่เหลืออยู่ได้ที่ไหน รวมถึงคำอธิบายสีและตำแหน่งของกัมดรอปถัดไปที่ผู้เล่นต้องเก็บ อย่างไรก็ตาม หากผู้เล่นได้เก็บกัมดรอปทั้งหมดในสภาพแวดล้อมแล้ว ข้อความสตริงจะอธิบายว่าต้องไปที่ไหนถัดไปหลังจากที่พวกเขาเก็บกัมดรอปทั้งหมดในสภาพแวดล้อม

เมื่อมีการชนกับปริมาณ ฟังก์ชันจัดการเหตุการณ์ Touched จะดึงบรรพบุรุษแรกที่เป็น Model ซึ่งควรจะเป็นตัวละครหาก BasePart ที่ชนกับปริมาณเป็นลูกหลานของโมเดลตัวละคร หากเป็นเช่นนั้น ฟังก์ชันจะ:

  • ตั้งค่า debounce เป็น true
  • ดึงรายการของกัมดรอปที่เหลืออยู่และข้อความสตริงที่อธิบายกัมดรอปถัดไปที่ผู้เล่นต้องหามา
  • แปลงข้อความสตริงเป็นเสียงโดยใช้วัตถุ AudioTextToSpeech เล่นเสียงและรอให้เสียงจบ
  • ตั้งค่า debounce กลับเป็น false

การตั้งค่า debounce จาก false เป็น true แล้วกลับเป็น false อีกครั้งหลังจากเสียง TTS ที่รับรู้บริบทเล่นจบ เป็นรูปแบบ debounce ที่ป้องกันไม่ให้เสียงถูกเรียกซ้ำอย่างต่อเนื่องเมื่อผู้เล่นชนกับปริมาณอย่างต่อเนื่อง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบ debounce นี้ ดูที่ Debounce - ตรวจจับการชน.

  1. ทดสอบการเล่นเกมเพื่อฟังคำแนะนำตามบริบทเมื่อผู้เล่นตัวละครของคุณสัมผัสกับปริมาณรอบ ๆ กวางเรนเดียร์ เสียง TTS จะเปลี่ยนแปลงตามจำนวนและสีของกัมดรอปที่ผู้เล่นตัวละครได้พบในสภาพแวดล้อมแล้ว

©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ