Vocalizer؛ تبدیل متن به گفتار، کاملاً روی سرور خودت با PHP
خلاصهٔ کاملتر
پل ردموند تو لاراولنیوز سراغ Vocalizer رفته؛ اکستنشن نیتیو PHP نوشتهٔ اکرم زرارقه که تبدیل متن به گفتار رو کاملاً روی همون سروری اجرا میکنه که کدت اونجاست — بدون فراخوانی سرویس ابری و بدون وابستگی رانتایم. دو بکاند استنتاج رو داخل خودش جا داده، sherpa-onnx (روی ONNX Runtime) و audio.cpp (روی ggml)، و بهصورت باینری .so از پیش ساختهشده میرسه دستت.
نقطهٔ قوت اصلیش یکیبودن APIـه: Engine::load() رو به یه پوشهٔ مدل میگیری و خودش از محتویاتش میفهمه کدوم بکاند رو باید بالا بیاره. هشت خانوادهٔ مدل پشتیبانی میشن — Chatterbox، Supertonic، Piper/VITS، Pocket، Kokoro، Kitten، Matcha و ZipVoice — و سنتز فقط یه فراخوانی speak() ـه:
use Vocalizer\Engine;
$engine = Engine::load('/opt/voices/sherpa-onnx-supertonic-3-tts-int8-2026-05-11');
$res = $engine->speak('Votre commande est prête.', [
'lang' => 'fr',
'voice' => 0,
]);
$res->save('/var/www/audio/notice.wav');انتخاب مدل بستگی به اولویتت داره: Chatterbox بهترین واقعگرایی و کلون صدا رو میده ولی روی CPU کنده (حدود بیست برابر زمان واقعی)، Supertonic 3 برای سیویک زبان و در حد بیدرنگ کار میکنه، Pocket TTS سبک و سریعه و Piper/VITS از همه سریعتره با یه مدل بهازای هر زبان.
کلون صدا کار Chatterboxه: با یه مدل حدوداً ۷.۵ گیگی، از روی یه فایل WAV مرجع سه تا ده ثانیهای صدا رو تو بیستوسه زبان تقلید میکنه. چون مدلهای اتورگرسیو ممکنه بخشی از متن رو جا بندازن، لوپ بزنن یا سکوت تولید کنن، Vocalizer یه نگهبان ضدتوهم داره: خروجی رو با طول متن و انرژی سیگنال میسنجه و اگه مشکوک بود با seed تازه دوباره سنتز میکنه — پیشفرض دو تلاش اضافه، قابل تنظیم با verify_retries. اگه همه شکست بخورن یه Vocalizer\Exception پرتاب میشه، نه صوت خراب.
بخش هوشمندانهٔ دیگه ایزولهسازی کرشه. یه segfault داخل اکستنشن نیتیو معمولاً ورکر PHP-FPM رو هم با خودش میبره؛ حالت پیشفرض fork سنتز رو تو یه پروسهٔ فرزند اجرا میکنه، پس کرش گرفته میشه، تا سقف vocalizer.max_retries دوباره تلاش میشه و مدل از نو لود میشه. استثناش خود Chatterboxه که چون thread pool ggml امن نیست همیشه مستقیم اجرا میشه.
برای متنهای بلند هم speakAsync() هست که سنتز رو از مسیر ریکوئست بیرون میبره و یه job برمیگردونه که میتونی روش wait() بزنی. رفتار کلی از طریق دایرکتیوهای php.ini تنظیم میشه: vocalizer.isolation، vocalizer.timeout_ms، vocalizer.max_models برای کش مدل هر ورکر و vocalizer.max_concurrency برای استخر async. یه هشدار عملی هم هست: رم مدل بهازای هر ورکر FPM مصرف میشه و Chatterbox بهتنهایی چند گیگ میخواد.
محدودیتها رو هم صریح گفته: لینوکس x86-64 با glibc نسخهٔ ۲.۲۸ به بالا و PHP 8.4 یا 8.5 نسخهٔ NTS؛ ساختهای Alpine/musl و ARM و ZTS پشتیبانی نمیشن. خود اکستنشن حدود ۴۴ مگابایته، با لایسنس MIT منتشر شده و وابستگیهاش رو استاتیک لینک کرده. مدلها هم جدا با اسکریپت همراه دانلود میشن.
نکات کلیدی:
- اکستنشن نیتیو PHP برای TTS محلی، بدون فراخوانی API و بدون وابستگی رانتایم
- دو موتور داخلی sherpa-onnx و audio.cpp؛ باینری از پیش ساختهشده، بدون نیاز به کامپایل
- هشت خانوادهٔ مدل با یه API واحد؛ تشخیص خودکار بکاند از روی پوشهٔ مدل
- کلون صدا با Chatterbox از نمونهٔ سه تا ده ثانیهای در بیستوسه زبان
- نگهبان ضدتوهم، حالت fork برای ایزولهکردن کرش، کش مدل و سنتز غیرهمزمان با speakAsync()
- نیازمندی: لینوکس x86-64 و PHP 8.4/8.5 NTS؛ لایسنس MIT




