توليد الصوت من النص بـ models محلية

بشغّل text‑to‑speech مفتوح المصدر محليًا على Mac Studio M4 Max — ودلوقتي مدمج في محرك الـ AI بتاعي — وبقارنه بـ ElevenLabs Eleven v4 على حواديت قبل النوم حقيقية

رسمة: مايك قديم وكمبيوتر ألومنيوم صغير، وبينهم موجة صوت لونها كهرماني فوق كتاب صور مفتوح

أنا ببني محرك AI شخصي بيشتغل بالكامل على الـ Mac Studio M4 Max بتاعي. توليد النص كان أول خطوة. والسؤال الطبيعي بعده: أقدر أولّد صوت محليًا كمان؟ طلع آه — والنتايج حلوة بشكل مكنتش متوقعه.

تحديث، أكتوبر 2026. لما كتبت المقال ده أول مرة في فبراير، الصوت المحلي كان معناه model واحد هو VibeVoice وتجربة واحدة. من ساعتها بقى الصوت جزء من مشاريعي اليومية: حواديت قبل النوم لابني بصوتي أنا، ومجموعة محركات صوت محلية موصّلة بـ H_AI عن طريق Voicebox، وأداة batch بتطلّع قصة كاملة محليًا أو عن طريق ElevenLabs من نفس الـ script. وElevenLabs كمان اتطوّر — الـ default عندي دلوقتي Eleven v4. فيه أمثلة ودروس جديدة تحت، ومقارنة فبراير الأصلية لسه موجودة.
تحديث، 15 أكتوبر 2026. آخر حاجة في قايمة «الخطوة الجاية» عندي خلصت: صوتي أنا بقى بيشتغل محليًا. بعد ما جرّبت 11 model صوت مفتوح المصدر جنب بعض، اخترت Fish S2-Pro. بيستنسخ صوتي من تسجيل قصير، وبيمشي على نفس الـ tags زي [warmly] اللي بيفهمها ElevenLabs، وبقى الصوت الـ default في H_AI. الصوت الجديد موجود في المقارنة اللي تحت وليه قسم لوحده. وعملت نفس التجربة بالعربي المصري كمان؛ نتايجها أقل وضوحًا، وليها قسم لوحدها.

نفس صفحة قبل النوم، بأربع أصوات

أحدث مثال هو صفحة تصبح على خير من سوسو القطة، تاني كتاب من كتب النوم بتاعة ابني. نفس الـ script، أربع أصوات — واحد في الـ cloud وتلاتة على الـ Mac Studio. وأول اتنين صوتي أنا:

[softly] Goodnight, Susu. <pause> Goodnight Baba. Goodnight Mama. Goodnight Susu, curled up at the end of the bed. <pause> [whispers] Goodnight, Yusuf.

ElevenLabs Eleven v4 — صوتي المستنسخ

في الـ cloud — audio tags للأداء — النسخة اللي في الكتاب — 8.6 ثانية

Fish S2-Pro — صوتي المستنسخ، محلي

Mac Studio — نفس الـ tags، والـ model بيمشي عليها — اتولّد في حوالي 10 ثواني — 10.4 ثانية

Kokoro عن طريق Voicebox — محلي

Mac Studio — صوت جاهز «⁦George⁩» — اتولّد في حوالي 5 ثواني — 13.6 ثانية

Qwen Custom Voice عن طريق Voicebox — محلي

Mac Studio — صوت جاهز «⁦Ryan⁩» — اتولّد في حوالي 20 ثانية — 15.0 ثانية

أول ما عملت المقارنة دي، نسخة ElevenLabs بس هي اللي كان صوتها شبهي؛ المحركات المحلية كانت بتستخدم أصوات جاهزة. ده اتغيّر. النسخة التانية هي صوتي أنا، مستنسخ على الـ Mac Studio، وبتمشي على الـ tags [softly] و[whispers] المكتوبة في الـ script زي ElevenLabs بالظبط. والصوتين الجاهزين بيورّوا المشكلة التانية اللي لقيتها: بيقروا نفس الصفحة أبطأ بأكتر من 50%. وده مهم في كتاب مصوّر، لأن الصفحة اللي بعدها مينفعش تتقلب قبل ما الجملة تخلص. والنسخة المحلية من صوتي جت في النص: 10.4 ثانية، قصاد 8.6 لـ ElevenLabs.

إيه اللي اتغيّر في ElevenLabs: Eleven v4

الحكي في كتب النوم معمول بـ Eleven v4، اللي بقى الـ default عندي. الفرق الكبير عن Multilingual v2 القديم هو طريقة التحكم فيه. v2 كان فيه زراير — stability وstyle — وكنت بظبط الأداء بإني ألفّها. v3 وv4 بيتجاهلوا زرار الـ style خالص، وبياخدوا بدله audio tags مكتوبة جوه الـ script: [warmly]، [softly]، [whispers]، وكمان <break time="0.5s" /> للوقفات.

🏷️
Tags مش زراير التعبير بيتكتب في الـ script. الإعدادات اللي كانت شغالة على v2 مبتعملش حاجة على v4 ومن غير أي تنبيه
✅
وصفة واحدة، 106 مقطع Stability 0.5 وsimilarity 0.8 مع الـ tags — كتابين بلغتين، من أول محاولة، ومن غير ما أعيد قص أي حاجة
🌍
85 لغة حكي بالعربي وفيه أصوات كتير تختار منها، وده لسه مهم جدًا لمشاريعي
🎲
النتيجة مش بتتكرر نفس الـ seed ونفس النص إدّوا صوت مختلف مرتين. احتفظ بالملف اللي عجبك — مش هتقدر تولّده تاني

مفاجأة حلوة: على حسابي، v4 استهلك تقريبًا عُشر الـ quota اللي كان طول الـ script بيوحي بيها — حوالي 740 credit لكتاب فيه 80 مقطع و4,700 حرف — والـ tags والـ breaks باين إنها مش بتتحسب أصلًا. خطتك ممكن تبقى مختلفة، فقِس الأول قبل ما تحسب ميزانيتك.

الأصوات المحلية جوه H_AI: Voicebox

في فبراير قلت إن الخطوة الجاية هي إني أدمج الصوت في محرك الـ AI بتاعي. وده حصل، عن طريق Voicebox، وهو استوديو صوت محلي مفتوح المصدر بيشتغل على Apple Silicon من خلال MLX. H_AI بيكلّمه عن طريق local API في الاتجاهين: speech‑to‑text (Whisper) لما أسجّل سؤال على موبايلي، وtext‑to‑speech لما أطلب إن الإجابة تتقرا بصوت عالي.

المحرك النوع اللغات أنسب لـ
Kokoro 54 صوت جاهز 8، منها الإنجليزي drafts وتجربة أصوات بسرعة — model حجمه 327 MB
Qwen Custom Voice 9 أصوات جاهزة 10 توجيهات الأداء بتتكتب بكلام عادي
Qwen, LuxTTS استنساخ صوت 10 / إنجليزي صوت من تسجيل مرجعي قصير
Chatterbox استنساخ صوت 23، منها العربي العربي — بصوت مرجعي
TADA 3B استنساخ صوت 10، منها العربي استنساخ متعدد اللغات، وهو الأتقل بحجم 8 GB
Fish S2-Pro (جديد) استنساخ صوت + tags جوه النص لغات كتير صوتي أنا — وبقى الـ default في H_AI

المشكلة في مشاريعي هي العربي. ولا محرك محلي جاي بصوت عربي جاهز؛ محركات الاستنساخ بس هي اللي بتتكلم عربي، فالسرد بالعربي محتاج تسجيل نضيف مدته من 15 لـ 30 ثانية أستنسخ منه — ويفضّل يكون لحد بيتكلم عربي. في الـ cloud بختار صوت عربي وخلاص.

صوتي أنا، محليًا: Fish S2-Pro

رسمة: سماعات على كتاب حواديت مفتوح فوق لحاف، ونور سهّاري وهلال في الشباك

استنساخ صوتي كان أول حاجة في قايمة «الخطوة الجاية»، فعملت مسابقة. خدت أحدث الـ models المفتوحة المصدر وأكترها إعجابًا على Hugging Face، وإدّيت كل واحد نفس التسجيل القصير لصوتي. وكل واحد قرا نفس كتاب النوم صفحة صفحة، وعدّيت كل صفحة تاني على speech‑to‑text عشان أعدّ الكلمات اللي غلط فيها.

الـ model أخطاء الكلمات بيمشي على الـ [tags] الترخيص
Fish S2-Pro 0.0% آه غير تجاري
VoxCPM2 2.9% لأ Apache 2.0
Fish Drama-3 3.4% آه غير تجاري
OmniVoice 3.4% لأ —
ElevenLabs Eleven v4 (cloud) 4.1% آه مدفوع
Qwen3-TTS 4.3% لأ Apache 2.0
Chatterbox 4.9% لأ MIT

المفاجأة في نص الجدول: كل الـ models المحلية قرت الكلمات بدقة ElevenLabs. الدقة مبقتش هي اللي بتفرق بينهم. اللي بيفرق هو هل الصوت شبهي، وهل يقدر يمشي على توجيهات الأداء. وFish S2-Pro كسب في الاتنين. وهو كمان واحد من اتنين بس من الـ models اللي بيفهموا الـ tags الموجودة أصلًا في الـ scripts بتاعتي. سطر مكتوب كده [whispers] Goodnight, Yusuf. لـ ElevenLabs بيتقال همس محليًا كمان، فبقى script واحد شغال في الناحيتين من غير ما أشيل منه حاجة.

فيه حاجتين لازم أقولهم بصراحة. الترخيص غير تجاري، وده مفيهوش مشكلة لموقعي ولكتب ابني، بس كان هيمنعه في أي product. والنسخة الأولى من الاستنساخ اتعلّمت من حوالي 19 ثانية من سرد ElevenLabs بتاعي، مش من تسجيل جديد — نسخة من نسخة. تسجيل نضيف بصوتي هو التحسين الجاي.

وعشان يبقى استخدام يومي، ضفت Fish S2-Pro لـ Voicebox كمحرك جديد، وخليت صوتي المستنسخ هو الـ default في H_AI. لما أطلب إن إجابة تتقرا بصوت عالي، دلوقتي بترجع بصوتي، متولّدة على الـ Mac Studio.

العربي المصري محليًا: لسه

كل كتاب من كتب النوم ليه نسخة بالعربي المصري، فعملت نفس التجربة بالمصري. نصين: النسخة المصرية من بسم الله، اللي ElevenLabs بيحكيها أصلًا، وقصة جديدة من 6 صفحات كتبتها مخصوص للتجربة. الـ models العامة بتقول إنها بتدعم العربي بس مش المصري، فضفت الـ models المفتوحة المتظبطة على المصري اللي لقيتها: VoiceTut (OmniVoice متدرّب على حوالي 380 ساعة كلام مصري)، وNileTTS وEGTTS (الاتنين مبنيين على XTTS-v2)، وHabibi. وكل الـ models اللي بتستنسخ قلّدت نفس الصوت المرجعي المصري القصير؛ وVoiceTut فيه كمان أصوات مصرية جاهزة.

الـ model بسم الله (مصري) القصة الجديدة الترخيص
ElevenLabs Eleven v4 (cloud) 16.2% — مدفوع
XTTS-v2 15.0% 27.5% غير تجاري
OmniVoice 16.1% 28.1% —
VoiceTut، صوت «⁦Hossam⁩» 17.1% 29.8% Apache 2.0
Fish S2-Pro 18.6% 26.5% غير تجاري
NileTTS 19.1% 56.5% Apache 2.0
VoiceTut، صوت «⁦Omar⁩» 19.9% 24.7% Apache 2.0
Qwen3-TTS 21.4% 27.0% Apache 2.0
Habibi (مصري) 22.8% 26.9% Apache 2.0
EGTTS 38.4% 34.4% غير تجاري

الجدول ده يتقري غير الجدول الإنجليزي. هنا الـ speech‑to‑text نفسه جزء من المشكلة: Whisper بيسمع المصري غلط لوحده، فحتى سرد ElevenLabs اللي في الكتاب جاب 16%. ومعظم الـ models المحلية وقعت في نفس المدى من 15 لـ 30%، جوه الدوشة دي، فالأرقام متقدرش ترتّبهم. وأوضح دليل هو Qwen3-TTS: مش بيدعم العربي أصلًا، ومع ذلك جاب نتيجة في نفس المدى.

اللي الأرقام تقدر تورّيه هو الصوت اللي بيبوظ. NileTTS اتنقل من 19% في نص لـ 56% في التاني، وHabibi وقع خالص لما استنسخ تسجيلي الإنجليزي بدل تسجيل مصري (74% و82%). يعني الأرقام بتقولّي أرمي أنهي مقاطع، مش أحتفظ بأنهي صوت. لسه ما حكمتش على الأصوات المصرية بودني؛ ولحد ما أعمل كده، السرد العربي عندي هيفضل مع ElevenLabs.

script واحد، backend اتنين

أحدث حتة هي أداة batch للتعليق الصوتي جوه H_AI. بتاخد نفس ملف الـ script اللي بستخدمه مع ElevenLabs — entry لكل صفحة — وبتولّد كل صفحة محليًا عن طريق Voicebox، بنفس أسماء الملفات. مشغّل القصص اللي بيشغّل audio/en/p1.mp3 مش فارق معاه مين عمله.

معظم المحركات المحلية عمرها ما سمعت عن [warmly] وهتقراها بصوت عالي، فمعاهم الأداة بتشيل الـ tags، وتقسم الـ script عند كل <break>، وتولّد كل حتة، وبعدين تلصقهم تاني بصمت حقيقي بالمدة المطلوبة. زي ما بتقول ملاحظات الأداة: الإيقاع بيعدّي في النقلة، والإحساس لأ. مع Fish S2-Pro الـ tags تقدر تفضل في الـ script: بيقراها كتوجيهات، فالـ breaks بس هي اللي بتبقى صمت، والإحساس بيعدّي كمان.

بعد كل batch بتفحص النتايج بنفس طريقة الـ pipeline بتاع ElevenLabs عندي — وبتعلّم المقاطع اللي صامتة أو قصيرة قوي أو ممطوطة. الممطوط هو الفكرة الشاطرة: الكلام المتلخبط بيطلع برضه ملف سليم 100% وبيتفتح عادي، بس بياخد وقت أطول بكتير لكل حرف من المقاطع اللي جنبه، فبيبان إنه outlier.

اعمل الـ drafts وجرّب وعدّل محليًا ببلاش، وبعدين اصرف credits الـ cloud على النسخة النهائية. نفس الـ script، وأمر واحد تبدّل بيه.

دروس من حواديت النوم

الـ text‑to‑speech بيبوظ مع كلمات الأصوات لوحدها. أول محاولة لأصوات الحيوانات، إدّيت للـ model نصوص زي Mooooooo والـ expressiveness عالي، والصوت طلع مهزوز. الكلام اللي ملوش معنى مش بيدّي الـ model أي سياق. لما حطيت كل واحدة جوه جملة قصيرة — «⁦the cow says moo⁩» — ونزّلت الـ expressiveness، المشكلة اتحلت خالص.

اكتب للودن. الأرقام تتكتب حروف، من غير اختصارات، والجمل أقل من 200 حرف تقريبًا، وفكرة واحدة في الصفحة. كل script بيعدّي على linter صغير قبل ما أي صوت يتولّد.

راجع الكلمات، مش الملف بس. لما عملت النسخ المحلية لصفحات سوسو للمقال ده، عدّيت كل مقطع تاني على speech‑to‑text عشان أتأكد إنه قال اللي في الـ script. صفحة تصبح على خير رجعت كلمة بكلمة من الأصوات التلاتة — وعشان كده هي المثال اللي فوق. والـ pipeline الجديد بيعمل الفحص ده لوحده، جملة جملة: لو الـ speech‑to‑text سمع كلام غلط، أو الإيقاع مش مظبوط، الجملة بتتولّد تاني، لحد 4 مرات، وبيفضل أحسن take.

الـ podcast، زمان ودلوقتي

من هنا بدأ المشروع. في فبراير كتبت script podcast مدته خمس دقايق عن مشروع محرك الـ AI الشخصي وولّدته مرتين — مرة محليًا بـ VibeVoice، ومرة بـ ElevenLabs بـ clone من صوتي. في أكتوبر مرّرت نفس الـ script بالظبط، كلمة بكلمة، على المحركين المحليين الجداد، عشان تقدر تقارن الأربعة ببعض على طول.

فبراير 2026

النسخة 1: VibeVoice (محلي)

اتولّدت على Mac Studio M4 Max — VibeVoice 7B — offline خالص وببلاش

النسخة 2: ElevenLabs (Cloud)

اتولّدت عن طريق ElevenLabs API — صوت مستنسخ — خدمة cloud مدفوعة

أكتوبر 2026 — المحركات المحلية الجديدة

النسخة 3: Kokoro عن طريق Voicebox (محلي)

Mac Studio — صوت جاهز «⁦George⁩» — الحلقة كلها اتولّدت في 26 ثانية — 5:10

النسخة 4: Qwen Custom Voice عن طريق Voicebox (محلي)

Mac Studio — صوت جاهز «⁦Ryan⁩» — اتولّدت في حوالي 9 دقايق — 5:34

النسخة بتشتغل المدة وقت التوليد
VibeVoice 7B محلي 4:31 كام دقيقة
Kokoro محلي 5:10 26 ثانية
ElevenLabs (صوتي) Cloud 5:24 —
Qwen Custom Voice محلي 5:34 حوالي 9 دقايق

النسخ الجديدة اتعملت بأداة الـ batch للتعليق الصوتي اللي اتكلمت عنها فوق: الـ script دخل عشر فقرات، وكل فقرة اتولّدت لوحدها، والحتت اتوصّلت بوقفة قصيرة بينها. Kokoro هو المفاجأة — حلقة مدتها خمس دقايق في وقت أقل من اللي بياخده سماع الفقرة الأولى. لما عدّيت كل فقرة تاني على speech‑to‑text، النسختين الجداد طابقوا الـ script بنسبة حوالي 98% كلمة بكلمة؛ وتقريبًا كل الفروق كانت في الإملا («⁦Fast API⁩» بدل FastAPI)، مش غلط في القراية.

حاجة تحطها في بالك وإنت بتسمع: الـ script من فبراير، فهو بيوصف المشروع زي ما كان وقتها — DeepSeek وLlama و22 skill. وسبته زي ما هو وأنا قاصد، عشان كل النسخ تقرا نفس الكلمات.

إيه هو VibeVoice؟

VibeVoice هو model TTS من الأحدث في الحوارات الطويلة، Microsoft هي اللي عملته في الأول ودلوقتي مجتمع الـ open source هو اللي ماسكه. بيطلّع من نص عادي صوت فيه إحساس ولأكتر من متكلم — زي حوارات الـ podcast والسرد، وحتى محتوى فيه موسيقى في الخلفية بيألّفها لوحده حسب السياق. ولسه هو اللي برجعله لما الـ script يبقى فيه أكتر من متكلم.

الجديد فيه هو الـ architecture: continuous speech tokenizers بتشتغل على 7.5 Hz مع next‑token diffusion framework. الـ LLM بيمسك سياق النص، والـ diffusion head بيطلّع التفاصيل الصوتية. والنتيجة كلام طبيعي، بإيقاع ونغمة مظبوطين، وصوت كل متكلم ثابت.

الـ model أقصى مدة المتكلمين أنسب لـ
VibeVoice 0.5B Real‑time 1 TTS live بـ latency قليلة
VibeVoice 1.5B ~90 دقيقة لحد 4 podcast طويل
VibeVoice 7B ~45 دقيقة لحد 4 أكتر صوت واقعي

تشغيله محليًا

بـ 64 GB unified memory على الـ M4 Max، أقدر أشغّل الـ 7B model براحتي — أكبر اختيار وأكتره واقعية. اعمل clone للـ الـ repo بتاع VibeVoice، وثبّت الـ dependencies بـ uv pip install -e .، ونزّل الـ weights بتاعة الـ model، وشغّل الـ inference من ملف نصي فيه أسماء المتكلمين زي Speaker 1: Hello, welcome to the show.

التوليد بياخد كام دقيقة لحلقة podcast كاملة. مش real time، بس مقبول جدًا لو بتعمل محتوى. وكل ده بيحصل على جهازي — مفيش data بتطلع من شبكتي، ولا API calls، ولا رسوم بالدقيقة.

Speaker 1: Welcome to The Build Log, where we break down real engineering projects from the ground up. Today, we're looking at something really cool. A developer named Hisham got fed up with cloud AI services, the latency, the costs, the privacy headaches, and decided to build his own personal AI engine that runs entirely on local hardware. Let's dive in.

[ الـ script الكامل بيكمّل في حوالي 19 فقرة عن الـ hardware، والـ webapp، ونظام الـ skills، والأمان، والـ roadmap ]

محلي ولا cloud، بعد تمن شهور

بستخدم ElevenLabs لأي حاجة بتتنشر — السرد بلغتين في موقع الأطفال الإسلامي، وpodcast Wireless 101، وكتب النوم. والمحلي بيغطي كل اللي قبل كده. ودي المقارنة بصراحة دلوقتي:

محلي (Voicebox وVibeVoice وFish S2-Pro)

  • ببلاش ومن غير حدود — مثالي للـ drafts وتجربة الأصوات
  • خصوصية كاملة — مفيش حاجة بتطلع من الجهاز
  • Kokoro بيولّد صفحة في ثواني
  • podcast بأكتر من متحدث مع VibeVoice
  • متركّب جوه H_AI للصوت الداخل والطالع
  • صوتي أنا، مستنسخ محليًا، ومعاه audio tags
  • معظم المحركات بتتجاهل الـ audio tags — Fish S2-Pro هو الاستثنا
  • العربي عن طريق استنساخ الصوت بس
  • بيقرا أبطأ من ElevenLabs — صوتي المستنسخ بحوالي 20%
  • أحسن استنساخ ترخيصه غير تجاري بس

ElevenLabs Eleven v4 (Cloud)

  • أحسن جودة، والصوت المستنسخ شبهي
  • Audio tags للهمس والدفا والوقفات
  • 85 لغة، مع أصوات عربي جاهزة
  • وصفة واحدة نفعت في كتابين كاملين
  • بياخد credits — بس أقل من المتوقع
  • النص بيتبعت لطرف تالت
  • نفس الـ seed مش بيطلّع نفس الصوت
  • بيعتمد على اتصال بالإنترنت
المسافة بين الـ TTS المحلي والـ cloud بتقل باستمرار. المحلي دلوقتي كويس كفاية إني أعمل مسودة كتاب كامل ببلاش — ولأول مرة، بصوتي أنا. والـ cloud لسه بيستاهل مكانه في النسخة النهائية، وفي العربي.

الخطوة الجاية

في فبراير كانت الخطوة الجاية هي إدخال الصوت. وده خلص — أقدر أسجّل سؤال على موبايلي وH_AI يحوّله لنص محليًا. والجاي دلوقتي:

استنساخ صوتي محليًا خلص. اللي فاضل: تسجيل نضيف أستنسخ منه، بدل سرد ElevenLabs بتاعي. سرد بالعربي محليًا — تجربة المصري اللي فوق ضيّقت الاختيار لكام model، منهم VoiceTut، بس الـ speech‑to‑text مش هيقدر يختار الكسبان، ولسه ما حكمتش عليهم بودني، فالعربي هيفضل في الـ cloud دلوقتي. وكتب نوم أكتر — السلسلة بتكبر مع ابني، وكل كتاب جديد فرصة تانية أشوف بيها الأصوات المحلية وصلت لفين.

الأدوات موجودة. والـ hardware يقدر. ومجتمع الـ open source ماشي بالـ models لقدام. إنك تشغّل pipeline صوت AI بتاعك مبقاش مشروع بحثي — بقى مشروع ويك إند.

المقال ده اتكتب بمساعدة Claude Code.