یک جلسهی چهلدقیقهای ضبط شده و باید پیاده شود. تایپ دستیاش دو تا سه ساعت وقت میگیرد. آپلود کردنش در یک سرویس آنلاین چند دقیقه طول میکشد — ولی یعنی صدای آن جلسه روی سروری در کشوری دیگر نشسته است. زال راه سومی است: یک نرمافزار متنباز که تبدیل صوت به متن فارسی را روی کامپیوتر خودتان انجام میدهد، بدون اینکه فایل جایی برود.
پاسخ کوتاه
زال یک نرمافزار تحت وب مبتنی بر پایتون و جنگو است که فایلهای صوتی و ویدیویی فارسی را به متن تبدیل میکند. پردازش کاملاً روی همان دستگاهی انجام میشود که نرمافزار روی آن نصب است؛ اینترنت فقط یک بار برای دانلود مدل لازم است و پس از آن هیچ دادهای از سیستم شما خارج نمیشود.
زال سه موتور تشخیص گفتار دارد — Whisper، Vosk و wav2vec2 — و موتور را هنگام آپلود هر فایل خودتان انتخاب میکنید. خروجی در سه قالب متن ساده، Word و زیرنویس SRT در دسترس است.
پروژه با لایسنس MIT منتشر شده — آزاد برای هر استفادهای از جمله تجاری. کد روی گیتهاب و صفحهی رسمی پروژه روی icsd.ir/zaal است. توسعهدهنده: شرکت توسعه هوشمند فرش ایرانیان، مستقر در پارک علم و فناوری دانشگاه کاشان.
چرا تبدیل صوت به متن فارسی سختتر از انگلیسی است
مدلهای تشخیص گفتار عمدتاً روی دادهی انگلیسی آموزش دیدهاند و وقتی به فارسی میرسند، چند مشکل مشخص پیدا میکنند. شناختن این مشکلات کمک میکند بفهمید یک ابزار خوب فارسی باید چه کاری بکند.
خروجی خام، فارسیِ معیار نیست. مدل معمولاً «ي» و «ك» عربی تولید میکند، اعداد را لاتین مینویسد، گاهی اعراب میگذارد و قبل از ویرگول فاصله میاندازد. متنی که اینطور بیرون بیاید، قابل انتشار نیست و باید دستی پاکسازی شود.
سکوت و نویز، مدل را به توهم میاندازند. در بخشهای خالی فایل، مدلهای Whisper مستعد تولید جملههای ساختگی یا تکرار زنجیرهای یک عبارت هستند. این پدیده شناختهشده است و راهحلش فنی است، نه ویرایشی.
واژگان تخصصی جا میمانند. نامهای خاص، اصطلاحات صنعتی و اختصارهای سازمانی در دادهی آموزشی مدل کمتکرارند و اغلب اشتباه نوشته میشوند.
و مسئلهی پنهانتر: محرمانگی. بخش بزرگی از فایلهایی که در ایران نیاز به پیادهسازی دارند — جلسهی هیئتمدیره، مشاورهی حقوقی، مصاحبهی پژوهشی، ویزیت پزشکی — محتوایی دارند که آپلود کردنشان در یک سرویس ابری خارجی، فارغ از کیفیت آن سرویس، تصمیم درستی نیست.
سه موتور، یک رابط: انتخاب با شماست
مهمترین تفاوت زال با یک پوستهی ساده روی Whisper همینجاست. «بهترین موتور» جواب واحدی ندارد؛ به سختافزار شما، به عجلهای که دارید و به اینکه خروجی را برای چه میخواهید بستگی دارد. زال هر سه گزینه را کنار هم میگذارد و انتخاب را به لحظهی آپلود موکول میکند.
| موتور | دقت فارسی | سرعت روی CPU | حجم مدل | مناسب برای |
|---|---|---|---|---|
| Whisper (پیشفرض) | ★★★★★ | متوسط | ۵۰۰ مگابایت تا ۳ گیگابایت | بیشترین دقت، متن با علائم نگارشی |
| Vosk | ★★☆☆☆ | خیلی سریع (حدود ۵ برابر بلادرنگ) | ~۵۰ مگابایت | سختافزار ضعیف، پیشنویس سریع |
| wav2vec2 (XLSR فارسی) | ★★★★☆ | سریع | ~۱٫۳ گیگابایت | دقت خوب، ولی بدون نقطهگذاری |
موتوری که وابستگیاش نصب نباشد، در رابط کاربری غیرفعال نمایش داده میشود و راهنمای نصبش کنارش نوشته است — پس با یک نصب پایه شروع میکنید و هر موتور را وقتی لازم شد اضافه میکنید.
در عمل، این سه گزینه سه سناریوی متفاوت را پوشش میدهند. برای یک لپتاپ قدیمی که فقط میخواهید بفهمید در یک فایل دوساعته چه گفته شده، Vosk در چند دقیقه پیشنویسی میدهد که برای جستجو و مرور کافی است. برای سندی که قرار است منتشر شود، Whisper با مدل بزرگ انتخاب درست است. و wav2vec2 جایی به کار میآید که سرعت و دقت هر دو مهماند و نبود نقطه و ویرگول مشکلی ایجاد نمیکند — مثلاً وقتی خروجی قرار است ورودی یک سیستم جستجو باشد نه متن خواندنی.
بنچمارک روی فایل خودتان
بهجای اینکه بحث «کدام موتور بهتر است» را با ستاره حل کنیم، زال یک دستور بنچمارک دارد:
python manage.py benchmark path\to\sample.mp3
python manage.py benchmark sample.mp3 --engines whisper,vosk
خروجی، زمان پردازش، ضریب بلادرنگ و متن تولیدشدهی همهی موتورهای نصبشده را کنار هم میگذارد. یک فایل نمونه از کار واقعی خودتان — با همان میکروفن، همان لهجه و همان نویز پسزمینه — در چند دقیقه به شما میگوید کدام ترکیب برای شما درست است. این تنها معیار قابل اتکاست؛ هر جدول عمومی، از جمله همین جدول بالا، تقریب است.
چه چیزی تحویل میگیرید
فرمتهای ورودی
زال هم فایل صوتی میپذیرد و هم ویدیویی: mp3، m4a، mp4، wav، ogg، opus، flac، webm و فرمتهای مشابه. ویس واتساپ و تلگرام (که معمولاً ogg یا opus هستند) مستقیم قابل استفادهاند. نکتهی عملی: نیازی به نصب جداگانهی FFmpeg نیست، چون کتابخانهی PyAV که همراه پروژه میآید خودش این فرمتها را باز میکند.
سه قالب خروجی
| قالب | مناسب برای |
|---|---|
| TXT | متن پیوسته، برای کپی در هر ویرایشگر یا پردازش بعدی |
| Word (docx) | سند آمادهی ویرایش با فونت وزیر و چیدمان راستبهچپ — بدون نیاز به تنظیم دستی |
| SRT | زیرنویس زمانبندیشده برای ویدیو، بر پایهی قطعهبندی خود مدل |
هر تبدیل در پایگاه داده ذخیره میشود؛ یعنی تاریخچه دارید و لازم نیست فایلی را دو بار پردازش کنید. برای هر رکورد، موتور استفادهشده، مدت فایل، مدل، زمان پردازش و تعداد کلمات هم نگه داشته میشود. تاریخها در سراسر برنامه شمسیاند و اعداد فارسی نمایش داده میشوند.
نرمالسازی خودکار فارسی
این بخشی است که زال را از اجرای خام هر موتوری جدا میکند. متن پیش از ذخیره از یک لایهی نرمالسازی رد میشود:
| مشکل خروجی خام | اصلاح زال |
|---|---|
| ي، ك عربی | ی، ک فارسی |
| ة و ۀ | ه و هٔ |
| اعداد لاتین و عربی (۱، ٤) | اعداد فارسی یکدست |
| اعراب و کشیدهی اضافه | حذف میشوند |
| فاصله پیش از ، ؛ ؟ ! . : | حذف فاصلهی اضافه |
| فاصلههای تکراری | یک فاصله |
نتیجه این است که متن خروجی معمولاً بدون پاکسازی مکانیکی قابل استفاده است و ویرایش انسانی میتواند صرف محتوا شود، نه صرف تصحیح «ي» به «ی».
زیر کاپوت: چه چیزی موتور پیشفرض را قابل اتکا میکند
موتور پیشفرض زال روی faster-whisper بنا شده — پیادهسازی بهینهشدهی Whisper با CTranslate2 که در مقایسه با اجرای مستقیم مدل، حافظهی کمتری مصرف میکند و روی CPU عملکرد بهتری دارد. چهار تصمیم فنی مشخص هم در هسته اعمال شده است.
محاسبات int8 روی CPU. پیشفرض دستگاه، CPU با کوانتیزاسیون int8 است: سریعتر و کممصرفتر، با افت دقت ناچیز. اگر کارت گرافیک NVIDIA داشته باشید، با یک متغیر محیطی به CUDA و float16 سوییچ میکند.
فیلتر VAD. بخشهای سکوت پیش از رسیدن به مدل حذف میشوند (آستانهی پیشفرض: نیمثانیه سکوت). این کار هم زمان پردازش را کم میکند و هم جلوی همان توهمی را میگیرد که مدلها در سکوت دچارش میشوند.
خاموش کردن وابستگی به متن قبلی. پارامتر condition_on_previous_text غیرفعال است. این تنظیم جلوی حلقههای تکرار را میگیرد — همان حالتی که مدل یک جمله را ده بار پشت سر هم مینویسد.
بارگذاری یکبارهی مدل. مدل هر موتور بهصورت singleton و با قفل بارگذاری میشود؛ یعنی در طول عمر سرور فقط یک بار در حافظه مینشیند و فایلهای بعدی بلافاصله شروع میشوند.
پردازش هم در نخ جداگانه انجام میگیرد تا رابط کاربری قفل نشود، و یک قفل سراسری تضمین میکند همزمان بیش از یک تبدیل اجرا نشود — چون هر تبدیل خودش از همهی هستههای پردازنده استفاده میکند و موازیکاری سودی ندارد.
انتخاب مدل ویسپر: تعادل دقت و سرعت
اگر موتور Whisper را انتخاب کرده باشید، اندازهی مدل با متغیر ZAAL_MODEL_SIZE تعیین میشود:
| مدل | دقت فارسی | سرعت روی CPU | حجم دانلود |
|---|---|---|---|
large-v3-turbo (پیشفرض) |
عالی | خوب | ~۱٫۶ گیگابایت |
medium |
خیلی خوب | متوسط | ~۱٫۵ گیگابایت |
small |
خوب | سریع | ~۵۰۰ مگابایت |
large-v3 |
بهترین | کند | ~۳ گیگابایت |
برای بیشتر کاربردها large-v3-turbo بهترین تعادل را دارد و به همین دلیل پیشفرض است. اگر روی سختافزار ضعیف کار میکنید یا فقط میخواهید مسیر را تست کنید، با small شروع کنید.
تنظیمات دیگر — موتور پیشفرض، دستگاه پردازش، اندازهی مدل Vosk و مدل wav2vec2 — همگی با متغیرهای محیطی ZAAL_* قابل تغییرند و نیازی به دست زدن به کد نیست.
چه سختافزاری لازم است
یکی از سوالهایی که پیش از نصب باید جواب داشته باشد. زال روی طیف وسیعی از سیستمها اجرا میشود؛ آنچه باید با سختافزار متناسب باشد، انتخاب موتور و مدل است.
| سطح | پردازنده و رم | پیکربندی پیشنهادی |
|---|---|---|
| حداقل | دوهستهای، ۴ گیگ رم، ۲ گیگ فضای آزاد | موتور Vosk یا Whisper با مدل small |
| پیشنهادی | ۶ هستهی فیزیکی به بالا، ۸ تا ۱۶ گیگ رم، SSD | Whisper با large-v3-turbo — دقت کامل |
| سازمانی | ۸ هسته به بالا، ۱۶ گیگ رم، کارت NVIDIA | همان بالا با ZAAL_DEVICE=cuda — چند برابر سریعتر |
کارت گرافیک الزامی نیست و زال روی CPU کامل کار میکند؛ GPU فقط زمان پردازش را کوتاه میکند. سیستمعامل هم محدودیتی ندارد: ویندوز، لینوکس و مک، هرجا پایتون ۳٫۱۰ به بالا نصب باشد.
پنج کاری که دقت خروجی را بالا میبرد
بین یک متن خام که باید بازنویسی شود و یک پیشنویس تمیز، اغلب چند تصمیم ساده فاصله است.
۱. میکروفن را نزدیک بیاورید. این بیشترین اثر را دارد و کمهزینهترین کار است. ضبط با گوشی روی میز در یک اتاق با بازتاب صدا، همان جلسه را برای هر موتوری چند برابر سختتر میکند. یک میکروفن یقهای ارزان، نتیجه را از هر ارتقای نرمافزاری بیشتر بهبود میدهد.
۲. واژگان تخصصی را از قبل معرفی کنید. موتور Whisper پارامتر initial_prompt دارد: چند اصطلاح، نام سازمان یا نام افرادی که در فایل تکرار میشوند را در آن بنویسید تا مدل شکل درستشان را بشناسد. برای جلسات یک صنعت خاص، یک بار نوشتن این فهرست، تمام تبدیلهای بعدی را بهتر میکند.
۳. beam_size را پایین نیاورید مگر عجله داشته باشید. مقدار پیشفرض ۵ است و دقیقترین حالت عملی را میدهد. کاهش آن به ۱ سرعت را بالا میبرد و در فایلهای سخت، خطا را هم.
۴. پیش از تغییر موتور، مدل را یک پله بزرگتر کنید. اگر خروجی مدل پیشفرض روی یک فایل پرنویز راضیکننده نبود، large-v3 را امتحان کنید. کندتر است، ولی روی همان فایل ممکن است تفاوت محسوسی بسازد.
۵. اگر GPU دارید، از آن استفاده کنید. فعال کردن CUDA فقط دو متغیر محیطی است و زمان پردازش فایلهای طولانی را بهشکل قابل توجهی کم میکند — بدون اینکه دقت افت کند.
نصب در چند دقیقه
پیشنیاز فقط پایتون ۳٫۱۰ یا بالاتر است:
git clone https://github.com/itwman/Zaal.git
cd Zaal
python -m venv venv
venv\Scripts\activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver
سپس مرورگر را روی http://127.0.0.1:8000 باز کنید. وابستگیهای پایه عمداً کم نگه داشته شدهاند: جنگو، faster-whisper و python-docx. موتورهای اختیاری جداگانه نصب میشوند و بعد از نصب، خودکار در رابط کاربری فعال میشوند:
pip install vosk # موتور سبک Vosk
pip install torch transformers # موتور wav2vec2 فارسی
تمام فایلهای CSS، جاوااسکریپت و فونت وزیرمتن داخل پروژه ذخیره شدهاند و هیچ CDN خارجی فراخوانی نمیشود — پس رابط کاربری در شبکهی بسته هم کامل بالا میآید.
یک مانع واقعی: دانلود مدل از داخل ایران
در اولین استفاده از هر موتور، مدل آن باید یک بار دانلود شود. مخزن رسمی مدلهای Whisper و wav2vec2، سایت huggingface.co است که از داخل ایران در دسترس نیست. این دقیقاً همان نقطهای است که بیشتر راهنماهای نصب ابزارهای مبتنی بر Whisper از آن عبور میکنند و کاربر ایرانی پشتش میماند.
زال بهصورت پیشفرض این مدلها را از میرور hf-mirror.com میگیرد که بدون ابزار دور زدن فیلترینگ در دسترس است. مدل Vosk اصلاً این مشکل را ندارد و مستقیم از alphacephei.com میآید. دانلود فقط یک بار انجام میشود و مدل در پوشهی models/ میماند.
اگر باز هم به مشکل خوردید، سه راه دارید:
- خاموش کردن میرور با خالی گذاشتن
ZAAL_HF_ENDPOINT، اگر ابزار عبور شما کل سیستم را پوشش میدهد. برای پراکسی لوکال، متغیرهایHTTP_PROXYوHTTPS_PROXYرا هم تنظیم کنید. - دانلود دستی مدل. پنج فایل
model.bin،config.json،tokenizer.json،vocabulary.jsonوpreprocessor_config.jsonرا در یک پوشه بگذارید و مسیر همان پوشه را درZAAL_MODEL_SIZEبنویسید. - شروع با Vosk یا مدل کوچک برای اطمینان از سالم بودن کل مسیر، پیش از دانلود مدل بزرگ.
نکتهای که در طراحی به آن توجه کردیم: اگر دانلود شکست بخورد، زال بهجای هنگ کردن بیپایان، بعد از حدود سی ثانیه پیام خطای فارسی و مشخص ثبت میکند. حالت «در حال آمادهسازی مدل» هم جداگانه نمایش داده میشود تا کاربر نوار پیشرفتِ متوقف را با خرابی اشتباه نگیرد.
برای توسعهدهندگان
معماری زال طوری چیده شده که بشود تکهتکه استفادهاش کرد.
هسته بدون جنگو. پکیج transcriber.engines هیچ وابستگیای به جنگو ندارد و در اسکریپت ساده، Celery یا FastAPI هم کار میکند:
from transcriber.engines import transcribe_file
result = transcribe_file("voice.mp3", engine="whisper", model_size="small")
print(result.text)
for seg in result.segments:
print(seg.start, seg.end, seg.text)
خروجی علاوه بر متن کامل، قطعات زمانبندیشده، زبان تشخیصدادهشده، مدت فایل و زمان پردازش را برمیگرداند.
اپ مستقل جنگو. پوشهی transcriber/ به هر پروژهی جنگویی منتقل میشود: آن را به INSTALLED_APPS اضافه کنید، بلوک تنظیمات ZAAL_* را کپی کنید و یک خط به urls اضافه کنید:
path("stt/", include("transcriber.urls"))
افزودن موتور جدید. اگر موتور تازهای میخواهید — یک مدل فارسی دیگر، یا بکاندی مثل whisper.cpp — از کلاس BaseEngine ارث ببرید، دو متد _load() و _transcribe() را پیاده کنید و موتور را در registry.py ثبت کنید. از آن لحظه خودکار هم در رابط کاربری ظاهر میشود و هم در دستور بنچمارک. فایل vosk_engine.py نمونهی فشردهای از این کار است و کمتر از صد خط دارد.
پروژه تست هم دارد (python manage.py test) و راهنمای مشارکت در CONTRIBUTING.md نوشته شده است.
نقشهی راه
زال در حال توسعه است و اینها موارد اعلامشدهی روی نقشهی راه هستند — نه قابلیتهای موجود:
- مدل Zaal-fa: فاینتیون ویسپر روی دادههای فارسی و انتشار نسخهی کوانتیزهی سبک برای CPU
- تبدیل زندهی میکروفون از طریق WebSocket
- تشخیص گوینده (Diarization)
- پشتیبانی Celery برای استقرار چندکاربره
- بکاند whisper.cpp و sherpa-onnx برای دستگاههای embedded
چون پروژه متنباز است، هر کدام از اینها را میشود در مخزن دنبال کرد یا در توسعهاش مشارکت کرد.
محدودیتهایی که بهتر است از اول بدانید
هیچ ابزاری همهکاره نیست و پنهان کردن محدودیتها فقط انتظار غلط میسازد.
کیفیت ضبط، تعیینکنندهترین عامل است. ضبط با میکروفن دور، همهمهی پسزمینه یا صدای همپوشان چند نفر، دقت را بهشکل محسوسی پایین میآورد. بهبود یک پله در کیفیت ضبط، معمولاً بیشتر از عوض کردن موتور اثر دارد.
تفکیک گوینده هنوز وجود ندارد. زال متن را پیوسته تولید میکند و نمیگوید کدام جمله را چه کسی گفته است. این قابلیت روی نقشهی راه است، ولی امروز برای مصاحبهی چندنفره باید گویندهها را دستی مشخص کنید.
همزمان یک فایل. صف داخلی طوری تنظیم شده که هر بار یک تبدیل اجرا شود. برای استفادهی چندکاربرهی سنگین، به Celery نیاز است که آن هم روی نقشهی راه قرار دارد.
wav2vec2 نقطهگذاری ندارد. اگر این موتور را انتخاب کنید، متن پیوسته و بدون علائم نگارشی تحویل میگیرید. برای جستجو و تحلیل خوب است، برای انتشار نه.
خروجی، پیشنویس است نه سند نهایی. برای متنهای حساس — قرارداد، مستند حقوقی، نقلقول مستقیم — بازخوانی انسانی جایگزین ندارد. ارزش زال در این است که کار سهساعته را به بازبینی بیستدقیقهای تبدیل میکند، نه اینکه آن را حذف کند.
سوالات متداول
آیا زال واقعاً رایگان است و میتوانم تجاری استفاده کنم؟
بله. زال با لایسنس MIT منتشر شده که آزادترین لایسنسهای متنباز است: استفاده، تغییر و توزیع مجدد — از جمله در محصول تجاری — مجاز است. متن کامل لایسنس در فایل LICENSE مخزن آمده است.
آیا زال واقعاً آفلاین کار میکند؟
بله، با یک استثنای مشخص: اولین دانلود مدل هر موتور به اینترنت نیاز دارد. پس از آن، مدل روی دیسک شماست و پردازش کاملاً محلی انجام میشود. اگر بخواهید سیستم را روی شبکهای کاملاً ایزوله ببرید، میتوانید مدل را جای دیگری دانلود و پوشهاش را منتقل کنید.
فایل صوتی من جایی ذخیره یا ارسال میشود؟
فایل در پوشهی media/uploads/ روی همان دستگاه ذخیره میشود و متن در پایگاه دادهی محلی. هیچ درخواستی به سرویس بیرونی ارسال نمیشود. چون کد متنباز است، این ادعا قابل بررسی است — نه چیزی که فقط باید به آن اعتماد کرد.
کدام موتور را انتخاب کنم؟
قاعدهی سرانگشتی: سیستم ضعیف یا نیاز به پیشنویس سریع → Vosk. حالت معمول و متن قابل انتشار → Whisper (پیشفرض). دقت خوب و سرعت بالا با پذیرش نبود نقطهگذاری → wav2vec2. برای تصمیم قطعی، دستور بنچمارک را روی یک فایل نمونهی خودتان اجرا کنید.
برای زیرنویس ویدیو مناسب است؟
بله. خروجی SRT مستقیماً از قطعهبندی زماندار مدل ساخته میشود و در هر پخشکننده یا نرمافزار تدوین قابل استفاده است. برای زیرنویس حرفهای معمولاً لازم است طول برخی قطعهها را دستی تنظیم کنید.
دقت زال چقدر است؟
عدد واحدی برای این سوال وجود ندارد و هر رقمی که بدون ذکر شرایط آزمون اعلام شود، گمراهکننده است. دقت به کیفیت ضبط، لهجه، سرعت گفتار، میزان واژگان تخصصی و موتور و مدل انتخابی بستگی دارد. زال دقیقاً به همین دلیل دستور بنچمارک دارد: تست روی فایل واقعی خودتان، تنها معیار قابل اتکاست.
جمعبندی
برای تبدیل صوت به متن فارسی امروز گزینه کم نیست؛ چیزی که کم است، گزینهای است که هم فارسیِ تمیز تحویل بدهد، هم فایل شما را جایی نفرستد، و هم بشود داخلش را دید و تغییرش داد. زال با همین سه معیار ساخته شد و با لایسنس MIT منتشر شده — ابزاری که ادعای محرمانگی میکند، باید کدش قابل بررسی باشد.
دریافت زال
- صفحهی پروژه: icsd.ir/zaal
- کد منبع و راهنمای نصب: github.com/itwman/Zaal
- لایسنس: MIT — آزاد برای هر استفادهای، از جمله تجاری
- تماس: ۰۳۱-۵۵۳۳۶۶۴۵ — ۰۹۳۷۱۹۸۲۰۰۰
- توسعهدهنده: شرکت توسعه هوشمند فرش ایرانیان — پارک علم و فناوری دانشگاه کاشان
اگر ایرادی دیدید یا قابلیتی لازم دارید، در مخزن ایشو ثبت کنید؛ راهنمای مشارکت در CONTRIBUTING.md است.
