يأخذ تحويل الصوت (voice conversion) تسجيلًا ومتحدثًا مرجعيًا، وينتج الكلمات نفسها بصوت المتحدث المرجعي. لا يدخل أي نص في أي مكان من خط الأنابيب: المدخل صوت، والمخرج صوت، ولا يقرأ النموذج أو يكتب أي نص مفرَّغ أبدًا. هذا ما يميّزه عن تحويل النص إلى كلام (TTS)، الذي ينطلق من نص ولا يملك تسجيلًا مصدريًا للحفاظ عليه. يجيب تحويل الصوت عن سؤال أضيق: بالنظر إلى هذا التسجيل، اجعله يبدو كشخص آخر، مع إبقاء الكلمات سليمة.
لتلك المهمة الأضيق استخدامات حقيقية. دبلجة تسجيل بصوت متّسق دون توظيف ممثل صوت ثانٍ. إخفاء هوية متحدث في مقابلة أو مكالمة دعم مع إبقاء الكلمات كما هي حرفيًا. منح مخرجات نظام TTS هوية واحدة ثابتة عبر اللغات، حين تكون الأصوات الأساسية لكل لغة قد دُرِّبت بمعزل عن بعضها وستبدو لولا ذلك كأشخاص مختلفين.
ينفّذ voiceclonnx عشرة من هذه المحركات خلف واجهة برمجية واحدة بلغة بايثون، تعمل كلها على onnxruntime دون حاجة إلى PyTorch وقت الاستدلال. المحركات ليست قابلة للتبادل. فهي تأتي من عائلات نماذج مختلفة، واختيار واحد منها يعني اختيار مقايضة، لا فائزًا.
الواجهة البرمجية، باختصار
from voiceclonnx import VoiceCloner
cloner = VoiceCloner(engine="facodec")
out = cloner.clone_voice("source.wav", "reference.wav", "out.wav")
print(cloner.sample_rate) # 16000
يأخذ clone_voice(audio, reference_voice, out_path) التسجيل المصدر، ومقطعًا مرجعيًا من 5 إلى 30 ثانية للمتحدث الهدف، ومسار مخرَجات، ويعيد مسار ملف WAV المحوَّل. تبديل المحركات يعني تبديل سلسلة engine=؛ شكل الاستدعاء لا يتغيّر. محرك واحد، rvc، هو الاستثناء — يأخذ مسارًا إلى نموذج صوت .onnx بدلًا من تسجيل مرجعي، مذكور أدناه. يجرّ pip install voiceclonnx كل المحركات العشرة؛ وتُنزَّل النماذج من Hugging Face عند أول استخدام.
محوران، لا درجة واحدة
رقمان يصفان مدى نجاح التحويل، ولا يتحركان معًا.
معدّل خطأ الكلمات (WER) يقيس الوضوح: كم من الجملة الأصلية نجا، بحكم إعادة تمرير المخرَجات عبر أداة تعرّف على الكلام ومقارنتها بالنص المصدر. معدّل خطأ 0% يعني وصول كل كلمة بشكل صحيح.
تشابه المتحدث يقيس الهوية: هل تبدو المخرَجات فعلًا كالمتحدث الهدف، لا الأصلي. يُحسَب باستخراج تضمين متحدث — بصمة رقمية مُكثَّفة لجرس صوت، اللون النغمي الذي يجعل صوتًا يبدو مختلفًا عن آخر بنفس النبرة والحدّة — من المخرَجات ومن المقطع المرجعي، ثم مقارنتهما بتشابه جيب التمام. درجة 1.0 تعني جرسًا متطابقًا؛ خط الأساس الخاص بـ voiceclonnx نفسه — نسخة غير محوَّلة من المصدر مُقيَّمة مقابل الهدف — تقع عند 0.09، فأي شيء أعلى من ذلك بشكل ذي دلالة يقوم بعمل تحويل حقيقي.
تنشر voiceclonnx الرقمين لكل محرك، مقيسين مقابل الجملة نفسها محوَّلة إلى صوتين مرجعيين. معدّل خطأ الكلمات يأتي من faster-whisper؛ وتشابه المتحدث يأتي من نموذج تضمين wespeaker-resnet34 (مُقارَن مقابل نموذجين آخرين). ضعهما جنبًا إلى جنب ويظهر نمط: لا محرك يتصدّر العمودين معًا.
| المحرك | العائلة | معدّل خطأ الكلمات | تشابه الهدف |
|---|---|---|---|
focalcodec | تبديل السمات بأقرب جار | 15-19% | 0.61 |
lscodec | مُرمِّز منفصل عن المتحدث | ~35% | 0.54 |
chatterbox | نموذج لغة مُرمِّز انحداري ذاتي | 4-8% | 0.54 |
knnvc | تبديل السمات بأقرب جار | 12-15% | 0.49 |
facodec | مُرمِّز مُفكَّك | 0% | 0.44 |
openvoice | نقل اللون النغمي | 0% | 0.37 |
bicodec | رموز دلالية وعامة | 12% | 0.29 |
triaan | Triple-AAN | 4% | 0.29 |
cosyvoice | مطابقة التدفق | 8% | 0.21 |
(يحوّل rvc أي مصدر إلى صوت واحد ثابت مُدرَّب مجتمعيًا بدلًا من مقطع مرجعي عشوائي، لذا فهو غير قابل للمقارنة في هذا الجدول؛ انظر أدناه.)
اقرأ الجدول صفًّا صفًّا، لا بالبحث عن سطر واحد أفضل من غيره. يقع facodec وopenvoice عند معدّل خطأ 0% — كل كلمة تنجو — بتشابه معتدل. ويقع focalcodec وlscodec في الطرف الآخر: أقوى نقل جرس نغمي في المجموعة، بثمن ترك 15-35% من الكلمات تخرج خاطئة. chatterbox هو المحرك الوحيد الذي يبلي حسنًا في المحورين معًا (معدّل خطأ 4-8%، تشابه 0.54)، وهي خاصية من بنيته، نتناولها تاليًا.
لماذا تتصرّف العائلات بشكل مختلف
تنقسم المحركات إلى مناهج متمايزة، والمنهج يتنبأ بموقع المحرك في الجدول أعلاه.
تبديل السمات بأقرب جار (knnvc، focalcodec). يُقسَّم الصوت المصدر إلى إطارات قصيرة، يتحوّل كل منها إلى متجه سمات بواسطة مُرمِّز مُدرَّب ذاتي الإشراف مسبقًا. ولكل إطار مصدر، يجد الخوارزم أقرب k إطارات في مجمّع سمات المتحدث الهدف ويحسب متوسطها، فيستبدل جرس المصدر إطارًا بإطار مع إبقاء المحتوى الصوتي الأساسي حيث اسُتخرِج من تمثيل المُرمِّز نفسه. لا يوجد فاكّ ترميز مُتعلَّم يربط صوتًا بآخر — التبديل بحث بأقرب جار — وهو ما يفسّر لماذا يمكن أن يكون نقل الجرس عدوانيًا (يصل focalcodec إلى تشابه 0.61) بثمن تشويه إطارات أحيانًا وجدت مطابقة ضعيفة في مجمّع الهدف، ما يظهر كمعدّل خطأ كلمات.
مُرمِّز مُفكَّك (facodec). مُرمِّز صوتي عصبي — نموذج يضغط الكلام إلى تسلسل رموز مُكثَّف ويعيد بناءه — مُدرَّب على تقسيم تلك الرموز صراحةً إلى تدفقين منفصلين للمحتوى والجرس. ولأن المحتوى تدفق مخصَّص، يعيد فاكّ الترميز بناء الكلمات بدقّة عالية؛ ويُستبدَل فقط تدفق الجرس بالمتحدث الهدف. ذلك الفصل الصريح هو سبب وصول facodec إلى معدّل خطأ 0%: الحفاظ على المحتوى لا ينافس شيئًا.
نقل اللون النغمي (openvoice). وحدة تحويل تغيّر اللون النغمي — مِنحنى النبرة والجرس — بعد أن يكون مُرمِّز منفصل قد ثبّت المحتوى اللغوي، شبيهًا في الروح بنهج المُرمِّز المُفكَّك لكنه مُنفَّذ كخطوة نقل لون فوق مخطط طيفي-مِل بدلًا من رموز منفصلة. يصل أيضًا إلى معدّل خطأ 0%، بتشابه أقلّ قليلًا من facodec.
نموذج لغة مُرمِّز انحداري ذاتي (chatterbox). نموذج لغة انحداري ذاتي يتنبأ برموز المُرمِّز واحدًا تلو الآخر، مشروطًا بتضمين المتحدث الهدف، شبيهًا كثيرًا بنموذج لغة تحويل النص إلى كلام لكنه مشروط برموز محتوى التسجيل المصدر بدلًا من النص. ولأنه يولّد العروض (الإيقاع، والنبر، والتنغيم) كجزء من العملية الانحدارية الذاتية نفسها بدلًا من نسخها مباشرةً من المصدر، فبإمكانه حمل أسلوب الكلام مع الجرس — وهو ما يفسّر ذكر التوثيق أنه يعطي “أقوى انتقال من المصدر إلى الهدف” — وهو المحرك الوحيد الذي يحرز درجات جيدة في الوضوح والتشابه معًا.
مطابقة التدفق (cosyvoice). عملية توليدية متصلة تُنقّح تكرارًا الضوضاء إلى مخطط طيفي-مِل هدف، باستخدام حلّال معادلة تفاضلية عادية (ODE) بعدد خطوات قابل للضبط (ode_steps، الافتراضي 10). مُرمِّز محتواه مُصمَّم للنقل عبر اللغات، وتلك العمومية على الأرجح سبب كون درجة تشابه الهدف لديه الأدنى في المجموعة: التمثيل يُحسَّن لأجل الاستقلال عن اللغة، لا لأجل أقرب مطابقة للمتحدث.
مُرمِّز منفصل عن المتحدث (lscodec). مثل facodec، مُرمِّز مُدرَّب على فصل المحتوى عن هوية المتحدث، لكنه مضبوط لدفع التشابه أبعد بثمن مباشر من دقّة تدفق المحتوى، فيهبط عند معدّل خطأ ~35% مع ثاني أعلى تشابه في المجموعة.
Triple-AAN والمُرمِّزات الدلالية-العامة المشتركة (triaan، bicodec) تقع في الوسط على المحورين: معدّل خطأ معتدل، وتشابه معتدل، دون انحياز قوي في أي اتجاه.
مُرمِّز أي-إلى-واحد + مُصوِّت (rvc). مبني على ContentVec (مُرمِّز محتوى) يغذّي مُصوِّت VITS، مُدرَّب لكل صوت هدف بدلًا من قبول مقطع مرجعي عشوائي. reference_voice لهذا المحرك هو مسار إلى ملف نموذج RVC بصيغة .onnx أو معرّف مستودع Hugging Face، لا ملف صوتي:
cloner = VoiceCloner(engine="rvc")
out = cloner.clone_voice("source.wav", "/path/to/myvoice.onnx", "out.wav")
ولأن كل نموذج RVC مُدرَّب على صوت هدف واحد، فهو لا يأخذ مقطعًا مرجعيًا وقت الاستدلال ولا يُقيَّم بمعيار التشابه نفسه لمحركات أي-إلى-أي. معدّل خطأه المقيس بنسبة 38% يعكس نموذجًا واحدًا مُدرَّبًا مجتمعيًا كعيّنة، لا البنية عمومًا — تعتمد الجودة على كيفية تدريب ذلك النموذج بالذات. توجد آلاف الأصوات المجتمعية لـ RVC على Hugging Face وتُحمَّل مباشرةً بمعرّف المستودع.
تحديد أيّها تُشغِّل
خط أنابيب سريع عام الغرض. ابدأ بـ facodec أو openvoice. كلاهما يصل إلى معدّل خطأ 0% مقيسًا بتشابه معتدل (0.44 و0.37)، وكلاهما يشحن نسخة مُكمَّمة بـ INT8 دون تراجع جودة مُسجَّل — مرّر quantized=True لنموذج أصغر وأسرع.
أقصى تشابه للمتحدث. استخدم focalcodec (تشابه 0.61، الأعلى مقيسًا) إن كان معدّل الخطأ 15-19% مقبولًا للاستخدام، أو chatterbox (تشابه 0.54، معدّل خطأ 4-8%) إن لم يكن كذلك. يعمل chatterbox أيضًا عند 24 كيلوهرتز، أعلى معدّل مخرَجات لتحويل أي-إلى-أي في المجموعة — يصل rvc إلى 48 كيلوهرتز لكن فقط في وضع أي-إلى-واحد أعلاه.
عتاد محدود الموارد. يبلغ knnvc عند INT8 نحو 123 ميغابايت على القرص، أصغر بصمة في المجموعة، بتشابه 0.49 ومعدّل خطأ 12-15% — مقايضة معقولة للذاكرة المحدودة. لا يُكمَّم كل محرك بسلاسة: يُوثَّق تراجع focalcodec وcosyvoice في INT8، لذا أبقِ هذين على fp32.
لغة لم يُدرَّب عليها المحرك. مُرمِّز محتوى cosyvoice مبني للنقل عبر اللغات، وهو السبب المُوثَّق للجوء إليه بدلًا من محرك مضبوط للتحويل ضمن اللغة نفسها، رغم أن تشابهه المقيس (0.21) هو الأدنى بين المحركات التسعة القابلة للمقارنة مباشرةً.
هوية الصوت أهم من الصياغة الدقيقة. يعطي lscodec أقوى نقل جرس بين محركات عائلة المُرمِّز (0.54، متعادلًا مع chatterbox) بثمن أعلى معدّل خطأ في المجموعة القابلة للمقارنة (~35%). اختره حين يكون الهدف “هل يبدو هذا كالمتحدث الهدف” وأخطاء الكلمات العرضية في المخرَجات مقبولة.
صوت مجتمعي ثابت واحد بدلًا من مقطع عشوائي. rvc، باستخدام نموذج صوت .onnx مُدرَّب مسبقًا بدلًا من تسجيل مرجعي.
قيد غير تجاري ينبغي التحقق منه أولًا. أوزان bicodec مرخّصة بـ CC BY-NC-SA 4.0. أوزان كل محرك آخر مرخّصة بـ MIT أو Apache-2.0 أو CC BY 4.0. تحقّق من رخصة الوزن المحدَّد الذي تنشره قبل شحنه تجاريًا.
ما لا يفعله جيدًا، ومن لا ينبغي استخدامه عليه
يأتي كل رقم أعلاه بالتحفّظ نفسه: تصف الأرقام جملة عرض توضيحي بالإنجليزية محوَّلة بين صوتين مرجعيين محدَّدين. لغة مختلفة، أو تسجيل مصدر أكثر ضجيجًا، أو مقطع مرجعي أقصر أو أدنى جودة، أو متحدث مصدر يبعد صوته كثيرًا عن أي شيء في بيانات تدريب محرك، كل ذلك سيحرّك الأرقام، غالبًا نحو الأسوأ. لا واحد من هذه المحركات علاجٌ شامل لتسجيل مصدر رديء الجودة — بعضها يحوّل الجرس بسعادة بينما يحمل ضجيج المصدر مباشرةً، إذ إن للضجيج بصمته الصوتية الخاصة التي لا يفصلها فصل المحتوى/الجرس بنظافة دائمًا.
يثير تحويل الصوت أيضًا خطرًا حقيقيًا سبق أن أجبر ابن عمه القريب، استنساخ الصوت لـ TTS، هذا الفريق على التفكير فيه: تحويل تسجيل ليبدو كشخص حقيقي قابل للتعرّف عليه هو تقنية قادرة على انتحال الهوية، سواء كان ذلك مقصودًا أم لا. القاعدة التي يطبّقها هذا الفريق على الأصوات الاصطناعية عمومًا — الحصول على إذن صريح قبل استخدام صوت شخص حقيقي كمانح أو هدف، واللجوء إلى تسجيلات في الملكية العامة أو صوت أصلي مقصود عندما يتعذّر الإذن — تنطبق هنا دون استثناء. مقطع مرجعي لشخص حقيقي لا يختلف، من منظور الموافقة، عن مجموعة تدريب كاملة لصوته؛ إنه فقط يحتاج قدرًا أقل بكثير منها لإنتاج نتيجة قابلة للاستخدام، وهو سبب لمزيد من الحذر، لا أقل.
تواصل معنا عبر contact أو اطّلع على ما نقدّمه إن كان تحويل الصوت جزءًا من خط أنابيب تبنيه.