
شنو المشكل اللي كيحلّو المشروع
هاد المشروع ماشي حزمة برامج واجدة للاستعمال، ولكن طريقة فصناعة الصوت بالذكاء الاصطناعي تجرّبات وتطوّرات من بعد الاستماع الحقيقي. كيتعامل مع بزاف ديال المشاكل المعروفة: صوت النفس كيبقى بوحدو فالسكوت، كاين وقت طويل بين النفس والكلام، الصوت من بعد الوقفة كيولي رسمي فجأة، الموديل كيعيد الجمل ولا كينسى يقراها، وزيد عليها أن منين كيتحيد الكلام كيولي صعيب يتركّب صوت الجو بشكل طبيعي.
المسار كامل كيدور على ربعة ديال الحوايج: تركيب الصوت باستعمال ElevenLabs v4، معالجة الصوت بــ ffmpeg، تحويلو لنص بــ Whisper باش نراجعو المحتوى، ومن بعد استعمال NumPy لتحليل العلو، النبرة، ومواقع العينات.
الخلاصة الأساسية ماشي “زيد النفس”، ولكن “حطّ النفس فالمكان الصحيح”: النفس القصير قبل ما يفتح الفم خاصو يلصق فأول كلمة، نفس آخر الجملة يخرج بشكل طبيعي، والنفس وسط الجملة يبقى بين نصّين ديالها.
القدرات والطرق الرئيسية
- تقريب النفس من الكلام: التعرّف على النفس الخفيف والقصير اللي كيجي قبل بداية الكلام، وتحريك غير السكوت باش يتقرّب النفس من الكلام بحوالي 0.08 ثانية.
- تصحيح العلو المفاجئ: قياس العلو ديال كل مقطع فيه صوت، وإنزال المقاطع اللي كيتجاوز علوها الوسيط بأكثر من 4 dB بشكل معتدل.
- تقطيع الجمل بلا خسارة: التقطيع من مناطق السكوت فالصوت الجاف، ومن بعد إعادة تركيب صوت الجو بشكل متكرر، مع الحفاظ قدر الإمكان على الأداء الأصلي اللي تقبل.
- كشف التكرار والنقص فالقراية: تحويل الصوت المركب لنص باستعمال Whisper، ومقارنة “شنو تسمع” مع “شنو خاصو يتقرا”، وإعادة التوليد إلا بان شي خلل.
- مزامنة أصوات الحركة: كتابة علامة الصوت فالجملة اللي كتبدأ فيها الحركة فعلاً، ماشي وضعها دائماً فبداية دورة كاملة ديال الكلام.
- بناء نبرة الكلام اليومي: ماشي غير ترقيق الصوت، ولكن تحديد السرعة، العلو، درجة الثقة، وعادات الكلام ديال الشخصية.
تحضير البيئة
الأدوات المطلوبة
- ElevenLabs v4: مسؤول على تحويل النص لصوت. الاختبار الفعلي ديال المشروع تدار بــ v4.
- ffmpeg: لفك الترميز، التقطيع، التركيب، إعادة أخذ العينات، وتصدير الصوت.
- Whisper: لتحويل النتيجة المولّدة للنص، وكشف التكرار، سقوط الجمل، والانحراف فالمحتوى.
- NumPy: لمعالجة مصفوفات الصوت، والارتباط المتبادل، وحساب العلو، وتحريك المقاطع.
البيئة اللي تجرّبات فـ README هي macOS. ما كاينش سكريبت تثبيت ثابت، وخص تثبّت كل أداة حسب التوثيق الرسمي ديالها، وتتأكد بلي ffmpeg وWhisper وبيئة Python خدامين مزيان.
قبل ما تبدا مرحلة التحليل، خاصك تفك ترميز الصوت لموجة أحادية بقيمة أخذ عينات موحّدة، وتوجد جوج مجموعات ديال المعطيات محسوبة بخطوة ثابتة: علو الصوت فكل إطار f0 والعلو الجذري المتوسط فكل إطار rms. المسار الأصلي كيستعمل 10 ميلي ثانية كخطوة للإطار، ونافذة تحليل العلو كتخلي الحدود ضبابية بعشرات الميلي ثواني، لذلك خاص يبقى شوية ديال الهامش ملي كتحرك المقاطع.
حفظ جوج نسخ ديال الصوت ديماً
من بعد كل توليد، حفظ هاد النسخ:
- الصوت الجاف: صوت الإنسان بوحدو، بلا صوت الجو ولا أصوات الحركة.
- الصوت المبلل: النسخة النهائية اللي تفرش فيها صوت الجو تحت صوت الإنسان.
الصوت الجاف ما كيسهّلش غير قياس النفس، بل كيخليك من بعد تحيد جملة، تبدّل مقطع، ولا تعاود تفرش الخلفية مع الاحتفاظ بالأداء الأصلي. ما تحفظش غير الميكس النهائي.
الخطوة الأولى: كتابة تلميحات النفس بشكل صحيح
ما تحطش “همم” ولا “ها” ولا علامات النفس سطر بسطر بين فترات طويلة ديال السكوت. الصوت اللي كيتولّد بهاد الطريقة غالباً كيكون عندو علو واضح، والعلو ديالو قريب من الكلام العادي، وزيد كيبقى قبلو ومن بعدو سكوت ميت وطويل، وكيبان بحال مؤثر صوتي مستقل.
الأفضل تكتب النفس داخل السطر اللي فيه الكلام:
[low, breathy, wet]
[inhales] شوف ليا…… [exhales]
[long pause]
همم… ما تختبّاش…… همم… ها…- فبداية السطر استعمل غير علامات قصيرة ديال النفس، بحال
[inhales]و[exhales]ولا[sighs]. - ما تزيدش سلسلة ديال نقاط الحذف بين العلامة والكلام.
- فآخر الجملة يمكن يخرج النفس بشكل طبيعي، أو تستعمل جوج ولا ثلاثة ديال الأصوات الخفيفة المتتابعة.
- فالفراغ كتب غير سطر واحد فيه
[long pause]، وما ترتبش همهمات مستقلة داخل الفراغ. - يمكن حتى تحط الشهيق وسط الجملة؛ اختار غير موضع ولا جوج من البداية والوسط والنهاية.
كتابة جوج ديال [long pause] ورا بعضياتهم ما كتضمنش أن الوقفة غادي تطوال بوضوح. فالتجارب ديال المشروع، علامة وحدة كتنتج تقريباً 0.96 ثانية ديال السكوت، وجوج علامات متتاليات تقريباً 1.04 ثانية. لذلك ما تعوّلش على المعنى الحرفي للعلامة باش تتحكم فالمدة بدقة.
الخطوة الثانية: تقسيم الصوت إلى “مقاطع” قابلة للقياس
المقصود بــ “المقطع” هو جزء متواصل فيه الصوت. كل مقطع كيتقاسو فيه ثلاثة ديال المؤشرات: المدة، متوسط العلو، والنسبة ديال الإطارات اللي فيها نبرة موجودة. هاد المؤشرات كتعاون تفرّق بين الكلام العادي، النفس الحقيقي، والهمهمة المستقلة اللي فيها نبرة.
def is_breath(f0, rms, a, b):
dur = (b - a) * 0.01
voiced = (f0[a:b] > 0).mean()
db = 20 * np.log10(rms[a:b].mean() + 1e-9)
return 0.12 <= dur <= 0.9 and voiced < 0.15 and db < -29المجالات النموذجية فالمشروع الأصلي هي:
- كلام منخفض ومليان بالنَفَس: تقريباً من 0.5 حتى 2 ثانية، بعلو كيدور بين −22 و−27 dB، وإطارات فيها نبرة كتمثل تقريباً من الخُمس حتى الربعية.
- شهيق أو زفير أو صوت هسيس: تقريباً من 0.3 حتى 0.65 ثانية، بعلو كيدور بين −32 و−40 dB، وإطارات فيها نبرة كتمثل تقريباً عُشر الإطارات.
- همهمة مستقلة ومقطوعة: تقريباً من 0.4 حتى 0.5 ثانية، والعلو يقدر يوصل لــ −25 dB، وإطارات النبرة كتفوت 60%، وغالباً كاين قبلها ومن بعدها سكوت من 0.6 حتى 1 ثانية.
هاد العتبات جاية من نبرة وصوت وعينات محددة، وما خاصهاش تعتبر معياراً عاماً لجميع الأصوات. الطريقة الأكثر موثوقية هي تخلي المستمع يحدد المشكل أولاً، ومن بعد تبني المجال الخاص بهاد النبرة انطلاقاً من المقاطع العادية القريبة.
الخطوة الثالثة: تقريب النفس اللي قبل بداية الكلام
حتى إلا كانت التلميحات مكتوبة مزيان، الموديل يقدر يخلي بوحدو 0.3 ثانية ولا أكثر ديال السكوت بين النفس والكلام. التلميحات صعيب تتحكم فموضع كيحسب بعشرات الميلي ثواني، لذلك خاص تحرك المقاطع من بعد التوليد.
البنية قبل ومن بعد المعالجة تقدر تفهمها هكا:
قبل المعالجة: الجملة السابقة → سكوت A → النفس → سكوت B → الجملة التالية
من بعد المعالجة: الجملة السابقة → سكوت أطول → النفس → 0.08 ثانية → الجملة التاليةفالمعالجة، غير بدّل موضع النفس والسكوت، وما تبدلش النفس ولا الكلام نفسو، وما تبدلش المدة الإجمالية ديال المقطع. بهاد الطريقة ما غاديش يتخربق الخط الزمني، ولا فرش أصوات الجو، ولا إحصاء السرعة.
المقطع المرشح للتحريك خاصو يحقق هاد الشروط:
- يتصنّف كنفس خفيف، قصير، وما فيهش نبرة واضحة.
- يظهر من بعدو كلام خلال حوالي 0.14 حتى 1.5 ثانية.
- يكون قبلو على الأقل حوالي 0.3 ثانية ديال الفراغ.
- الشهيق اللي كيتبع مباشرة النصف الأول من الجملة ما يتحركش، باش ما يفسدش تبديل النفس الطبيعي وسط الجملة.
الهدف التجريبي فـ README هو فاصل حوالي 0.08 ثانية. ملي كتحرك، تقدر تزيد تقريباً 0.02 ثانية فبداية النفس و0.03 ثانية فالنهاية، وتدير تلاشي حوالي 4 ميلي ثواني فالبداية والنهاية فالموضع الجديد، باش ينقص الإحساس بالوصل.
الخطوة الرابعة: تصحيح “النبرة الرسمية” من بعد الوقفة
كاين أصوات من بعد الوقفة الطويلة كترجع لحالة كلام عادية أوضح، أعلى، وأقل فالنَفَس. فالحالة المدروسة، الجمل القصيرة غير العادية كانت أعلى بأكثر من 6 dB من المحتوى المحيط، ونسبة إطارات النبرة طلعات من حوالي الثلث حتى 60%.
بدا بالتلميحات باش تنقص احتمال وقوع المشكل
- من بعد الوقفة، لصّق نفساً صغيراً، أو دخل للكلام بهمهمة منخفضة.
- فآخر الجملة استعمل نهاية ممدودة، وما تساليش كل مرة بعلامة استفهام ولا نقطة حادة.
- الجمل القصيرة ديال جوج ولا ثلاثة كلمات يمكن تدمجها مع الجملة اللي حدّاها، باش ما يتقراوش بوحدهم بحال إعلان واضح.
- إلا بغيتي تعاود تأكد على النبرة، دخل العلامة فبداية الكلام، وما تخليهاش دائماً فسطـر بوحدها.
[long pause]
همم… [low, breathy] ما تختبّاش……إلا كان مقسّم المقاطع كينشئ مقطعاً جديداً فكل علامة نبرة فبداية السطر، فالكتابة داخل السطر تقدر حتى هي تنقص الوصلات والقفزات فالنبرة.
ومن بعد كبّح العلو الزائد بالبرنامج
حسب العلو ديال كل مقطع، واستعمل الوسيط ديال مقاطع الكلام فالفِقرة الحالية كمرجع. إلا كان شي مقطع أعلى بأكثر من 4 dB، هبطو باش يبقى أعلى غير بحوالي 2 dB، وبأقصى تخفيض 6 dB، مع استعمال غلاف تدريجي حوالي 25 ميلي ثانية فالبداية والنهاية.
خاص القياس يكون لكل مقطع، ماشي لكل جملة. إلا تدمج صوت قصير طالع لمدة نصف ثانية مع جملة طويلة من بعدو وتحسب المتوسط، ممكن الشذوذ ديال 6 dB يذوب حتى يهبط تحت العتبة. البرنامج يقدر يصلح العلو فقط، وما يقدرش يرجع اللون الصوتي اللي ناقصو النفس مباشرة، لذلك خاص التلميحات والمعالجة اللاحقة يخدمو بجوج.
الخطوة الخامسة: فحص النص مباشرة من بعد التوليد
الموديل مرات كيقرا الجملة جوج ولا ثلاثة ديال المرات، أو كيسقط الجملة الأخيرة كاملة. حتى إلا كان النص الأصلي صحيح مئة فالمئة، كل مقطع مركب خاصو يدوز من مراجعة بالنص مرة وحدة.
المشروع كيعتمد على جوج أنواع ديال الإشارات:
- من بعد حذف العلامات بين المعقوفين وبعض كلمات التعبير المعروفة، البحث على مقاطع فيها ستة حروف صينية على الأقل، كتعاود تظهر فالنص المحوّل، بينما النص الأصلي فيه غير مرة وحدة.
- مقارنة عدد الحروف فالنص المحوّل مع عددها فالنص الأصلي؛ إلا كان أقل من المتوقع بحوالي الخُمس، كيتعتبر احتمال سقوط جملة.
إلا تكشف المشكل، عاود التوليد مرة وحدة، ومن بعد قيّم النسختين وخلي النسخة اللي عندها النقطة الأقل. كلمات التعبير مرات ما كيتحوّلوش للنص بدقة، لذلك ما خاصش تعتمد أساساً على “همم، ها، آه، إه” فالمطابقة.
فالمكالمات المباشرة، تحويل صوت مدتو عشرين ولا ثلاثين ثانية للنص باستعمال Whisper يقدر يحتاج حوالي ثلاث ثواني. المقاطع اللاحقة تقدر تفحصها فالخلفية بينما المقطع الحالي كيتشغل؛ أما المقطع الأول فما عندوش وقت تشغيل سابق يخبي التأخير، وتقدر تبدا بفحص سريع باستعمال “المدة مقسومة على عدد الحروف الفعالة”. المجال العادي فالحالة المدروسة كان تقريباً من 0.41 حتى 0.62 ثانية لكل حرف، وإذا خرجات النتيجة على المجال عاد بدا التحويل الكامل للنص.
الخطوة السادسة: حذف جملة بلا إعادة التوليد
إلا كان المستمع عجباتو شي أداء محدد، ما تعاودش قراية المقطع كامل غير حيث خاصك تحيد جملة. كل توليد هو أداء جديد، والنفس والوقفات وتفاصيل آخر الجملة صعيب يتعاودو بدقة.
- تحديد السكوت: رسم العلو أولاً بوحدة حوالي 50 ميلي ثانية، ومن بعد تحويل المقاطع الصغيرة المرشحة للنص بشكل منفصل باش تتأكد واش هي كلام، نفس، ولا فراغ.
- التقطيع من الصوت الجاف: خلي الوصلة بين الجهتين توقع فأهدأ موضع، وخلي لكل مقطع تلاشي داخلاً وخارجاً ديال شي عشرات الميلي ثواني.
- إعادة فرش صوت الجو: ما تقطعش مباشرة فالنسخة النهائية اللي تفرش فيها الخلفية، حيث إيقاع الصوت المتكرر يقدر يقفز فموضع الوصلة.
- إعادة التحويل للنص: تأكد أن المنتج النهائي ما بقى فيه غير الجملة المطلوبة.
- المقارنة عينة بعينة: راقب أن المناطق اللي ما تبدلاتش باقية مطابقة للصوت الأصلي.
إلا ما عرفتيش شنو هو المقطع المتكرر المستعمل فالصوت المبلل، تقدر تستخرج موجة المنتج من فترة كيكون فيها صوت الإنسان ساكت تماماً، ومن بعد تعاود المقطع المرشح وتقارن الارتباط المتبادل. أعلى موضع للارتباط يقدر يعطي طور المقطع، والجداء النقطي يقدر يقدّر كسب الخلفية. فالحالة المدروسة، وصل الارتباط بين جوج مواد إلى 0.99، وكان الكسب المقدّر حوالي 0.200 و0.241 على التوالي.
المقارنة خاصها تكون دقيقة حتى مستوى العينة. انزياح ديال بضع عشرة عينات يقدر ينقص التشابه بوضوح ويعطي إنذاراً خاطئاً بأن “المادة مركبة فالمكان الغلط”. من بعد المحاذاة، وصل التشابه فالمقاطع غير المعدلة فالحالة المدروسة إلى 0.996 حتى 0.998.
الخطوة السابعة: خَلّي صوت الحركة يبدا فالوقت الصحيح
المشروع كيستعمل علامات مخصصة فالتلميحات باش يحدد نوع صوت الخلفية، ومن بعد كيحيد هاد العلامات قبل ما يرسل النص لــ ElevenLabs. القاعدة الأساسية هي: فين كيبدا الصوت، تماك خاص العلامة تكون مكتوبة.
licking: كيقابل صوتاً رطباً بطيئاً.fingering: كيقابل صوت حركة لزجاً نسبياً؛ فالحالة السريعة يمكن كتابةfast fingering.sucking: كيقابل صوتاً رطباً بطيئاً.thrust: كيتحط غير قبل الجملة اللي كتبدأ فيها الحركة فعلاً، وما خاصوش يتحط بكري فبداية الدورة كاملة.still: كيستعمل لوقف صوت الخلفية المتكرر الحالي.
إلا كانت العلامة كتطلق تقطيعاً جديداً، فالموضع اللي كتبدأ فيه الحركة فعلاً يستاهل تبقى فيه وصلة جديدة؛ أما العلامات الأخرى اللي غير كتعاود تأكد على النبرة، فالأفضل تتحط داخل بداية الكلام.
الخطوة الثامنة: تصميم نبرة الكلام العادي
“غير طبيعي” ما كيعنيش بالضرورة أن الصوت ماشي حنون كفاية. المشروع الأصلي بدا بترقية الموديل القديم لــ ElevenLabs v4، وجرّب تلميحات أكثر استرخاء وليونة، ولكن المستمع حسّ أن الشخصية ولات شخصاً آخر. الاتجاه اللي خدم فالنهاية هو تحديد طريقة الكلام الخاصة بالشخصية.
التلميح الأساسي اللي تختار هو:
[low, slow, confident, a little teasing]الإعدادات المقابلة هي v4، والثبات 0.35. فبداية الجملة يمكن تزيد بشكل عشوائي [exhales]، أو [chuckles softly]، أو “همم……” وحدة، أو ما تزيد والو. ما تضيفهاش كل مرة، وإلا غادي يتحول التنوع الطبيعي لعبارة لازمة ثابتة.
- بدّل غير النص اللي غادي للتركيب، وما تبدلش النص الأصلي فواجهة الدردشة ولا فالسجل.
- إلا كانت الجملة أصلاً كاتبدا بكلمة تعبير، ما تزيدش عليها مرة أخرى.
- الأسطر اللي فيها علامات نبرة من قبل، أو المحتوى الإنجليزي الخالص، يمكن تخطي تغليفه التلقائي مباشرة.
- الهاتف خاصو نظام تلميحات مستقل، وما خاصوش يستعمل عشوائية بداية الكلام اليومية.
تقنيات متقدمة ومطبات معروفة
قواعد التلميحات خاصها تكتب “شنو خاص يتدار”
جملة بحال “ما تكتبش هاد النوع ديال الصوت” تقدر تخلي مولّد النص يوقف استعمالو نهائياً. الطريقة الأكثر موثوقية هي توضّح النوع المطلوب، المكان ديالو، والحد الأدنى ديال التكرار، وتخلي الأصوات العالية العرضية ولا القراءات الغريبة للبرنامج باش يكشفها.
ما تعاودش تستعمل نفس النفس
ملي كتجيب مقطع أصلي عجبك لنسخة جديدة، تقدر تاخذ من نفس التوليد، ولكن ما تعاودش نفس النفس فموضعين. وإلا يمكن للمستمع يلاحظ أن نفس التفصيل بالضبط تنسخ.
بني صندوقاً منظماً وقابلاً للبحث للمواد
تسجّلو الشهيق، الهسهسة والتنفسات القصيرة اللي تمّ اعتمادها حسب الملف الأصلي، النطاق الزمني والبلاصة اللي تستعملات فيها. من بعد، إلا شي وسم ديال التنفس خرج غير بالسكات، تقدر تزيد نفس من علبة العينات. وREADME كيوضّح حتى هو بلي التعويض الآلي ديال النفس مازال كيحتاج واجهة فيها الطوابع الزمنية؛ غير حيث كاين سكات وسط الجملة ما كافيش باش تفرّق بين نفس ناقص وتوقّف عادي ديال الحذف.
المكالمات المباشرة خاصها تتعامل مع المقاطعة
إلا كان السيستيم مازال ما بداش يشغّل الجواب، والطرف الآخر بدا كيهضر، خاصك ترمي الجواب القديم اللي مازال ما تسمعش وتعالج المحتوى الجديد مباشرة. ما تخزّنش الهضرة الجديدة حتى يسالي تشغيل الجواب القديم، حيث نفس الجملة تقدر يتجاوب عليها جوج مرات. وبالنسبة للأصوات القصيرة اللي ما قدرش النظام يحوّلها لنص، العملية الأصلية مدّدات وقت الانتظار قبل الإدخال الآلي ديال أصوات التعبير من 2.5 ثانية لـ 4.5 ثانية، باش تنقص احتمالية أنه يتفعّل قبل الكلام الحقيقي.
سمع المشكل الأول، ومن بعد قرّر شنو تقيس
علوّ الصوت، النبرة، مدة السكات، نسبة عدد الكلمات والتطابق المتبادل كاملين غير كيتحققو من مشاكل سبق واكتاشفت. ما يقدروش بوحدهم يحددو واش «الإحساس» صحيح. أحسن طريقة مازالت هي أن المستمع يحدّد الأول البلاصة اللي باينة ماشي طبيعية، ومن بعد تبني المؤشر المناسب لها.
مسار العمل الكامل المقترح
- كتب نص فيه علامات ديال نبرة الصوت، التنفس، التوقّفات والأصوات.
- حيّد العلامات ديال الأصوات اللي غير مخصّصة للمعالجة من بعد، وصيفط النص اللي بقى لـ ElevenLabs v4.
- حفظ الصوت الجاف، واستعمل Whisper فالتفريغ باش تراقب التكرار، الجمل اللي طاحت والانحراف فالمحتوى.
- حسب
f0وrms، وقسّم الصوت لكتل ديال الكلام، كتل ديال التنفس وكتل صوتية أخرى. - حرّك التنفس اللي قبل بداية الكلام حتى يولي على بُعد حوالي 0.08 ثانية من الحوار، وخلي التنفس اللي وسط الجملة.
- كشّف علوّ الصوت المفاجئ فكل كتلة، وطبّق تلاشي سلس على الكتل غير العادية.
- ركّب الأصوات المتكررة حسب علامات الحركة، وصدّر النسخة بالصوت المضاف.
- عاود دير التفريغ، وراجع المدة الإجمالية، عدد السكتات الطويلة، مواضع التنفس وتشابه العينات فالمناطق اللي ما تبدلاتش.
- حفظ المقاطع الأصلية اللي وافق عليها المستمع مع النطاقات الزمنية ديالها، وما تخلّيش غير الميكس النهائي.
الخلاصة
الصوت الطبيعي ديال الذكاء الاصطناعي ما كيتحققش غير بتكديس علامات تنفس أكثر. الطريقة الأكثر موثوقية هي تخلي النفس تابع للكلام، وتبدا أصوات الحركة فالوقت الصحيح، وتراجع كل نتيجة مركّبة بالتفريغ، وتحافظ قدر الإمكان على الأداء الأصلي ملي كتحتاج للقطع.
التعليمات كتحدّد «شنو يتقال» و«بأي نبرة يتقال»، والبرنامج كيتكلف بالمواقع ديال عشرات الميلي ثانية، علوّ الصوت غير العادي، التكرار وسقوط الكلام، والربط على مستوى العينات. بالتعاون بيناتهم، يمكن تحوّل صوت مزيان خرج بالصدفة لمسار إنتاج قابل للتكرار. للمزيد من الخلفية، شوف دليل التعليمات ديال ElevenLabs، وشرح أصوات التنفس ديال ElevenLabs، وبحث على تنفس المتكلمين.
