دروس تعليمية متوسطة

إضافة النص إلى الكلام

*This content is translated using AI (Beta) and may contain errors. To view this page in English, click here.

النص إلى الكلام هو شكل من أشكال التكنولوجيا المساعدة التي تحول سلاسل النص إلى أصوات كلام باستخدام صوت اصطناعي. بالإضافة إلى تحسين إمكانية الوصول لتجاربك للاعبين ذوي الإعاقات البصرية أو الحركية أو الإدراكية، يسمح لك TTS بتوليد الكلام بشكل ديناميكي حتى لا تضطر إلى تسجيل الصوت مسبقًا لكل السيناريوهات السردية الممكنة.

باستخدام ملف Gingerbread House - Start .rbxl كنقطة انطلاق وملف Gingerbread House - Text-to-Speech كمرجع، توضح لك هذه الدروس كيفية إضافة كل من صوت TTS الأساسي والواع من السياق إلى تجاربك، بما في ذلك الإرشادات حول:

  • تفعيل TTS لسيناريوهات اللعب الشائعة التي لن تتغير أبدًا، مثل تفاعلات واجهة المستخدم والدروس التعليمية.
  • تكوين TTS بحيث يتكيف مع إجراءات اللاعب، وحالة البيئة، أو الأهداف المرنة.

إذا واجهتك أي مشكلة خلال العملية، يمكنك استخدام Gingerbread House - Text-to-Speech كمرجع لمقارنة تقدمك.

كائنات الصوت

لإنشاء صوت TTS، من المهم فهم كائنات الصوت التي ستعمل معها طوال هذه الدورة. هناك خمسة أنواع رئيسية من كائنات الصوت لـ TTS:

  • كائن AudioTextToSpeech يقوم بتحويل سلاسل النص إلى أصوات كلام.
  • كائن AudioEmitter هو مكبر صوت افتراضي يطلق الصوت في البيئة ثلاثية الأبعاد.
  • كائن AudioListener هو ميكروفون افتراضي يلتقط الصوت من البيئة ثلاثية الأبعاد.
  • كائن AudioDeviceOutput هو جهاز مادي في العالم الحقيقي، مثل مكبر الصوت أو سماعات الرأس.
  • Wires تحمل تدفقات الصوت من كائن إلى آخر.

تعمل جميع هذه الكائنات الصوتية معًا لإصدار صوت TTS استجابةً لإجراءات اللاعب. لنلقي نظرة على كيفية عمل ذلك في الممارسة العملية لصوت 3D باستخدام مثال للاعب يرتدي سماعة رأس أثناء لعب تجربة باستخدام اللابتوب الخاص به:

  • يقوم كائن AudioTextToSpeech بتحميل وتحويل النص إلى صوت كلما لمس اللاعب جزءًا قريبًا من شخصية غير قابلة للعب (NPC).
  • يقوم كائن AudioEmitter بإصدار تدفق من صوت TTS من NPC إلى البيئة ثلاثية الأبعاد.
  • تحمل Wire هذا التدفق من AudioTextToSpeech إلى AudioEmitter بحيث يخرج التدفق من NPC.
  • يستمع كائن AudioListener الخاص بالشخصية إلى ذلك الصوت داخل البيئة ثلاثية الأبعاد ويعيده إلى سماعتهم.
  • يحمل كائن AudioDeviceOutput الصوت من AudioListener إلى مكبر الصوت الفعلي للاعب، أو في هذه الحالة، سماعات الرأس الخاصة بهم.

تتعمق الأقسام التالية وتشير إلى هذه الكائنات بينما تتعلم كيفية تشغيل الصوت الأساسي والواع من السياق. عندما تستعرض هذه الكائنات مع التقنيات القادمة، يمكنك التنبؤ بدقة بكيفية التقاط وإعادة الصوت من التجربة إلى اللاعب.

TTS الأساسي

TTS الأساسي هو الشكل الأكثر شيوعًا للنص إلى الكلام حيث يقرأ الصوت الاصطناعي سلسلة نصية بغض النظر عن سياق اللاعب أو البيئة. وهذا يعني أنه كلما أطلق اللاعب صوت TTS، تظل الكلمات والطريقة التي يقرأ بها الصوت الاصطناعي الكلمات متسقة بغض النظر عن حالة اللاعب، أو أفعالهم، أو حالة البيئة.

تكون هذه الصيغة من TTS مفيدة في معظم سيناريوهات اللعب، مثل تفاعل اللاعبين مع قوائم واجهة المستخدم، والدروس التعليمية، أو تفاعلات NPC الروتينية مثل عرض البائعين أو نباح الأعداء. يوفر Roblox الأنواع التالية من الأصوات التي يمكنك تجربتها لأي من هذه التفاعلات:

VoiceIDVoice Descriptionمثال صوتي
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 ثلاثي الأبعاد الأساسي في ملف 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 - Detect collisions.

  1. اختبار التجربة للاستماع إلى حوار الشخصية التوجيهية عند لمس شخصية اللاعب للمساحة المحيطة بالرجل الثلجي.

يمكنك أيضًا تجربة المزيد مع هذا الصوت عن طريق تعديل خصائص Text، VoiceID، Pitch، وSpeed إلى قيم جديدة. تبدو الكلمات المنطوقة مختلفة تمامًا دون الحاجة إلى تسجيل ورفع ملف صوتي جديد لكل سيناريو.

TTS الواعي من السياق

TTS الواعي من السياق هو شكل أكثر تقدمًا من النص إلى الكلام حيث يقرأ الصوت الاصطناعي سلسلة نصية تتعلق باللاعب، وحالة بيئته، أو حالة اللعب. وهذا يعني أنه كلما أطلق اللاعب صوت TTS، فإن الكلمات والطريقة التي يقرأ بها الصوت الاصطناعي الكلمات تتكيف وفقًا لذلك.

تكون هذه الصيغة من TTS مفيدة لسيناريوهات اللعب المتغيرة باستمرار، مثل إشارات الصوت الاتجاهية، وحالة الأهداف، أو تفاعلات NPC الفريدة. وبناءً على ذلك، لأن TTS الواعي من السياق يحتاج إلى التحول ليكون دقيقًا، يجب عليك تكوين عناصر اللعب حتى تتمكن من تتبع حالتها بينما ينتقل اللاعبون عبر البيئة ويكملون الأهداف القابلة للعب.

بينما هناك العديد من الطرق لتحقيق هذه المهمة، يستخدم المثل الخصائص المخصصة لتتبع اللون والموقع لكل حبة جومب داب يجب على اللاعب جمعها للدخول إلى منزل الجبن. لمزيد من المعلومات حول الخصائص، انظر الخصائص والسمات.


كل كائن حبة جومب داب له سمات تصف لونه وموقعه في البيئة.
عرض قريب من حبة الجومب داب الصفراء
عرض قريب من حبة الجومب داب الخضراء
عرض قريب من حبة الجومب داب الحمراء

لإعادة إنشاء صوت TTS ثلاثي الأبعاد الواعي من السياق في ملف 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
LocationDescriptionstringby the waterfall
  1. تكوين ثلاث سمات مخصصة لتتبع حبة الجومب داب الخضراء.
    1. في نافذة Explorer، حدد حبة الجومب داب الخضراء.
    2. في نافذة Properties، أنشئ ثلاث سمات باستخدام القيم التالية.
الاسمالنوعالقيمة
ColorDescriptionstringgreen
HintOrdernumber1
LocationDescriptionstringon the ledge
  1. تكوين ثلاث سمات مخصصة لتتبع حبة الجومب داب الحمراء.
    1. في نافذة Explorer، حدد حبة الجومب داب الحمراء.
    2. في نافذة Properties، أنشئ ثلاث سمات باستخدام القيم التالية.
الاسمالنوعالقيمة
ColorDescriptionstringred
HintOrdernumber2
LocationDescriptionstringbehind the fence
  1. في نافذة Explorer، انتقل إلى WorkspaceHintVolume، ثم:
    1. أدخل كائن AudioTextToSpeech لإنشاء مولد الصوت للكلام للمنطقة المحيطة بالرنة.
    2. أدخل كائن AudioEmitter لإصدار تدفق مكاني من HintVolume.
    3. أدخل كائن Wire لنقل التدفق من مولد الصوت إلى مكبر الصوت.
  2. حدد Wire، ثم في نافذة Properties:
    1. اضبط SourceInstance على AudioTextToSpeech الجديدة لتحديد أنك تريد أن يحمل السلك الصوت من مولد الصوت المحدد هذا.
    2. اضبط TargetInstance على AudioEmitter الجديدة لتحديد أنك تريد أن يحمل السلك الصوت إلى مكبر الصوت المحدد هذا داخل المنطقة.
  3. عد إلى نافذة 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("Player touched 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)

يبدأ هذا السكربت من خلال الحصول على خدمات 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 - Detect collisions.

  1. اختبار التجارب للاستماع إلى الإرشادات السياقية عندما تلمس شخصية اللاعب حجم المساحة حول الرنة. يتغير صوت TTS وفقًا لعدد وألوان حبات الجومب داب التي وجدها اللاعب في البيئة.
©2026 شركة Roblox Corporation. تُعد منصّة Roblox، وشعار Roblox وشعار "توسيع حدود المخيلة"، من ضمن علاماتنا التجارية المسجّلة وغير المسجّلة في الولايات المتحدة وبلدان أخرى.