خادم MCP لتحويل النص إلى كلام: تحويل محلي للنص إلى صوت من أجل Claude باستخدام Kokoro
ابنِ خادم MCP لتحويل النص إلى كلام يمنح Claude صوتًا خاصًا يعمل على حاسوبك. تعرّف على آلية عمل نموذج Kokoro ذي 82 مليون معامل، واحصل على خادم Python من 60 سطرًا، واربطه مع Claude Desktop وClaude Code، وقارنه بالأصوات المستضافة.
يستطيع Claude كتابة مسودة مقال من 2000 كلمة في أقل من دقيقة، ثم تقضي عشر دقائق في تدقيق النظر إليها. يسدّ خادم MCP لتحويل النص إلى كلام هذه الفجوة. يستدعي Claude أداة، فيحوّل نموذج صوتي صغير على جهازك النص إلى صوت، ويُشغَّل الناتج عبر مكبرات الصوت قبل أن يبرد فنجان قهوتك.
Kokoro هو النموذج الذي يجعل هذا عمليًا. يضم 82 مليون معامل فقط، ويُوزَّع بموجب ترخيص Apache 2.0، ويُنتج كلامًا بتردد 24 كيلوهرتز يصمد أمام أنظمة أكبر بكثير. لا توجد فاتورة API، ولا رفع لمسوداتك إلى طرف ثالث، ولا حد لمعدل الاستخدام. يُظهر هذا المقال كيف تترابط الأجزاء، ويقدّم لك خادم Python يعمل في نحو 60 سطرًا، ويربطه بـ Claude Desktop وClaude Code، ثم ينظر بصراحة إلى الحالات التي يكون فيها الصوت المستضاف هو الخيار الأفضل.
لماذا تشغّل تحويل النص إلى كلام محليًا
تبدو الأصوات السحابية رائعة، لكنها تأتي بشروط. كل طلب يغادر جهازك، وكل حرف يُحتسب عليك، وكل عطل في الخدمة يصبح عطلًا لديك أنت. يقلب الخادم المحلي كل هذه النقاط.
الخصوصية دون جهد إضافي
عندما يقرأ Claude بصوت عالٍ مسودة عقد، أو مدخل يومياتك الخاصة، أو مواصفات منتج لم يُطلق بعد، يمر النص عبر خادم MCP الخاص بك ولا يمر عبر غيره. يشغّل Kokoro النموذج على معالج CPU أو GPU لديك، ويكتب ملف WAV على القرص، ويتوقف المسار عند هذا الحد. تحفّظ صادق واحد: لا يزال Claude نفسه يتلقى كل ما تكتبه، لذا فإن كلمة "محلي" تصف خطوة الصوت وليس المحادثة كلها.
التكلفة والعمل دون اتصال
تفرض واجهات API الصوتية المستضافة عادةً رسومًا لكل حرف أو لكل دقيقة. وهذا مقبول لمقدمة بودكاست، لكنه مرهق لوكيل يقرأ كل إجابة بصوت طوال اليوم. بعد تنزيل أوزان Kokoro، تكلّف الجملة الإضافية بضع ثوانٍ من الكهرباء فقط. المستندات الطويلة، وإعادة التسجيل المتكررة، وتجربة أصوات مختلفة، كلها تكلّف الشيء نفسه: لا شيء.
يحمّل التشغيل الأول النموذج من Hugging Face. بعد ذلك يعمل الخادم في الطائرة، أو في قبو، أو خلف جدار حماية لشركة. يعتمد زمن الاستجابة على عتادك لا على رحلة ذهابًا وإيابًا عبر الشبكة، لذا يبقى السلوك ثابتًا عند الثالثة فجرًا والثالثة عصرًا.
ما هو Kokoro فعليًا
الحجم والترخيص والتدريب
Kokoro-82M نموذج تحويل نص إلى كلام بأوزان مفتوحة، مبني على بنية StyleTTS 2 مع مُولّد صوتي ISTFTNet. صدر الإصدار 1.0 في 27 يناير 2025، بعد إصدار سابق في 25 ديسمبر 2024. دُرِّب المؤلفون على بضع مئات من ساعات الصوت المرخّص بشروط تساهلية والصوت الاصطناعي، ولهذا يتناسب ترخيص Apache 2.0 بسهولة مع المشاريع التجارية.
المواصفة
القيمة
المعاملات
82 مليون
الترخيص
Apache 2.0
معدل العينات الخارجة
24 كيلوهرتز
البنية
StyleTTS 2 مع مُشفّر ISTFTNet الصوتي
الأصوات في الإصدار 1.0
54
اللغات في الإصدار 1.0
8
اعتماد النظام
espeak-ng
💡 الصغر لا يعني الضعف. حجم Kokoro هو ما يتيح له العمل على حاسوب محمول. في السرد العادي للنثر الإنجليزي يصعب تمييزه عن كثير من الأصوات المدفوعة عند الاستماع العابر. تظهر الفجوة في التعبير عند الطلب، مثل الهمس أو الضحك، حيث تتقدم النماذج المستضافة الأكبر حجمًا.
اللغات ورموز الأصوات
تتبع أسماء الأصوات نمطًا: الحرف الأول يمثّل اللغة أو اللهجة، والحرف الثاني يمثّل الجنس. تمثّل af_heart صوتًا أنثويًا بالإنجليزية الأمريكية، وbm_george صوتًا ذكريًا بالإنجليزية البريطانية. يحتاج المسار أيضًا إلى lang_code مطابق لكي يُحوَّل النص إلى الفونيمات بشكل صحيح.
الرمز
اللغة
أمثلة على الأصوات
a
الإنجليزية الأمريكية
af_heart، am_michael
b
الإنجليزية البريطانية
bf_emma، bm_george
e
الإسبانية
ef_dora
f
الفرنسية
ff_siwis
h
الهندية
hf_alpha
i
الإيطالية
if_sara
j
اليابانية
jf_alpha
p
البرتغالية البرازيلية
pf_dora
z
الصينية الماندرينية
zf_xiaobei
تُحتسب الإنجليزية الأمريكية والبريطانية لغةً واحدة ضمن رقم "8 لغات". وتسحب اليابانية والماندرينية حزمًا إضافية من عائلة misaki، لذا اقرأ ملف README الخاص بالمشروع قبل تفعيلهما.
كيف يعمل خادم MCP
الأجزاء المتحركة الثلاثة
يتكون الإعداد من ثلاثة أجزاء فقط، ولكل جزء مهمة محددة:
العميل. يتحدث Claude Desktop أو Claude Code بروتوكول Model Context Protocol ويقرر متى تستحق أداة ما الاستدعاء.
الخادم. عملية Python صغيرة يشغّلها العميل عبر stdio. يعرض عددًا قليلًا من الأدوات ولا شيء غيرها.
Kokoro. يُحمَّل مرة واحدة في الذاكرة داخل تلك العملية، فتتجاوز الاستدعاءات اللاحقة بطء البدء.
التدفق قصير. يقرر Claude استدعاء speak، ويرسل النص مع اسم الصوت، فيولّد الخادم الصوت ويشغّله، ويعيد مسار الملف كنص عادي كي يخبرك Claude بمكان حفظ التسجيل.
خوادم جاهزة تستحق التجربة
لست مضطرًا لكتابة كل شيء بنفسك. تغلّف عدة مشاريع مجتمعية Kokoro لبروتوكول MCP:
يقدم kristofferv98/MCP_tts_server أكثر من محرك لتحويل النص إلى كلام، من بينها Kokoro، مع تشغيل متدفق.
يشغّل kokoro-tts-mcp من scottschram نموذج Kokoro-82M مع تسريع MLX على معالجات Apple Silicon.
يمثل koroko-speech-mcp من hammeiam خادمًا صوتيًا مدمجًا مبنيًا حول Kokoro.
الخوادم الجاهزة توفّر عليك فترة بعد الظهر كاملة. أما كتابة خادمك الخاص، كما في الأسفل، فتستغرق نحو ساعة وتمنحك تحكمًا كاملًا في تنظيف النص، وإعدادات الأصوات الافتراضية، والمكان الذي تُحفظ فيه الملفات.
ابنِ الخادم خطوة بخطوة
تثبيت المتطلبات
استخدم بيئة افتراضية حتى تبقى حزم PyTorch بعيدة عن Python الخاص بالنظام. الخيار الآمن هو Python 3.10 أو 3.11 أو 3.12.
يحتاج Kokoro أيضًا إلى محلّل الفونيمات espeak-ng على نظامك:
macOS: brew install espeak-ng
Debian أو Ubuntu: sudo apt-get install espeak-ng
Windows: ثبّت حزمة إصدار espeak-ng، ثم افتح طرفية جديدة
كتابة ملف الخادم
احفظ هذا الملف باسم kokoro_server.py. يعرض أداتين، ويحمّل مسار الإنجليزية عند بدء التشغيل، ويزيل تنسيق markdown من النص، ويشغّل الصوت دون أن يحجب Claude.
import os
import re
import time
from pathlib import Path
import numpy as np
import sounddevice as sd
import soundfile as sf
from kokoro import KPipeline
from mcp.server.fastmcp import FastMCP
SAMPLE_RATE = 24000
OUT_DIR = Path(os.environ.get("KOKORO_OUT", Path.home() / "kokoro_audio"))
OUT_DIR.mkdir(parents=True, exist_ok=True)
mcp = FastMCP("kokoro-tts")
pipelines = {}
def get_pipeline(lang_code: str) -> KPipeline:
if lang_code not in pipelines:
pipelines[lang_code] = KPipeline(lang_code=lang_code)
return pipelines[lang_code]
def clean_text(text: str) -> str:
text = re.sub(r"`{3}.*?`{3}", " code block omitted. ", text, flags=re.S)
text = re.sub(r"https?://\S+", "link", text)
text = re.sub(r"[#*_`>]+", "", text)
return re.sub(r"[ \t]+", " ", text).strip()
@mcp.tool()
def speak(text: str, voice: str = "af_heart", speed: float = 1.0,
lang_code: str = "a", play: bool = True) -> str:
"""Read text aloud with Kokoro. Returns the path of the saved WAV file."""
pipeline = get_pipeline(lang_code)
parts = []
for _, _, audio in pipeline(clean_text(text), voice=voice, speed=speed):
if audio is not None:
parts.append(audio.detach().cpu().numpy())
if not parts:
return "No audio was produced. Check the text and the voice name."
wave = np.concatenate(parts)
path = OUT_DIR / f"speech_{time.strftime('%Y%m%d_%H%M%S')}.wav"
sf.write(path, wave, SAMPLE_RATE)
if play:
sd.play(wave, SAMPLE_RATE)
return f"Saved {len(wave) / SAMPLE_RATE:.1f}s of audio to {path}"
@mcp.tool()
def list_voices() -> str:
"""List a few Kokoro voices and the lang_code each one needs."""
return (
"a: af_heart, af_bella, am_michael | b: bf_emma, bm_george | "
"e: ef_dora | f: ff_siwis | j: jf_alpha"
)
if __name__ == "__main__":
get_pipeline("a")
mcp.run()
ثلاثة خيارات تصميمية مهمة هنا. تُخزَّن المسارات مؤقتًا لكل لغة، فالتبديل بين الإنجليزية والإسبانية لا يعيد تحميل أي شيء مرتين. يستخدم التشغيل sd.play، الذي يعود فورًا، فلا ينتظر Claude انتهاء الصوت أبدًا. ولا يستدعي الملف print إطلاقًا، لأن stdout في خادم stdio ملك للبروتوكول. أي طباعة عشوائية تُفسد تدفق الرسائل.
تسجيله في Claude
في Claude Desktop، افتح claude_desktop_config.json. على macOS يقع في ~/Library/Application Support/Claude/، وعلى Windows في %APPDATA%\Claude\. وجّه الأمر إلى المفسّر داخل بيئتك الافتراضية، لا إلى python مجرد.
claude mcp add kokoro-tts -- /absolute/path/to/.venv/bin/python /absolute/path/to/kokoro_server.py
أعد تشغيل العميل، ثم اختبره بجملة بسيطة: "استخدم أداة speak لتقول مرحبًا بصوت bm_george." إن سمعت رجلًا بريطانيًا يحييك، فالسلسلة كلها تعمل.
اجعل Claude يتحدث بطبيعية
اكتب للأذن
النص الذي يبدو جيدًا على الشاشة يبدو غالبًا ثقيلًا عند قراءته بصوت عالٍ. أعطِ Claude تعليمة دائمة كي يكتب للاستماع منذ المسودة الأولى:
عندما أطلب منك قراءة شيء بصوت عالٍ، استدعِ أداة speak. اكتب للأذن: جمل قصيرة، دون رموز نقطية، دون روابط، واكتب الأرقام أو الاختصارات كلمات كاملة عندما يصعب نطقها.
تمثل الدالة clean_text في الخادم شبكة الأمان لديك، لكنها لا تستطيع إنقاذ جملة تفتقر إلى وقفات طبيعية. تحسّن بعض العادات المخرجات فورًا:
قسّم المقاطع الطويلة إلى فقرات. يقطع المسار النص عند فواصل الأسطر افتراضيًا، وهذا يبقي كل جزء قصيرًا ويحافظ على إيقاع ثابت.
أعد كتابة الأسماء الصعبة صوتيًا. إذا خرج اسم علامة تجارية بشكل خاطئ، فاكتبه كما يُنطق.
أبقِ السرعة بين 0.9 و1.1. خارج هذا النطاق يبدو الكلام مستعجلًا أو بطيئًا.
أين تفيد الأداة الصوتية دون استخدام اليدين
تكسب أداة الصوت مكانها في اللحظات التي تكون فيها عيناك أو يداك مشغولتين:
الطهي. اطلب من Claude تعديل وصفة لستة أشخاص، واقرأ الخطوات بصوت عالٍ بينما يغطي الدقيق أصابعك.
التنقل والمشي. اطلب ملخصًا منطوقًا لملاحظات أمس أو لسلسلة طويلة قبل أن تجلس.
إمكانية الوصول. يمكن للمخرجات المنطوقة أن تساعد الأشخاص ذوي ضعف البصر أو صعوبات القراءة على التعامل مع النصوص الطويلة بارتياح أكبر.
السرعة والعتاد وإصلاح الأعطال الشائعة
ما يمكن توقعه على جهازك
يعمل Kokoro على معالج CPU في حاسوب محمول عادي، وتسرّعه GPU أو معالجات Apple Silicon أكثر. بدلًا من الوثوق بقياس شخص آخر، شغّل اختبارك الخاص: أرسل فقرة من 200 كلمة وقارن زمن التصيير بزمن التشغيل. إذا انتهى التصيير أولًا، فلديك هامش للعمل في الوقت الفعلي، وستبدو الوثائق الطويلة فورية.
عادتان تبقيان التجربة سلسة. حمّل المسار عند البدء، كما يفعل الخادم أعلاه، لأن أول تركيب صوتي هو الأبطأ دائمًا. وأبقِ النموذج محمّلًا في الذاكرة: يُبقي عميل MCP عملية الخادم حيّة بين الاستدعاءات، فتظل الأوزان في الذاكرة.
💡 نصيحة: شغّل الخادم مرة من الطرفية قبل تسجيله. أي اعتماد مفقود سيظهر كخطأ Python واضح بدلًا من رسالة "فشل الخادم" الغامضة داخل العميل.
خمس مشكلات وحلولها
العرض
السبب المحتمل
الحل
يُبلغ العميل بفشل بدء الخادم
الإعداد يشير إلى Python خاطئ
استخدم المسار المطلق لمفسّر البيئة الافتراضية
يتوقف استدعاء الأداة ثم يظهر خطأ
استدعاء print كتب إلى stdout
أزل الطباعة وسجّل الأخطاء في stderr بدلًا من ذلك
خطأ في الفونيمات أو espeak
espeak-ng غير موجود في PATH
ثبّته، ثم افتح طرفية جديدة
حُفظ الملف دون صوت
مشكلة في جهاز إخراج الصوت أو PortAudio
ثبّت PortAudio على Linux، أو اختر جهازًا في sounddevice
تُنطق الأسماء بشكل غريب
محلّل الفونيمات خمّن خطأً
أعد كتابة الاسم كما يُنطق
Kokoro المحلي مقابل الأصوات المستضافة
المحلي ليس الإجابة دائمًا. Kokoro ممتاز لسرد خاص قابل للتكرار ومجاني، لكن بعض المهام تحتاج أكثر مما تقدمه 54 صوتًا.
متى تتفوق الأصوات المستضافة
اتجه إلى نموذج مستضاف عندما تحتاج إلى استنساخ الصوت، أو دعم واسع للغات، أو تحكمًا عاطفيًا دقيقًا. تضم مجموعة تحويل النص إلى كلام على Picasso IA خيارات كثيرة، وكلها على بعد نقرة واحدة:
تقسيم معقول: استخدم Kokoro للقراءة اليومية والمسودات وكل ما هو خاص، وانتقل إلى صوت مستضاف للنسخة النهائية لفيديو أو بودكاست أو عرض منتج.
الاقتران بنموذج لغوي
يتحدث الخادم فقط. وما يقوله يعتمد على النموذج الذي يكتب الكلمات. للمسودات الطويلة وإعادة الصياغة الدقيقة، يُعد Claude Sonnet 5 وClaude Opus 4.7 خيارين قويين، بينما يُبقي Claude 4.5 Haiku الإجابات المنطوقة السريعة موجزة وحيوية. طابق النموذج مع المهمة، ثم دع Kokoro يتولى الأداء الصوتي.
دورك الآن: أنشئ مع Picasso IA
صار لديك الآن صوت خاص يعمل مع Claude لا يكلّفك شيئًا لكل جملة. الخطوة التالية هي منح مشاريعك وجهًا. في اليوم نفسه الذي تنتهي فيه من هذا الخادم، يمكنك إنشاء الصور المصغّرة وصور رؤوس المقالات ولوحات المشاهد على Picasso IA لتصاحب الصوت الذي أنتجته.
جرّب Seedream 4.5 للمشاهد الواقعية كالصور الفوتوغرافية، أو Flux 2 Pro عندما تريد تفاصيل حادة وتكوينًا نظيفًا. وعندما يحتاج مشروعك إلى صوت استوديو، جرّب Speech 2.8 HD إلى جانب إعداد Kokoro المحلي، وقارن النتائج بأذنك.
افتح Picasso IA، واكتب أمرًا نصيًا واحدًا، وشاهد ما تحصل عليه. ثم جرّب أمرًا ثانيًا بزاوية كاميرا مختلفة. جرّب بحرية، فأفضل الأوامر النصية تأتي من التجربة والاستماع والتعديل.