اگر امروز از مدلهای تبدیل گفتار به متن برای یادداشتبرداری سریع استفاده میکنید، احتمالاً با توهمات عجیب مدل در لحظات سکوت یا تغییر ناگهانی زبان مواجه شدهاید. باید بدانید که کیفیت خروجی در ابزارهای محلی، کمتر به اندازهٔ خودِ مدل و بیشتر به تنظیمات پیرامونی آن وابسته است. ابزار Tania Dictée که یک سامانه دیکته محلی برای ویندوز است، نشان میدهد چگونه میتوان مدل faster-whisper را برای زبان فرانسوی کبک (که مملو از اصطلاحات فنی انگلیسی است) بهینه کرد بدون آنکه به سرورهای خارجی وابسته باشد. گردش کار اصلی این ابزار بسیار ساده است: کاربر کلید F6 را فشار میدهد، صحبت میکند، کلید را رها میکند و متن دقیقاً در محل قرارگیری مکاننما (Cursor) تایپ و جایگذاری میشود.
برای بسیاری از کاربران، اجرای هوش مصنوعی بهصورت محلی روی ویندوز اغلب مانند یک سازش بین سرعت و دقت به نظر میرسد. نصبهای استاندارد مدلهای Whisper معمولاً در مواجهه با لهجههای خاص یا اصطلاحات تخصصی فنی دچار مشکل میشوند و اغلب آنها را به زبان رسمی «اصلاح» میکنند یا در بازههای زمانی سکوت، دچار توهم (Hallucination) شده و متونی خیالی تولید میکنند. توسعهدهنده این ابزار اشاره کرد که در ابتدا، خروجیهای زبان فرانسوی کبکی او — که با شدت زیاد از «انگلیسیهای برنامهنویسی» (Dev Anglicisms) استفاده میکرد — کیفیت بسیار بدی داشت. او تاکید کرد که این مشکل نه به دلیل توانایی ذاتی مدل، بلکه به دلیل تنظیمات پیرامونی آن بود.
ساخت یک خط لوله (Pipeline) محلی قابلاعتماد، نیازمند عبور از تنظیمات پیشفرض است. توسعهدهنده Tania Dictée دریافت که صرفاً بهینهسازی اندازه مدل برای حل مشکل «انحراف» (Drift) مدل در هنگام تبدیل کلیپهای صوتی کوتاه (Push-to-talk) کافی نیست. او به جای اجرای بنچمارکها یا اندازهگیری نرخ خطا، پنج تنظیم concrete و ملموس را شناسایی کرد که کیفیت خروجی را بهطور کلی تغییر داد.
استراتژی مدل مبتنی بر سختافزار
این برنامه از یک فرآیند انتخاب خودکار برای ایجاد تعادل بین عملکرد و دقت استفاده میکند. برای دستیابی به این هدف، برنامه در هنگام استارتآپ سختافزار را با منطق خاصی شناسایی میکند: تابع auto_detect_device() اگر CUDA در دسترس باشد، مقدار "cuda" را بازمیگرداند و تابع auto_detect_compute_type() برای CUDA مقدار "float16" و برای CPU مقدار "int8" را انتخاب میکند. در نهایت، تابع auto_detect_model() مدل large-v3 را برای CUDA و مدل medium را برای CPU برمیگزیند.
اگر یک کارت گرافیک NVIDIA با پشتیبانی از CUDA شناسایی شود، سیستم بهطور پیشفرض از مدل large-v3 با دقت float16 استفاده میکند. اما زمانی که سیستم به CPU متکی است، به مدل medium سوئیچ کرده و از کوانتایزیشن int8 از طریق کتابخانه CTranslate2 بهره میبرد. این کوانتایزیشن، وزنهای مدل را فشرده میکند و این تنها راهی است که میتوان یک مدل جدی را روی یک CPU معمولی به کار گرفت؛ در غیر این صورت، مدل برای دیکته در زمان واقعی (Real-time) بسیار کند میشود.
انتخاب مدلهای کوچکتر مانند 'tiny' برای زبان فرانسوی بهشدت توصیه نمیشود. طبق گفته توسعهدهنده، استفاده از مدل tiny منجر به از دست رفتن لهجهها، اسامی خاص و کلمات نادر میشود. مدل medium یک سازش ضروری است: این مدل «ماده» و ظرفیت کافی برای مدیریت زبان فرانسوی کبک و اصطلاحات فنی را فراهم میکند و در عین حال روی سختافزار CPU سرعت معقولی دارد.
پارامترهای حیاتی برای پایداری متن
برای تثبیت خروجی، چندین فلگ خاص در تابع transcribe() مورد استفاده قرار میگیرد. فراخوانی این تابع از مقادیر دقیق زیر استفاده میکند:
- language="fr": زبان بهصورت دستی روی فرانسوی تنظیم شده است، نه اینکه روی تشخیص خودکار (Auto-detect) رها شود. زیرا کلیپهای push-to-talk اغلب بسیار کوتاه هستند (یک یا دو عبارت) و اگر Whisper را رها کنیم تا زبان را حدس بزند، این ریسک وجود دارد که مدل ناگهان در وسط یک کلیپ به زبان انگلیسی سوئیچ کند. اجبار به زبان فرانسوی، این انحراف را حذف میکند.
- temperature=0.0: با غیرفعال کردن مقیاس دما (Temperature)، مدل محتملترین و پایدارترین مسیر را برای هر تلاش ارائه میدهد. این کار «خلاقیت» و توهمات را، بهویژه در زمان سکوت یا نویز پسزمینه، حذف میکند. در حالی که یک تنظیم استاندارد
faster-whisperاز لیستی از دماها برای تلاش مجدد در هنگام شکست آستانهها (Thresholds) استفاده میکند، ارسال مقدار اسکالر ۰.۰ این شبکه ایمنی را غیرفعال میکند و «شانسهای دوم» روی کلیپهای ضعیف را فدای تکرارپذیری (Reproducibility) میکند. - vad_filter=True: از یک تشخیصدهنده فعالیت صوتی (Voice Activity Detector) برای حذف سکوتها قبل از رسیدن صوت به مدل استفاده میشود. Whisper تمایل دارد در زمان سکوت عبارات تصادفی توهم بزند؛ فیلتر کردن سکوت در منبع، مشکل را موثرتر از اصلاح نتیجه در مراحل بعدی حل میکند.
- condition_on_previous_text=True: اگرچه این گزینه میتواند باعث ایجاد حلقههای تکرار در فایلهای طولانی شود، اما در اینجا استفاده شده است زیرا هر کلیپ push-to-talk یک فراخوانی ایزوله
transcribe()در حد چند ثانیه است. از آنجایی که هیچ چیزی از یک کلیپ به کلیپ بعدی منتقل نمیشود، بستر متن (Context) در طول یک جلسه دیکته، بیشتر کمک میکند تا آسیب برساند. - word_timestamps=False: این گزینه غیرفعال شده است زیرا برای دیکته سادهای که نیاز به زمانبندی کلمات ندارد، غیرضروری است و از سربار پردازشی مربوط به مرحله تراز کردن (Alignment pass) جلوگیری میکند.
مهار اصطلاحات فنی و تخصصی
برای جلوگیری از اینکه مدل اصطلاحات فنی را ترجمه کند (مثلاً تبدیل کلمه 'ship' به 'expédier')، سیستم از یک رویکرد دوگانه استفاده میکند. نخست، یک initial_prompt تخصصی به زبان فرانسوی بهطور صریح به هوش مصنوعی دستور میدهد که اصطلاحات انگلیسی برنامهنویسی را به انگلیسی نگه دارد. بخشی از این پرامپت چنین است: «اگر کلمهای به انگلیسی گفته شد، آن را به انگلیسی نگه دار و هرگز به فرانسوی ترجمه نکن: 'build' همان 'build' باقی میماند (نه 'construire')، 'ship' همان 'ship' میماند (نه 'expédier')، 'run' همان 'run' میماند، 'commit' همان 'commit' میماند، 'push' همان 'push' میماند و 'merge' همان 'merge' میماند.»
دوم، سیستم از کلمات کلیدی (Hotwords) بهره میبرد. Tania Dictée شامل یک لیست سختافزاری به نام DEFAULT_GLOSSARY_TERMS است که شامل کلمات زیر است: Tania Dictée, VS Code, Cursor, Claude Code, ChatGPT, GitHub, Whisper, Stripe, Notion, Python, Node.js, React, Tailwind, Docker, push-to-talk, و Québec. همچنین یک فایل اختیاری glossary.txt به کاربران اجازه میدهد نام پروژهها یا همکاران خود را بدون جایگزینی لیست پیشفرض اضافه کنند.
این واژهنامه دو بار به مدل ارسال میشود: یک بار ادغام شده در initial_prompt و یک بار به عنوان آرگومان hotwords. در faster-whisper واژههای کلیدی کدگذاری شده و در ابتدای بستر شرطی (در اسلات sot_prev) قبل از توکنهای initial_prompt قرار میگیرند. این کار به این عبارات جایگاه ممتازی میدهد. با این حال، دو محدودیت وجود دارد: ظرفیت این اسلات به حدود ۲۲۴ توکن محدود است (به این معنی که واژهنامههای غولپیکر قطع میشوند) و اگر یک پیشوند (Prefix) ارسال شود، hotwords نادیده گرفته میشوند.
لایه ایمنی با Regex
به نقل از توسعهدهنده، علیرغم پرامپتهای پیشرفته، برخی خطاها همچنان تکرارپذیر (Deterministic) هستند. بنابراین، لایهای از جایگزینیهای نرم (SOFT_REPLACEMENTS) با استفاده از عبارات منظم (Regular Expressions) و فلگ IGNORECASE برای شکار شکستهای صوتی تکراری ایجاد شده است. این یک راهکار «چسب زخم» است، اما یک Regex قطعی، بدون هیچ هزینه محاسباتی اضافی، از یک مدل بزرگتر برتر است.
برای مثال، سیستم توهمات خاصی را شناسایی کرده و بهطور خودکار جایگزین میکند:
r"\bpaillette\s*on\b"$\rightarrow$ Pythonr"\bno\s*jeasse\b"$\rightarrow$ Node.jsr"\bdock\s*heure\b"$\rightarrow$ Dockerr"\bouisp(er|eur)?\b"$\rightarrow$ Whisperr"\bvs codes?\b"$\rightarrow$ VS Coder"\bia\b"$\rightarrow$ IA
این منطق در یک تابع به نام apply_soft_replacements قرار دارد که ابتدا فاصلههای خالی (Whitespace) را حذف کرده و سپس الگوها را اعمال میکند. توسعهدهنده هشدار میدهد که این جایگزینیها باید فقط بر اساس شکستهای مشاهدهشده باشند تا از «مثبت کاذب» جلوگیری شود. برای مثال، یک regex که کلمه "équiper" (تجهیز کردن) را به "ship" تبدیل میکند، به این دلیل ساخته شد که Whisper بهطور مداوم "ship" را به "équiper" ترجمه میکرد. این یعنی کاربر دیگر نمیتواند بهصورت قانونی فعل "équiper" را دیکته کند.
برای کاهش این اثرات، کل این لایه را میتوان با استفاده از فلگ --cleanup-mode raw غیرفعال کرد تا خروجی خام Whisper دریافت شود.
رفع ناسازگاریهای ویندوز
بستهبندی این ابزار برای ویندوز، یک مانع رایج در رمزگذاری (Encoding) را آشکار کرد. بهطور پیشفرض، کنسول ویندوز بهگونهای رمزگذاری میکند که نام برنامه «Tania Dictée» را در لاگها و فایل exe بستهبندی شده به «mojibake» (کاراکترهای شکسته و نامفهوم) تبدیل میکند.
برای رفع این مشکل، اسکریپت شامل یک بلوک در بالاترین قسمت است تا sys.stdout و sys.stderr را به utf-8 با مقدار errors="replace" بازپیکربندی کند. چون برنامه با استفاده از PyInstaller و فلگ --noconsole بهصورت یک فایل exe بدون کنسول بستهبندی شده است، sys.stdout اغلب مقدار None دارد. بنابراین، این بازپیکربندی در بلوکهای try-except قرار گرفته است تا از کراش کردن برنامه با خطای AttributeError بلافاصله پس از استارتآپ جلوگیری شود.
این پیادهسازی از Tania Dictée هماکنون تحت مجوز MIT در گیتهاب بهصورت متنباز منتشر شده است. این پروژه نمایانگر رویکرد «ساخت در ملاء عام» (Build-in-public) برای ابزاری است که اگرچه در حال حاضر فروش صفر دارد، اما نقشهای جامع برای ساخت خط لولههای Local STT ارائه میدهد.
برای کسانی که ابزارهای مشابه میسازند، موازنه اصلی روشن است: ترکیبی از یک مدل کوانتایز شده متوسط، کنترلهای سختگیرانه دما و یک پسپردازشگر Regex قطعی، بهتر از ارتقای ساده به یک مدل بزرگتر و کندتر عمل میکند. اگر در استک هوش مصنوعی محلی خود با خطاهای تکراری در تبدیل گفتار به متن مواجه هستید، پیش از آنکه به سراغ Fine-tuning مدل بروید، سعی کنید رایجترین عبارات «توهمزده» خود را به یک دیکشنری Regex نگاشت کنید.
گام بعدی شما
- اگر مدلهای محلی شما در کلمات تکراری اشتباه میکنند، پیش از Fine-tuning، یک دیکشنری Regex ساده برای اصلاح خروجیها بسازید.
- دمای استنتاج (Temperature) را برای کارهای تبدیل گفتار به متن روی ۰.۰ قرار دهید تا پایداری خروجی افزایش یابد.
- برای کاهش توهمات در لحظات سکوت، حتماً از فیلتر VAD در لایه پیشپردازش استفاده کنید.
این استراتژیهای نرمافزاری تنها بخشی از معادله است؛ برای درک تأثیر سختافزار بر سرعت استنتاج، تحلیل ما دربارهی تراشههای Blackwell را بخوانید.




گفتگو