
هذه هي المقالة الأخيرة في سلسلة من المقالات التدريبية للمطورين في مجال الذكاء الاصطناعي. يناقش خطوات إنشاء نموذج التعلم العميق لتوليد الموسيقى ، واختيار النموذج المناسب والمعالجة المسبقة للبيانات ، ويصف إجراءات إعداد BachBot والتدريب عليها واختبارها وتعديلها.
جيل الموسيقى - التفكير في مهمة
تتمثل الخطوة الأولى في حل العديد من المشكلات باستخدام الذكاء الاصطناعي (AI) في تقليل المشكلة إلى مشكلة أساسية يمكن حلها عن طريق الذكاء الاصطناعي. إحدى هذه المشاكل هي التنبؤ بالتسلسل ، والذي يستخدم في ترجمة ومعالجة تطبيقات اللغة الطبيعية. يمكن اختزال مهمتنا في توليد الموسيقى إلى مشكلة التنبؤ بتسلسل ، وسيتم تنفيذ التنبؤ لسلسلة من النوتات الموسيقية.
اختيار النموذج
هناك عدة أنواع مختلفة من الشبكات العصبية التي يمكن اعتبارها نماذج: الشبكات العصبية للتوزيع المباشر والشبكات العصبية المتكررة والشبكات العصبية للذاكرة طويلة المدى.
الخلايا العصبية هي العناصر المجردة الأساسية التي تتحد لتشكيل الشبكات العصبية. بشكل أساسي ، العصبون هو وظيفة تستقبل البيانات عند المدخلات وتخرج النتيجة.
عصبونيمكن دمج طبقات من الخلايا العصبية التي تتلقى نفس البيانات عند المدخلات والمخرجات المتصلة لبناء
شبكة عصبية ذات انتشار مباشر . تظهر هذه الشبكات العصبية نتائج عالية بسبب تكوين وظائف التنشيط غير الخطي عند تمرير البيانات من خلال عدة طبقات (ما يسمى التعلم العميق).
شبكة عصبية للتوزيع المباشرتُظهر الشبكة العصبية للتوزيع المباشر نتائج جيدة في مجموعة واسعة من التطبيقات. ومع ذلك ، فإن هذه الشبكة العصبية لها عيب واحد لا يسمح باستخدامها في مهمة تتعلق بالتأليف الموسيقي (التنبؤ بالتسلسل): لها بعد ثابت من بيانات الإدخال ، ويمكن أن يكون للتأليفات الموسيقية أطوال مختلفة. بالإضافة إلى ذلك ،
لا تأخذ الشبكات العصبية للتوزيع المباشر في الاعتبار المدخلات من الخطوات الزمنية السابقة ، مما يجعلها غير مفيدة جدًا في حل مشكلة التنبؤ بالتسلسل! نموذج يسمى
الشبكة العصبية المتكررة هو الأنسب لهذه المهمة.
تحل الشبكات العصبية العودية كلتا هاتين المشكلتين عن طريق تقديم روابط بين العقد المخفية: في هذه الحالة ، في الخطوة الزمنية التالية ، يمكن للعقد أن تتلقى معلومات حول البيانات في الخطوة الزمنية السابقة.
تمثيل مفصل لشبكة عصبية متكررةكما ترى في الشكل ، يتلقى كل عصبون الآن مدخلات من كل من الطبقة العصبية السابقة والوقت السابق.
تواجه الشبكات العصبية العودية التي تتعامل مع تسلسلات إدخال كبيرة ما يسمى
مشكلة التدرج المتلاشي : وهذا يعني أن التأثير من الخطوات الزمنية السابقة يختفي بسرعة. هذه المشكلة هي سمة مهمة التكوين الموسيقي ، حيث أن هناك تبعيات مهمة طويلة الأجل في الأعمال الموسيقية التي يجب أخذها في الاعتبار.
لحل مشكلة
التدهور المتلاشي ، يمكن استخدام تعديل الشبكة المتكررة ، والتي تسمى
الشبكة العصبية ذات الذاكرة قصيرة المدى الطويلة (أو الشبكة العصبية LSTM) . يتم حل هذه المشكلة عن طريق إدخال خلايا الذاكرة ، والتي يتم مراقبتها بعناية من خلال ثلاثة أنواع من "البوابات". انقر على الرابط التالي لمزيد من المعلومات:
معلومات عامة حول الشبكات العصبية LSTM .
وبالتالي ، يستخدم BachBot نموذجًا يعتمد على الشبكة العصبية LSTM.
المعالجة
الموسيقى هي شكل فني معقد للغاية وتشمل أبعادًا مختلفة: الملعب ، والإيقاع ، والإيقاع ، والظلال الديناميكية ، والمفصلة ، والمزيد. لتبسيط الموسيقى لأغراض هذا المشروع
، يتم النظر في درجة الصوت
ومدتها فقط . علاوة على ذلك ، تم
نقل جميع الكوراليات إلى المفتاح في C major أو A الثانوي ، وتم تحديد فترات المذكرة
في الوقت (تقريبًا) إلى أقرب مضاعف للملاحظة السادسة عشرة. تم اتخاذ هذه الإجراءات لتقليل تعقيد التراكيب وزيادة أداء الشبكة ، في حين ظل المحتوى الأساسي للموسيقى دون تغيير. تم تنفيذ عمليات تطبيع نغمات ومدة الملاحظات باستخدام مكتبة music21.
def standardize_key(score): """Converts into the key of C major or A minor. Adapted from https://gist.github.com/aldous-rey/68c6c43450517aa47474 """
الكود المستخدم لتوحيد الشخصيات الرئيسية في الأعمال التي تم جمعها ، يتم استخدام المفاتيح في C major أو A الثانوي في الإخراجتم إجراء قياس الوقت لأقرب مضاعف للملاحظة السادسة عشرة باستخدام وظيفة
Stream.quantize () لمكتبة
music21 . فيما يلي مقارنة للإحصاءات المرتبطة بمجموعة بيانات قبل معالجتها الأولية وبعدها:
استخدام كل فئة من الملاحظات قبل (يسار) وبعد المعالجة المسبقة (يمين). فئة الملاحظة هي ملاحظة بغض النظر عن اوكتاف.
موقع الملاحظات قبل (يسار) وبعد المعالجة المسبقة (يمين)كما ترى في الشكل أعلاه ، فإن تبديل المفتاح الأصلي للكوراليز إلى مفتاح C major أو C الثانوي (قاصر) أثر بشكل كبير على فئة الملاحظات المستخدمة في الأعمال التي تم جمعها. على وجه الخصوص ، زاد عدد مرات ظهور الملاحظات في المفاتيح في المفاتيح الرئيسية (C major) والقاصر (A صغير) (C ، D ، E ، F ، G ، A ، B). يمكنك أيضًا ملاحظة القمم الصغيرة للملاحظات F # و G # نظرًا لوجودها في تسلسل تصاعدي لحني A A (A ، B ، C ، D ، E ، F # و G #).
من ناحية أخرى ، كان لقياس الوقت تأثير أصغر بكثير. يمكن تفسير ذلك من خلال الدقة العالية للتحديد الكمي (على غرار التقريب إلى العديد من الأرقام المهمة).
الترميز
بعد معالجة البيانات مسبقًا ، من الضروري ترميز الكورال إلى تنسيق يمكن معالجته بسهولة باستخدام شبكة عصبية متكررة. التنسيق المطلوب هو
سلسلة من الرموز المميزة . بالنسبة لمشروع BachBot ، تم اختيار الترميز على مستوى الملاحظات (يمثل كل رمز مميز ملاحظة) بدلاً من مستوى الحبال (يمثل كل رمز وتر وتر). قلل هذا الحل من حجم القاموس من 128
4 الحبال الممكنة إلى 128 ملاحظة ممكنة ، مما سمح بزيادة كفاءة العمل.
تم إنشاء مخطط ترميز أصلي للتراكيب الموسيقية لمشروع BachBot. ينقسم الكورال إلى خطوات زمنية تقابل الملاحظات السادسة عشرة. تسمى هذه الخطوات الإطارات. يحتوي كل إطار على سلسلة من الصفوف التي تمثل قيمة خطوة ملاحظة بتنسيق واجهة آلة موسيقية رقمية (MIDI) وعلامة ربط هذه الملاحظة بملاحظة سابقة بنفس الارتفاع (ملاحظة ، علامة ربط). يتم ترقيم الملاحظات داخل الإطار بترتيب تنازلي للارتفاع (سوبرانو → alt → tenor → bass). قد يحتوي كل إطار أيضًا على إطار يشير إلى نهاية العبارة ؛ يتم تمثيل Fermata برمز نقطة (.) فوق الملاحظة. تتم إضافة
رمزي START و
END إلى بداية ونهاية كل رقص. تؤدي هذه الرموز إلى تهيئة النموذج وتسمح للمستخدم بتحديد متى ينتهي التكوين.
START
(59, True)
(56, True)
(52, True)
(47, True)
|||
(59, True)
(56, True)
(52, True)
(47, True)
|||
(.)
(57, False)
(52, False)
(48, False)
(45, False)
|||
(.)
(57, True)
(52, True)
(48, True)
(45, True)
|||
END
مثال على ترميز حبلين. كل وتر يدور على إيقاع الثامن ، ويرافق الوتر الثاني مزرعة. التسلسل "|||" يمثل نهاية الإطار def encode_score(score, keep_fermatas=True, parts_to_mask=[]): """ Encodes a music21 score into a List of chords, where each chord is represented with a (Fermata :: Bool, List[(Note :: Integer, Tie :: Bool)]). If `keep_fermatas` is True, all `has_fermata`s will be False. All tokens from parts in `parts_to_mask` will have output tokens `BLANK_MASK_TXT`. Time is discretized such that each crotchet occupies `FRAMES_PER_CROTCHET` frames. """ encoded_score = [] for chord in (score .quantize((FRAMES_PER_CROTCHET,)) .chordify(addPartIdAsGroup=bool(parts_to_mask)) .flat .notesAndRests):
الكود المستخدم لترميز نغمة الموسيقى 21 باستخدام مخطط ترميز خاصمهمة نموذجية
في الجزء السابق ، تم تقديم شرح يوضح أن مهمة التكوين التلقائي يمكن اختزالها إلى مهمة التنبؤ بالتسلسل. على وجه الخصوص ، يمكن للنموذج التنبؤ بالملاحظة التالية الأكثر احتمالًا استنادًا إلى الملاحظات السابقة. لحل هذا النوع من المشاكل ، تكون الشبكة العصبية ذات الذاكرة القصيرة المدى (LSTM) هي الأنسب. بشكل رسمي ، يجب أن يتنبأ النموذج بـ P (x
t + 1 | x
t ، h
t-1 ) ، وتوزيع الاحتمالات للملاحظات المحتملة التالية (x
t + 1 ) بناءً على الرمز المميز الحالي (x
t ) والحالة المخفية السابقة (h
t-1 ) . ومن المثير للاهتمام ، يتم تنفيذ نفس العملية بواسطة نماذج لغوية تعتمد على الشبكات العصبية المتكررة.
في وضع التكوين ، تتم تهيئة النموذج برمز
START المميز ، وبعد ذلك يختار الرمز التالي الأكثر احتمالية للمتابعة. بعد ذلك ، يستمر النموذج في تحديد الرمز التالي الأكثر احتمالًا باستخدام الملاحظة السابقة والحالة المخفية السابقة حتى يتم إنشاء رمز END المميز. يحتوي النظام على عناصر درجة حرارة تضيف درجة من العشوائية لمنع BachBot من تكوين نفس القطعة مرارًا وتكرارًا.
دالة الخسارة
عند تدريب نموذج للتنبؤ ، عادة ما تكون هناك بعض الوظائف التي يجب التقليل منها (تسمى دالة الخسارة). تصف هذه الوظيفة الفرق بين تنبؤ النموذج وخاصية الحقيقة الأساسية. يقلل BachBot من فقدان الإنتروبيا بين التوزيع المتوقع (x
t + 1 ) والتوزيع الفعلي لوظيفة الهدف. يعد استخدام الإنتروبيا كوظيفة خسارة نقطة بداية جيدة لمجموعة واسعة من المهام ، ولكن في بعض الحالات يمكنك استخدام وظيفة الخسارة الخاصة بك. نهج آخر مقبول هو محاولة استخدام وظائف الخسارة المختلفة وتطبيق نموذج يقلل من الخسارة الفعلية أثناء التحقق.
التدريب / الاختبار
في تدريب الشبكة العصبية العودية ، استخدم BachBot تصحيح الرمز المميز بقيمة x
t + 1 بدلاً من تطبيق نموذج التنبؤ. تُستخدم هذه العملية ، المعروفة باسم التعلم الإلزامي ، لضمان التقارب ، حيث أن التنبؤات النموذجية ستؤدي بطبيعة الحال إلى نتائج ضعيفة في بداية التدريب. في المقابل ، أثناء التحقق من الصحة والتكوين ، يجب إعادة استخدام التنبؤ بالنموذج x
t + 1 كمدخل للتنبؤ التالي.
اعتبارات أخرى
لزيادة الكفاءة في هذا النموذج ، تم استخدام الطرق العملية التالية الشائعة في الشبكات العصبية LSTM: اقتطاع التدرج المقيس ، وطريقة الإزالة ، وتطبيع الرزم ، وطريقة انتشار الخطأ مرة أخرى (BPTT).
تزيل
طريقة اقتطاع التدرج المقيسة مشكلة النمو غير المنضبط لقيمة التدرج (عكس مشكلة التدرج المتلاشي ، والتي تم حلها باستخدام بنية خلايا ذاكرة LSTM). باستخدام هذه التقنية ، يتم اقتطاع أو تغيير حجم قيم التدرج التي تتجاوز عتبة معينة.
طريقة الاستبعاد هي تقنية
يتم فيها فصل (استبعاد) بعض الخلايا العصبية
المختارة عشوائيًا أثناء التدريب على الشبكة. هذا يتجنب الإفراط في التجهيز ويحسن جودة التعميم. تنشأ مشكلة التجهيز الزائد عندما يصبح النموذج محسنًا لمجموعة بيانات التدريب وبدرجة أقل قابلة للتطبيق على العينات خارج هذه المجموعة. غالبًا ما تؤدي طريقة الاستبعاد إلى تفاقم الخسارة أثناء التدريب ، ولكنها تحسنها في مرحلة التحقق (المزيد عن هذا أدناه).
إن حساب التدرج في شبكة عصبية متكررة لتسلسل من 1000 عنصر يعادل في التكلفة للممر الأمامي والخلفي في الشبكة العصبية للتوزيع المباشر لـ 1000 طبقة. تُستخدم طريقة
الانتشار العكسي للخطأ المقطوع (BPTT) بمرور الوقت لتقليل تكلفة تحديث المعلمات أثناء التدريب. وهذا يعني أنه يتم نشر الأخطاء فقط خلال عدد ثابت من الخطوات الزمنية التي تم احتسابها من اللحظة الحالية. يرجى ملاحظة أن تبعيات التعلم طويلة المدى لا تزال ممكنة مع طريقة BPTT ، حيث تم الكشف عن الحالات الكامنة بالفعل في العديد من الخطوات الزمنية السابقة.
معلمات
فيما يلي قائمة بالمعلمات ذات الصلة لنماذج الشبكات العصبية المتكررة / الشبكات العصبية ذات الذاكرة طويلة المدى:
- عدد الطبقات . قد تؤدي زيادة هذه المعلمة إلى زيادة كفاءة النموذج ، ولكنها ستستغرق وقتًا أطول لتدريبها. بالإضافة إلى ذلك ، يمكن أن تؤدي طبقات كثيرة جدًا إلى الإفراط في التجهيز.
- بعد الدولة الكامنة . قد تؤدي زيادة هذه المعلمة إلى زيادة تعقيد النموذج ، ومع ذلك ، يمكن أن يؤدي ذلك إلى الإفراط في التجهيز.
- أبعاد مقارنات النواقل
- طول / عدد الإطارات المتسلسلة قبل اقتطاع الانتشار الخلفي للخطأ بمرور الوقت.
- احتمالية استبعاد الخلايا العصبية . احتمال استبعاد العصبون من الشبكة خلال كل دورة تحديث.
ستتم مناقشة منهجية اختيار المجموعة المثلى من المعلمات لاحقًا في هذه المقالة.
التنفيذ والتدريب والاختبار
اختيار المنصة
حاليًا ، هناك العديد من الأنظمة الأساسية التي تسمح لك بتنفيذ نماذج تعلُّم الآلة بلغات برمجة مختلفة (بما في ذلك جافا سكريبت!). تشمل المنصات الشهيرة
scikit-learn و
TensorFlow و
Torch .
تم اختيار مكتبة Torch كمنصة لمشروع BachBot. في البداية ، تمت تجربة مكتبة TensorFlow ، ولكنها في ذلك الوقت استخدمت شبكات عصبية متكررة واسعة النطاق ، مما أدى إلى تجاوز سعة ذاكرة الوصول العشوائي لوحدة معالجة الرسومات. Torch هي منصة حوسبة علمية مدعومة بلغة البرمجة السريعة LuaJIT *. تحتوي منصة Torch على مكتبات ممتازة للعمل مع الشبكات العصبية والتحسين.
تنفيذ النموذج والتدريب
من الواضح أن التنفيذ يختلف باختلاف اللغة والنظام الأساسي الذي تختاره. لمعرفة كيفية تنفيذ BachBot للشبكات العصبية بذاكرة طويلة المدى قصيرة المدى باستخدام Torch ، تحقق من النصوص البرمجية المستخدمة لتدريب وتعيين معلمات BachBot. هذه النصوص متاحة على موقع
Feynman Lyang GitHub.نقطة بداية جيدة للتنقل في المستودع هي
البرنامج النصي 1-train.zsh . باستخدامه ، يمكنك العثور على المسار إلى ملف
bachbot.py .
بتعبير أدق ، البرنامج النصي الرئيسي لإعداد معلمات النموذج هو ملف
LSTM.lua . البرنامج النصي لتدريب النموذج هو ملف
train.lua .
تحسين المعلمات
للبحث عن القيم المثلى للمعلمات الفائقة ، تم استخدام طريقة البحث عن الشبكة باستخدام شبكة المعلمات التالية.
شبكة المعلمات التي يستخدمها BachBot في بحث الشبكةالبحث الشبكي هو بحث كامل عن كل مجموعات ممكنة من المعلمات. هناك طرق أخرى مقترحة لتحسين المعاملات الفائقة هي البحث العشوائي وتحسين بايزي.
المجموعة المثلى من المعلمات المفرطة التي تم اكتشافها نتيجة للبحث في الشبكة هي كما يلي: عدد الطبقات = 3 ، أبعاد الحالة المخفية = 256 ، أبعاد مقارنات المتجهات = 32 ، طول التسلسل = 128 ، احتمال القضاء على الخلايا العصبية = 0.3.
وصل هذا النموذج إلى خسارة إنتروبيا عبر 0.324 أثناء التدريب و 0.477 في مرحلة التحقق. يوضح الرسم البياني لمنحنى التعلم أن عملية التعلم تتقارب بعد 30 تكرارًا (28.5 دقيقة عند استخدام وحدة معالجة رسومات واحدة).
يمكن أن توضح الرسوم البيانية للخسارة أثناء التدريب وأثناء مرحلة التحقق أيضًا تأثير كل معلمة مفرطة. من الأهمية بمكان بالنسبة لنا احتمال القضاء على الخلايا العصبية:
منحنيات التعلم لإعدادات طريقة الاستبعاد المختلفةيمكن أن نرى في الشكل أن طريقة الإقصاء تتجنب بالفعل حدوث الإفراط في التجهيز. على الرغم من احتمالية استبعاد 0.0 ، تكون الخسارة أثناء التدريب ضئيلة ، في مرحلة التحقق ، يكون للخسارة قيمة قصوى. تؤدي القيم الكبيرة للاحتمالات إلى زيادة في الخسائر أثناء التدريب وانخفاض في الخسائر في مرحلة التحقق. تم إصلاح الحد الأدنى لقيمة الخسارة أثناء مرحلة التحقق عند العمل مع BachBot مع احتمال استثناء قدره 0.3.
طرق التقييم البديلة (اختياري)
بالنسبة لبعض الموديلات - خاصة بالنسبة للتطبيقات الإبداعية مثل تأليف الموسيقى - قد لا يكون فقدان المقياس المناسب لنجاح النظام. بدلاً من ذلك ، قد يكون الإدراك البشري الذاتي هو المعيار الأفضل.
الهدف من مشروع BachBot هو إنشاء الموسيقى تلقائيًا التي لا يمكن تمييزها عن مؤلفات Bach الخاصة. لتقييم نجاح النتائج ، تم إجراء مسح للمستخدمين على الإنترنت. تم إعطاء الاستطلاع شكل مسابقة حيث طُلب من المستخدمين تحديد الأعمال التي تنتمي إلى مشروع BachBot ، وأيها يخص Bach.
أظهرت نتائج المسح أن المشاركين في المسح (759 شخصًا بمستويات مختلفة من التدريب) كانوا قادرين على التمييز بدقة بين عينتين في 59٪ فقط من الحالات. هذا أعلى بنسبة 9 في المائة فقط من نتيجة التخمين العشوائي! جرب
استطلاع BachBot بنفسك!
تكييف النموذج للتوافق
يمكن لـ BachBot الآن حساب P (x
t + 1 | x
t ، h
t-1 ) ، وتوزيع الاحتمالات للملاحظات المحتملة التالية استنادًا إلى الملاحظة الحالية والحالة المخفية السابقة. يمكن بعد ذلك تكييف نموذج التنبؤ التسلسلي لتنسيق اللحن. مطلوب مثل هذا النموذج المواءم لتنسيق اللحن ، المعدلة بمساعدة العواطف ، كجزء من مشروع موسيقي مع عرض شرائح.
عند العمل مع تنسيق النموذج ، يتم توفير لحن محدد مسبقًا (عادة ما يكون هذا جزء سوبرانو) ، وبعد ذلك يجب أن يؤلف النموذج الموسيقى لبقية القطع. لإنجاز هذه المهمة ، يتم استخدام البحث الجشع "الأفضل أولاً" مع تقييد إصلاح نغمات اللحن. تنطوي خوارزميات الجشع على قرارات مثالية من وجهة نظر محلية. إذن ، فيما يلي إستراتيجية بسيطة تستخدم للتنسيق:
افترض أن x t هي رموز مميزة في التنسيق المقترح. في الخطوة الزمنية t ، إذا كانت الملاحظة تتوافق مع اللحن ، فإن x t تساوي الملاحظة المحددة. خلاف ذلك ، فإن x t تساوي الملاحظة التالية الأكثر احتمالاً وفقاً لتنبؤات النموذج. يمكن العثور على كود هذا النموذج على موقع Feynman Lyang GitHub: HarmModel.lua ، coordinize.lua .
فيما يلي مثال لتنسيق التهويدات Twinkle و Twinkle و Little Star مع BachBot باستخدام الإستراتيجية المذكورة أعلاه.
مواءمة تهليل Twinkle ، Twinkle ، Little Star مع BachBot (في الجزء السوبرانو). أجزاء من الفيولا ، التينور والباس تم ملؤها أيضًا بـ BachBotفي هذا المثال ، يتم إعطاء لحن التهويدات Twinkle ، Twinkle ، Little Star في جزء السوبرانو. بعد ذلك ، تم ملء أجزاء من الفيولا والمضمون والباس باستخدام BachBot باستخدام استراتيجية التنسيق.
وإليك كيف يبدو .
على الرغم من حقيقة أن BachBot أظهر أداءً جيدًا في أداء هذه المهمة ، إلا أن هناك قيودًا معينة مرتبطة بهذا النموذج. بتعبير أدق ،
لا تتطلع الخوارزمية إلى اللحن وتستخدم الملاحظة الحالية فقط من اللحن والسياق السابق لإنشاء ملاحظات لاحقة. عند تنسيق اللحن من قبل الناس ، يمكنهم تغطية اللحن بأكمله ، مما يبسط اشتقاق التوافقيات المناسبة. حقيقة أن هذا النموذج غير قادر على القيام بذلك يمكن أن يؤدي إلى
مفاجآت بسبب القيود المفروضة على استخدام المعلومات اللاحقة التي تسبب الأخطاء. لحل هذه المشكلة ، يمكن استخدام ما يسمى
ببحث الحزمة .
عند استخدام بحث الشعاع ، يتم فحص خطوط الحركة المختلفة. على سبيل المثال ، بدلاً من استخدام ملاحظة واحدة فقط ، وهي الملاحظة الأكثر احتمالًا ، والتي يتم إجراؤها حاليًا ، يمكن النظر في أربع أو خمس ملاحظات محتملة ، وبعد ذلك تواصل الخوارزمية عملها مع كل من هذه الملاحظات. يمكن أن يساعد فحص الخيارات المختلفة النموذج على
التعافي من الأخطاء . يُستخدم البحث عن الشعاع بشكل شائع في تطبيقات معالجة اللغات الطبيعية لإنشاء جمل.
يمكن الآن تمرير الألحان المعدلة بمساعدة العواطف من خلال نموذج التنسيق هذا لإكمالها.