پرش به محتوا
← همهٔ یادداشت‌ها

تبدیل گفتار به متن فارسی با Whisper روی GPU ابری

·۸ دقیقه مطالعه·تیم جی‌پی‌یو

یک میکروفون کاندنسر استودیویی نقره‌ای روی پایه ضدلرزش با فیلتر پاپ، در فضای تاریک یک استودیوی ضبط صدا.

برای تبدیل گفتار به متن فارسی بهترین ابزار آزاد امروز Whisper است، و روی یک کارت گرافیک اجاره‌ای در چند دقیقه کاری را می‌کند که روی CPU لپ‌تاپ ساعت‌ها طول می‌کشد. در این آموزش یک فایل صوتی یا ویدیوی فارسی را می‌گیریم، متن کاملش را در می‌آوریم، فایل زیرنویس SRT می‌سازیم و در آخر زیرنویس را روی ویدیو می‌نشانیم. همه‌اش روی یک ماشین GPU در جی‌پی‌یو، با پرداخت ساعتی و تومانی.

کل مسیر برای یک فایل یک‌ساعته حدود نیم‌ساعت وقت می‌برد و روی یک کارت اقتصادی، در زمان نوشتن این مطلب، معمولاً زیر ۱۰ هزار تومان خرج برمی‌دارد. نیازی نیست برنامه‌نویس باشید؛ کافی است ترمینال باز کنید و دستور کپی کنید. اگر هم حوصلهٔ ترمینال ندارید، روش اول همین پست با رابط وب کار را تمام می‌کند.

پیش‌نیازها

  • یک حساب در جی‌پی‌یو. اگر هنوز ندارید، از صفحهٔ ثبت‌نام شروع کنید.
  • یک کلید عمومی SSH ثبت‌شده در بخش /account. ورود به ماشین فقط با کلید SSH انجام می‌شود و رمز عبوری در کار نیست. مراحل ساخت و ثبت کلید را در پست شروع اجاره GPU: اولین ماشین در ۱۰ دقیقه قدم‌به‌قدم توضیح داده‌ایم.
  • موجودی کیف پول. برای شروع اجاره باید دست‌کم به اندازهٔ یک ساعت از نرخ همان ماشین موجودی داشته باشید. شارژ با کارت به کارت انجام می‌شود و کمترین مبلغ ۵۰ هزار تومان است؛ همین مبلغ برای چند بار انجام این آموزش کافی است.
  • فایل صوتی یا ویدیویی که می‌خواهید متنش را در بیاورید.

انتخاب کارت گرافیک مناسب برای تبدیل گفتار به متن فارسی

Whisper مدل سنگینی نیست. بزرگ‌ترین نسخه‌اش، large-v3، طبق مستندات رسمی پروژه حدود ۱۰ گیگابایت VRAM می‌خواهد و نسخهٔ turbo حدود ۶ گیگابایت. اگر به‌جای پیاده‌سازی اصلی از faster-whisper استفاده کنید، همان مدل large-v3 با دقت float16 تقریباً ۵ گیگابایت VRAM مصرف می‌کند. یعنی برای این کار لازم نیست سراغ گران‌ترین کارت‌ها بروید.

دو پیشنهاد عملی:

  • اقتصادی: RTX 3060 با ۱۲ گیگابایت VRAM. برای large-v3 و turbo کاملاً جا دارد. در زمان نوشتن این مطلب از حدود ۱۴ هزار تومان در ساعت شروع می‌شود.
  • سریع‌تر: RTX A4000 با ۱۶ گیگابایت (در زمان نوشتن این مطلب از حدود ۲۳ هزار تومان در ساعت) یا RTX 3090 با ۲۴ گیگابایت (در زمان نوشتن این مطلب از حدود ۳۶ هزار تومان در ساعت). این‌ها وقتی به‌صرفه‌اند که چند ساعت صوت در صف دارید و می‌خواهید کار زودتر تمام شود.

قیمت‌های به‌روز و فیلتر روی مدل کارت و حجم VRAM در بازار GPU هست. نکتهٔ مهم: قیمت ساعتی در لحظهٔ اجاره قفل می‌شود و نوسان بعدی بازار روی هزینهٔ آن ماشین اثری ندارد.

اجاره و راه‌اندازی ماشین

در بازار، ماشین موردنظر را انتخاب کنید و موقع اجاره قالب (Template) را مشخص کنید. دو گزینهٔ منطقی دارید:

  • قالب Whisper WebUI & API: ماشین با رابط وب و API آمادهٔ Whisper بالا می‌آید. برای کسی که نمی‌خواهد دستور بزند، بهترین انتخاب است.
  • قالب PyTorch: یک محیط تمیز با CUDA و PyTorch که خودتان روی آن هر چه خواستید نصب می‌کنید. اگر می‌خواهید خروجی را دقیقاً کنترل کنید یا دسته‌ای پردازش کنید، این را بگیرید.

دکمهٔ اجاره را بزنید و منتظر بمانید تا وضعیت ماشین «در حال اجرا» شود؛ معمولاً یکی دو دقیقه طول می‌کشد. صفحهٔ ماشین بعد از آن این‌ها را یک‌کلیک در اختیارتان می‌گذارد: دستور آمادهٔ SSH، لینک مستقیم Jupyter و توکن آن، دستور «تونل امن» برای باز کردن رابط وب از طریق SSH، دکمهٔ «پنل ماشین» برای قالب‌هایی که رابط وب دارند، و فهرست پورت‌های منتشرشده.

روش اول: بدون دستور، با رابط وب

اگر قالب Whisper WebUI & API را گرفته‌اید، روی «پنل ماشین» بزنید تا رابط وب باز شود. فایل صوتی را آپلود کنید، مدل را روی large-v3 بگذارید، زبان را روی Persian تنظیم کنید و خروجی را بگیرید. زبان را همیشه دستی تعیین کنید؛ تشخیص خودکار روی فایل‌های کوتاه یا پر سروصدا گاهی فارسی را اشتباه می‌گیرد.

روش دوم: خط فرمان و کنترل کامل

با دستور SSH صفحهٔ ماشین وارد شوید و اول کارت را ببینید:

nvidia-smi

اگر جدول کارت و مقدار VRAM را دیدید، ماشین سالم است. حالا فایل خود را از لپ‌تاپ بالا بفرستید (این دستور را روی سیستم خودتان بزنید، نه روی ماشین):

scp -P <PORT> -i ~/.ssh/id_ed25519 ./sokhanrani.mp3 root@<HOST>:/workspace/

<HOST> و <PORT> را از همان دستور SSH صفحهٔ ماشین بردارید.

نصب Whisper

روی ماشین:

apt-get update && apt-get install -y ffmpeg
pip install -U openai-whisper

ffmpeg برای خواندن فرمت‌های صوتی لازم است و بعداً برای زیرنویس هم به کارش می‌آییم.

گرفتن متن و فایل SRT

whisper /workspace/sokhanrani.mp3 \
  --model large-v3 \
  --language fa \
  --output_format all \
  --output_dir /workspace/out

بار اول، وزن مدل large-v3 (نزدیک به سه گیگابایت) دانلود می‌شود. چون ماشین‌ها خارج از ایران هستند، این دانلود با سرعت گیگابیتی روی خود ماشین انجام می‌شود و به اینترنت شما ربطی ندارد؛ معمولاً کمتر از یک دقیقه.

--output_format all همهٔ خروجی‌ها را می‌سازد: sokhanrani.txt (متن خام)، sokhanrani.srt و sokhanrani.vtt (زیرنویس زمان‌بندی‌شده)، به‌علاوهٔ tsv و json. اگر فقط زیرنویس می‌خواهید، --output_format srt بزنید.

دو گزینهٔ مفید برای زیرنویس تمیزتر:

whisper /workspace/video.mp4 \
  --model large-v3 --language fa --output_format srt \
  --word_timestamps True --max_line_width 42 --max_line_count 2 \
  --output_dir /workspace/out

این دو گزینه خط‌های زیرنویس را کوتاه و دوخطی نگه می‌دارند تا روی تصویر جا شوند. هر دو به --word_timestamps True وابسته‌اند.

نسخهٔ سریع‌تر با faster-whisper

اگر چند ساعت صوت دارید، faster-whisper همان مدل را با مصرف VRAM کمتر و سرعت بیشتر اجرا می‌کند:

pip install faster-whisper

فایل srt.py را بسازید:

from faster_whisper import WhisperModel

def ts(t):
    ms = int(round(t * 1000))
    h, ms = divmod(ms, 3600000)
    m, ms = divmod(ms, 60000)
    s, ms = divmod(ms, 1000)
    return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"

model = WhisperModel("large-v3", device="cuda", compute_type="float16")
segments, info = model.transcribe(
    "/workspace/sokhanrani.mp3",
    language="fa",
    beam_size=5,
    vad_filter=True,
)
print("زبان تشخیص‌داده‌شده:", info.language, info.language_probability)

with open("/workspace/out/sokhanrani.srt", "w", encoding="utf-8") as f:
    for i, seg in enumerate(segments, start=1):
        f.write(f"{i}\n{ts(seg.start)} --> {ts(seg.end)}\n{seg.text.strip()}\n\n")

و اجرایش کنید:

mkdir -p /workspace/out && python srt.py

گزینهٔ vad_filter=True سکوت‌ها را قبل از پردازش حذف می‌کند؛ هم سریع‌تر می‌شود و هم جلوی جمله‌های ساختگی مدل روی بخش‌های بی‌صدا را می‌گیرد.

ساخت زیرنویس روی ویدیو با ffmpeg

اگر ورودی‌تان ویدیو است، اول صدا را جدا کنید تا پردازش سبک‌تر شود:

ffmpeg -i /workspace/video.mp4 -vn -ac 1 -ar 16000 /workspace/video.wav

بعد از ساخت فایل SRT، دو راه دارید. راه اول و امن‌تر برای فارسی، زیرنویس نرم است؛ فایل زیرنویس داخل ویدیو جاسازی می‌شود و پخش‌کننده خودش آن را نمایش می‌دهد:

ffmpeg -i /workspace/video.mp4 -i /workspace/out/video.srt \
  -c copy -c:s mov_text -metadata:s:s:0 language=fas \
  /workspace/video-sub.mp4

راه دوم سوزاندن زیرنویس روی تصویر است. این روش ویدیو را دوباره کد می‌کند و کندتر است، اما در هر پخش‌کننده و هر شبکهٔ اجتماعی کار می‌کند. اول یک فونت با حروف فارسی نصب کنید، وگرنه به‌جای متن مربع خالی می‌بینید:

apt-get install -y fonts-noto-core
ffmpeg -i /workspace/video.mp4 \
  -vf "subtitles=/workspace/out/video.srt:force_style='FontName=Noto Naskh Arabic,FontSize=22'" \
  -c:a copy /workspace/video-burned.mp4

خروجی را قبل از حذف ماشین حتماً دانلود کنید:

scp -P <PORT> -i ~/.ssh/id_ed25519 root@<HOST>:/workspace/out/video.srt ./

اگر به مشکل خوردید

  • CUDA out of memory: مدل کوچک‌تر بگیرید (turbo به‌جای large-v3) یا در faster-whisper مقدار compute_type را روی int8_float16 بگذارید. اگر باز هم جا نشد، کارتی با VRAM بیشتر اجاره کنید.
  • خطای Unable to load libcudnn یا libcublas هنگام اجرای faster-whisper: کتابخانه‌های CUDA روی آن ایمیج ناقص‌اند. این دو دستور معمولاً حلش می‌کند:
    pip install nvidia-cublas-cu12 "nvidia-cudnn-cu12==9.*"
    export LD_LIBRARY_PATH=`python3 -c 'import os; import nvidia.cublas.lib; import nvidia.cudnn.lib; print(os.path.dirname(nvidia.cublas.lib.__file__) + ":" + os.path.dirname(nvidia.cudnn.lib.__file__))'`
    
  • خروجی انگلیسی یا بی‌ربط شد: --language fa را جا انداخته‌اید. تشخیص خودکار زبان را برای فارسی به‌کار نبرید.
  • جمله‌های تکراری یا متنی که در صوت نیست: معمولاً روی سکوت‌های طولانی اتفاق می‌افتد. با faster-whisper و vad_filter=True یا با کم کردن نویز فایل ورودی برطرف می‌شود.
  • دانلود مدل نیمه‌کاره ماند: پوشهٔ کش را پاک کنید (rm -rf ~/.cache/whisper) و دستور را دوباره بزنید.
  • رابط وب باز نمی‌شود: سرویس کمی دیرتر از خود ماشین بالا می‌آید؛ چند لحظه صبر کنید و بعد از دستور «تونل امن» صفحهٔ ماشین استفاده کنید.

هزینه و صرفه‌جویی

هزینه دقیقه‌ای از کیف پول کم می‌شود و ماشین متوقف‌شده هزینه‌ای ندارد. برای یک فایل یک‌ساعتهٔ فارسی، مجموع زمان اجاره — شامل راه‌اندازی، دانلود مدل و پردازش — معمولاً بین ۱۵ تا ۴۰ دقیقه است. روی RTX 3060 که در زمان نوشتن این مطلب از حدود ۱۴ هزار تومان در ساعت شروع می‌شود، یعنی چیزی حدود ۴ تا ۱۰ هزار تومان.

سه عادت که هزینه را پایین نگه می‌دارد: فایل‌ها را یک‌جا آپلود کنید و در یک نشست پشت سر هم پردازش کنید؛ به‌جای ویدیوی کامل، فقط صدای استخراج‌شده را به مدل بدهید؛ و تا کار تمام شد ماشین را متوقف یا حذف کنید.

یک هشدار مهم: دیسک ماشین با حذف ماشین پاک می‌شود. فضای ذخیره‌سازی دائمی وجود ندارد، پس قبل از حذف، فایل‌های srt و txt و ویدیوی نهایی را با scp روی سیستم خودتان بیاورید یا به فضای ابری خودتان بفرستید.

قدم بعدی

اگر می‌خواهید متن خروجی را خلاصه کنید، عنوان بسازید یا سؤال‌وجواب تولید کنید، همین متن را به یک مدل زبانی بدهید؛ راهش در پست اجرای مدل زبانی با Ollama روی GPU ابری آمده است. و اگر هنوز مطمئن نیستید چه کارتی لازم دارید، پست انتخاب کارت گرافیک هوش مصنوعی: راهنمای VRAM هر کار را ببینید.

مستندات رسمی ابزارها برای تنظیمات پیشرفته‌تر: پروژهٔ Whisper، faster-whisper و مستندات ffmpeg.

پرسش‌های متداول

آیا برای اجرای Whisper به کارت گرافیک نیاز است؟

نه الزاماً، اما تفاوت زیاد است. Whisper روی CPU هم اجرا می‌شود ولی پردازش یک فایل یک‌ساعته ممکن است ساعت‌ها طول بکشد. روی یک GPU ابری با ۱۲ گیگابایت VRAM همان کار در چند دقیقه تمام می‌شود.

دقت Whisper روی فارسی چقدر است؟

روی صدای تمیز و گویندهٔ واضح، مدل large-v3 خروجی قابل‌قبولی می‌دهد و معمولاً فقط به ویرایش سبک علائم نگارشی و نام‌های خاص نیاز دارد. روی صدای تلفنی، چندنفره یا پر سروصدا خطا بیشتر می‌شود. حتماً --language fa را بدهید.

کدام مدل Whisper را انتخاب کنم؟

اگر VRAM کافی دارید، large-v3 بهترین دقت را می‌دهد. turbo با حدود ۶ گیگابایت VRAM سریع‌تر است و برای پیش‌نویس زیرنویس کافی است، ولی برای ترجمه آموزش ندیده است.

فایل زیرنویس را چطور از ماشین بردارم؟

با scp از سیستم خودتان، یا از داخل Jupyter با راست‌کلیک روی فایل و زدن Download. چون دیسک ماشین با حذف آن پاک می‌شود، این کار را قبل از حذف انجام دهید.

چقدر باید کیف پولم را شارژ کنم؟

برای شروع اجاره باید دست‌کم معادل یک ساعت از نرخ همان ماشین موجودی داشته باشید. کمترین مبلغ شارژ ۵۰ هزار تومان است که برای چند بار انجام این آموزش روی یک کارت اقتصادی کافی است.

تصویر کاور: «Silver and black studio microphone condenser» اثر Jonathan Velasquez، از ویکی‌مدیا کامنز، لایسنس CC0.

تصویر کاور: «Live room and microphone at Audio Mix House, Studio C (13431045144)» اثر Audio Mix House from United States، از ویکی‌مدیا کامنز، لایسنس CC BY 2.0.