ساخت زیرنویس خودکار فارسی با هوش مصنوعی؛ آموزش تولید SRT و VTT

در این راهنما ساخت زیرنویس خودکار فارسی با هوش مصنوعی را یاد می‌گیرید؛ از تبدیل فیلم به متن تا تولید SRT و VTT، تنظیم زمان و ترجمه زیرنویس.

Share
ساخت زیرنویس خودکار فارسی با هوش مصنوعی؛ آموزش تولید SRT و VTT

ساخت زیرنویس خودکار با هوش مصنوعی چیست؟

ساخت زیرنویس خودکار با هوش مصنوعی فرایندی است که در آن صدای یک ویدئو یا فایل صوتی به متن زمان‌بندی‌شده تبدیل می‌شود. خروجی می‌تواند به‌صورت فایل SRT، فایل WebVTT، زیرنویس قابل ویرایش در نرم‌افزار تدوین یا متن چسبیده به تصویر باشد.

یک سیستم حرفه‌ای زیرنویس باید چند وظیفه جداگانه را انجام دهد:

  • تشخیص بخش‌های دارای گفتار
  • تبدیل گفتار به متن
  • تشخیص زبان
  • افزودن علائم نگارشی
  • زمان‌بندی جمله‌ها
  • تقسیم متن به Cueهای خوانا
  • تشخیص یا تفکیک گویندگان
  • اصلاح کلمات تخصصی
  • ترجمه، در صورت نیاز
  • تولید فایل استاندارد
  • کنترل همگام‌بودن متن و صدا

تولید Transcript ساده‌تر از تولید زیرنویس حرفه‌ای است. Transcript فقط متن کامل گفتگو را ارائه می‌دهد، اما Subtitle باید زمان شروع و پایان هر بخش را نیز مشخص کند و برای خواندن روی تصویر مناسب باشد.

تفاوت Transcript، Subtitle و Caption

این سه اصطلاح مرتبط‌اند، اما یکسان نیستند.

اصطلاحکاربرد
Transcriptمتن کامل گفتار، معمولاً بدون زمان‌بندی دقیق
Subtitleنمایش متن گفتار یا ترجمه آن در زمان مناسب
Captionشامل گفتار و اطلاعات شنیداری مهم مانند موسیقی و صدای محیط
Closed Captionزیرنویسی که کاربر می‌تواند روشن یا خاموش کند
Open Captionمتنی که روی تصویر چسبیده و قابل خاموش‌کردن نیست

نمونه Caption:

[صدای باران]
امروز درباره مدل‌های هوش مصنوعی صحبت می‌کنیم.

نمونه Subtitle:

امروز درباره مدل‌های هوش مصنوعی صحبت می‌کنیم.

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

زیرنویس خودکار چه کاربردهایی دارد؟

  • ویدئوهای اینستاگرام و شبکه‌های اجتماعی
  • ویدئوهای YouTube
  • دوره‌های آموزشی
  • وبینار
  • جلسه کاری
  • مصاحبه
  • پادکست و Audiogram
  • فیلم کوتاه
  • مستند
  • محتوای خبری
  • ویدئوهای شرکتی
  • ویدئوی معرفی محصول
  • آرشیوهای صوتی و تصویری
  • بهبود دسترس‌پذیری
  • جست‌وجو داخل محتوای ویدئویی
  • ساخت خلاصه و فصل‌بندی ویدئو
  • ترجمه ویدئو به زبان‌های دیگر

زیرنویس خودکار چگونه ساخته می‌شود؟

گردش‌کار کامل:

ویدئو یا فایل صوتی
↓
استخراج و استانداردسازی صدا
↓
حذف نویز ملایم
↓
تشخیص گفتار با VAD
↓
Speech-to-Text
↓
تولید Timestamp
↓
اصلاح نگارشی
↓
تقسیم متن به Caption
↓
Forced Alignment
↓
کنترل کیفیت
↓
خروجی SRT یا VTT

اگر ترجمه نیز لازم باشد:

متن زمان‌بندی‌شده
↓
ترجمه با حفظ شناسه هر Cue
↓
اصلاح طول جمله
↓
بازبینی اصطلاحات
↓
کنترل زمان نمایش
↓
خروجی زیرنویس ترجمه‌شده

مهم‌ترین فرمت‌های زیرنویس

فایل SRT چیست؟

SRT یا SubRip Subtitle یکی از رایج‌ترین فرمت‌های زیرنویس است. این فایل متنی شامل شماره، زمان شروع، زمان پایان و متن زیرنویس است.

نمونه:

1
00:00:01,200 --> 00:00:04,600
سلام. به آموزش ساخت زیرنویس خودکار خوش آمدید.

2
00:00:05,000 --> 00:00:08,900
در این ویدئو، یک فایل فارسی SRT تولید می‌کنیم.

ساختار هر Cue:

شماره

زمان شروع --> زمان پایان

متن

در SRT میلی‌ثانیه با ویرگول جدا می‌شود:

00:01:24,500

فایل VTT چیست؟

WebVTT برای نمایش متن زمان‌بندی‌شده در پخش‌کننده‌های وب طراحی شده است.

نمونه:

WEBVTT

00:00:01.200 --> 00:00:04.600
سلام. به آموزش ساخت زیرنویس خودکار خوش آمدید.

00:00:05.000 --> 00:00:08.900
در این ویدئو، یک فایل فارسی VTT تولید می‌کنیم.

تفاوت مهم:

  • فایل VTT با WEBVTT شروع می‌شود.
  • جداکننده میلی‌ثانیه در VTT نقطه است.
  • WebVTT امکانات بیشتری برای موقعیت و Style در وب دارد.
  • شماره‌گذاری Cue در VTT الزامی نیست.

MDN، WebVTT را فرمتی متنی برای نمایش Trackهای زمان‌بندی‌شده همراه ویدئو و صوت معرفی می‌کند. مستندات WebVTT در MDN

فرمت‌های دیگر

  • ASS و SSA برای Style پیشرفته
  • TTML برای پلتفرم‌ها و Workflowهای حرفه‌ای
  • SCC و MCC برای Broadcast
  • SBV برای برخی کاربردهای ویدئویی
  • JSON برای پردازش برنامه‌نویسی
  • TXT برای Transcript ساده

برای بیشتر کاربران، SRT بهترین نقطه شروع است. برای پخش‌کننده HTML5، VTT انتخاب مناسب‌تری محسوب می‌شود.

تفاوت زیرنویس جدا و زیرنویس چسبیده

زیرنویس جدا یا Soft Subtitle

فایل SRT یا VTT جدا از ویدئو نگه‌داری می‌شود.

مزایا:

  • قابلیت روشن و خاموش‌شدن
  • امکان انتخاب چند زبان
  • ویرایش آسان
  • مناسب YouTube و پخش‌کننده وب
  • بدون Encode مجدد ویدئو
  • مناسب دسترس‌پذیری

زیرنویس چسبیده یا Hard Subtitle

متن مستقیماً روی فریم‌های ویدئو Render می‌شود.

مزایا:

  • در تمام پخش‌کننده‌ها دیده می‌شود.
  • مناسب Reels، Story و ویدئوهای کوتاه است.
  • ظاهر و فونت کاملاً کنترل می‌شود.

محدودیت‌ها:

  • قابل خاموش‌کردن نیست.
  • ترجمه به زبان دیگر نیازمند خروجی جدید است.
  • خطای متن پس از Render به‌سادگی اصلاح نمی‌شود.
  • بخشی از تصویر را می‌پوشاند.
  • برای دسترس‌پذیری ساختاریافته کافی نیست.

بهترین روش این است که فایل زیرنویس اصلی را نگه دارید و در صورت نیاز یک نسخه چسبیده نیز بسازید.

بهترین فایل ورودی برای ساخت زیرنویس

دقت Speech-to-Text به کیفیت صدا وابسته است.

فایل مناسب:

  • گفتار واضح دارد.
  • نویز محیط آن کم است.
  • گوینده به میکروفون نزدیک است.
  • موسیقی از گفتار بلندتر نیست.
  • اکو شدید ندارد.
  • چند نفر هم‌زمان صحبت نمی‌کنند.
  • صدای اصلی چند بار فشرده نشده است.
  • Clipping ندارد.
  • Sample Rate مناسبی دارد.

اگر نسخه اصلی ویدئو موجود است، از نسخه دریافت‌شده در پیام‌رسان استفاده نکنید.

آموزش ساخت زیرنویس خودکار فارسی

مرحله اول: فایل اصلی را آماده کنید

ابتدا موارد زیر را بررسی کنید:

  • مدت ویدئو
  • زبان گفتار
  • تعداد گویندگان
  • کیفیت صدا
  • وجود موسیقی
  • وجود اصطلاحات تخصصی
  • نوع خروجی موردنیاز
  • نیاز یا عدم نیاز به ترجمه
  • SRT یا VTT بودن خروجی

مرحله دوم: صدا را از فیلم استخراج کنید

برای Speech-to-Text نیازی نیست همیشه فایل ویدئویی کامل به مدل ارسال شود. می‌توانید صدا را استخراج کنید.

نمونه FFmpeg:

ffmpeg -i input.mp4 \
  -vn \
  -ac 1 \
  -ar 16000 \
  -c:a pcm_s16le \
  transcription-input.wav

پارامترها:

  • -vn ویدئو را حذف می‌کند.
  • -ac 1 صدا را Mono می‌کند.
  • -ar 16000 Sample Rate را روی 16kHz قرار می‌دهد.
  • pcm_s16le خروجی WAV بدون فشرده‌سازی تولید می‌کند.

این تنظیمات برای بسیاری از مدل‌های گفتار مناسب‌اند، اما مستندات مدل انتخابی اولویت دارد. بعضی مدل‌ها می‌توانند مستقیماً فایل MP3، M4A، MP4 یا WebM را دریافت کنند.

مرحله سوم: نویز را ملایم کاهش دهید

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

نمونه:

ffmpeg -i transcription-input.wav \
  -af "highpass=f=70,afftdn=nf=-25" \
  -c:a pcm_s16le \
  cleaned-audio.wav

هم فایل اصلی و هم نسخه تمیزشده را روی یک بخش کوتاه آزمایش کنید. گاهی مدل Speech-to-Text با فایل اصلی نتیجه بهتری می‌دهد.

مرحله چهارم: زبان را مشخص کنید

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

  • ویدئوی کوتاه
  • جمله‌های ترکیبی فارسی و انگلیسی
  • موسیقی طولانی در ابتدای فایل
  • لهجه
  • نویز شدید
  • نام‌های خاص
  • گفتار بسیار کم

کد زبان فارسی معمولاً fa است، اما باید مقدار موردپشتیبانی مدل را بررسی کنید.

مرحله پنجم: Transcript زمان‌دار بگیرید

خروجی مطلوب بهتر است حداقل این اطلاعات را داشته باشد:

{
  "language": "fa",
  "segments": [
    {
      "id": 0,
      "start": 1.2,
      "end": 4.6,
      "text": "سلام. به آموزش ساخت زیرنویس خودکار خوش آمدید."
    }
  ]
}

Transcript بدون Timestamp برای ساخت SRT کافی نیست، مگر اینکه بعداً Forced Alignment انجام شود.

مرحله ششم: متن را اصلاح کنید

Speech-to-Text ممکن است در این موارد اشتباه کند:

  • نام افراد
  • نام برند
  • اصطلاحات فنی
  • کلمات انگلیسی
  • اعداد
  • تاریخ
  • آدرس سایت
  • کلمات هم‌آوا
  • نیم‌فاصله
  • علائم نگارشی

فهرستی از اصطلاحات مهم تهیه کنید:

درواره
API
هوش مصنوعی
OpenAI-Compatible
پرامپت
توکن
Python
JavaScript
Speech-to-Text

در صورت پشتیبانی مدل، این واژه‌ها را در Prompt اولیه یا Vocabulary وارد کنید.

مرحله هفتم: متن را به Cueهای خوانا تقسیم کنید

خروجی خام مدل ممکن است جمله‌های بسیار بلند یا بسیار کوتاه تولید کند.

یک زیرنویس مناسب:

  • ترجیحاً یک یا دو خط دارد.
  • هم‌زمان با شروع گفتار ظاهر می‌شود.
  • قبل از پایان طبیعی جمله ناپدید نمی‌شود.
  • مدت کافی برای خواندن دارد.
  • وسط یک ترکیب معنایی شکسته نمی‌شود.
  • چند جمله نامرتبط را در یک Cue قرار نمی‌دهد.
  • روی Cut تصویر باقی نمی‌ماند، مگر در صورت نیاز.
  • بیش‌ازحد پایین یا نزدیک لبه نیست.

اصول تقسیم متن فارسی

جمله را در این نقاط می‌توان شکست:

  • پایان جمله
  • ویرگول طبیعی
  • قبل از حرف ربط، در صورت حفظ معنا
  • میان دو عبارت مستقل
  • تغییر گوینده
  • مکث طولانی
  • تغییر Shot

شکست نامناسب:

امروز می‌خواهیم درباره هوش
مصنوعی صحبت کنیم.

شکست بهتر:

امروز می‌خواهیم
درباره هوش مصنوعی صحبت کنیم.

عبارت‌های معنایی مهم را از هم جدا نکنید:

  • «هوش مصنوعی»
  • «رابط برنامه‌نویسی»
  • «پایگاه داده»
  • «مدل زبانی بزرگ»
  • نام و نام خانوادگی
  • عدد و واحد
  • فعل مرکب

مدت مناسب نمایش زیرنویس

عدد ثابت و جهانی برای تمام محتوا وجود ندارد. مدت نمایش باید براساس طول متن، سرعت گفتار، اندازه نمایشگر و مخاطب تعیین شود.

به‌عنوان نقطه شروع:

  • Cue بسیار کوتاه نباشد.
  • زیرنویس کوتاه پس از پایان کلمه فوراً ناپدید نشود.
  • Cue بسیار طولانی روی چند جمله باقی نماند.
  • سرعت خواندن روی موبایل آزمایش شود.
  • متن بیشتر از دو خط نشود، مگر در کاربرد خاص.

سیستم حرفه‌ای باید تعداد کاراکتر، تعداد واژه و زمان نمایش را بررسی و Cueهای غیرقابل‌خواندن را علامت‌گذاری کند.

همگام‌سازی Timestamp

سه سطح زمان‌بندی وجود دارد:

زمان‌بندی Segment

هر جمله یا عبارت یک زمان شروع و پایان دارد. برای SRT معمولی کافی است.

زمان‌بندی Word-level

هر کلمه Timestamp جداگانه دارد. برای زیرنویس کلمه‌به‌کلمه، Karaoke Caption و اصلاح دقیق مناسب است.

Forced Alignment

اگر متن صحیح در اختیار دارید، Forced Alignment متن را با صدای واقعی هماهنگ می‌کند. این روش برای کتاب صوتی، دوبله، ترجمه و بازتنظیم زیرنویس مفید است.

WhisperX از Forced Alignment برای تولید Timestampهای دقیق‌تر در سطح کلمه و همچنین قابلیت Diarization استفاده می‌کند. مخزن رسمی WhisperX

پشتیبانی Alignment از هر زبان به مدل هم‌ترازی مربوط است؛ بنابراین باید پشتیبانی واقعی فارسی در نسخه و مدل انتخابی آزمایش شود.

Whisper چیست؟

Whisper یک مدل تشخیص گفتار چندزبانه و چندوظیفه‌ای است که برای رونویسی، تشخیص زبان و ترجمه گفتار طراحی شده است. نسخه متن‌باز آن را می‌توان روی سیستم شخصی یا سرور اجرا کرد. مخزن رسمی OpenAI Whisper

مزایای اجرای محلی:

  • کنترل بیشتر بر فایل‌ها
  • عدم ارسال صدا به سرویس خارجی
  • امکان پردازش Batch
  • تنظیم مدل و سخت‌افزار
  • مناسب پروژه‌های دارای حریم خصوصی، پس از طراحی امنیتی مناسب

محدودیت‌ها:

  • نیاز به CPU یا GPU
  • زمان نصب و پردازش
  • مدیریت مدل‌ها
  • نیاز به Chunking
  • نیاز به اصلاح Timestamp
  • نیاز به بازبینی متن فارسی
  • مسئولیت کامل نگهداری زیرساخت

نصب و اجرای Whisper به‌صورت محلی

نیازمندی‌های دقیق ممکن است با نسخه پروژه تغییر کنند. همچنین FFmpeg باید روی سیستم نصب باشد.

نمونه نصب:

python -m pip install -U openai-whisper

نمونه اجرای فارسی:

whisper input.mp4 \
  --language Persian \
  --task transcribe \
  --output_format srt \
  --output_dir subtitles

برای خروجی‌های دیگر:

whisper input.mp4 \
  --language Persian \
  --task transcribe \
  --output_format all \
  --output_dir subtitles

نام مدل و گزینه‌های دقیق را از مستندات نسخه نصب‌شده بررسی کنید.

انتخاب مدل Speech-to-Text

مدل بزرگ‌تر الزاماً برای همه پروژه‌ها بهترین انتخاب نیست.

معیارهای انتخاب:

  • دقت فارسی
  • سرعت
  • هزینه
  • حافظه GPU
  • پشتیبانی Timestamp
  • تشخیص گوینده
  • Streaming
  • امکان Prompt یا Vocabulary
  • پشتیبانی فایل‌های طولانی
  • سیاست حفظ داده
  • قابلیت Batch
  • پشتیبانی از نویز و لهجه

برای ویدئوی کوتاه شبکه اجتماعی، سرعت ممکن است مهم‌تر باشد. برای مصاحبه تخصصی، دقت و Vocabulary اهمیت بیشتری دارد.

ساخت فایل SRT با Python

اگر خروجی مدل شامل Segmentهای زمان‌دار باشد، می‌توان آن‌ها را به SRT تبدیل کرد.

def srt_timestamp(seconds: float) -> str:
    milliseconds = round(seconds * 1000)

    hours = milliseconds // 3_600_000
    milliseconds %= 3_600_000

    minutes = milliseconds // 60_000
    milliseconds %= 60_000

    secs = milliseconds // 1000
    millis = milliseconds % 1000

    return f"{hours:02}:{minutes:02}:{secs:02},{millis:03}"


def segments_to_srt(segments):
    blocks = []

    for index, segment in enumerate(segments, start=1):
        start = srt_timestamp(segment["start"])
        end = srt_timestamp(segment["end"])
        text = segment["text"].strip()

        blocks.append(
            f"{index}\n"
            f"{start} --> {end}\n"
            f"{text}\n"
        )

    return "\n".join(blocks)


segments = [
    {
        "start": 1.2,
        "end": 4.6,
        "text": "سلام. به آموزش ساخت زیرنویس خودکار خوش آمدید."
    },
    {
        "start": 5.0,
        "end": 8.9,
        "text": "در این ویدئو، یک فایل فارسی SRT تولید می‌کنیم."
    }
]

srt_content = segments_to_srt(segments)

with open("subtitles-fa.srt", "w", encoding="utf-8-sig") as file:
    file.write(srt_content)

استفاده از utf-8-sig می‌تواند سازگاری فارسی را با بعضی نرم‌افزارها بهتر کند، اما UTF-8 استاندارد بدون BOM نیز در بسیاری از سیستم‌ها درست کار می‌کند.

ساخت فایل VTT با Python

def vtt_timestamp(seconds: float) -> str:
    milliseconds = round(seconds * 1000)

    hours = milliseconds // 3_600_000
    milliseconds %= 3_600_000

    minutes = milliseconds // 60_000
    milliseconds %= 60_000

    secs = milliseconds // 1000
    millis = milliseconds % 1000

    return f"{hours:02}:{minutes:02}:{secs:02}.{millis:03}"


def segments_to_vtt(segments):
    blocks = ["WEBVTT\n"]

    for segment in segments:
        start = vtt_timestamp(segment["start"])
        end = vtt_timestamp(segment["end"])
        text = segment["text"].strip()

        blocks.append(
            f"{start} --> {end}\n"
            f"{text}\n"
        )

    return "\n".join(blocks)

نمایش زیرنویس VTT در HTML

<video controls width="960">
  <source src="/videos/tutorial.mp4" type="video/mp4">

  <track
    kind="subtitles"
    src="/subtitles/tutorial-fa.vtt"
    srclang="fa"
    label="فارسی"
    default
  >

  <track
    kind="subtitles"
    src="/subtitles/tutorial-en.vtt"
    srclang="en"
    label="English"
  >
</video>

سرور باید فایل VTT را با Content-Type مناسب ارائه کند:

text/vtt

همچنین تنظیمات CORS باید اجازه دریافت فایل زیرنویس را به پخش‌کننده بدهد.

چسباندن زیرنویس به ویدئو با FFmpeg

برای Render کردن SRT روی ویدئو:

ffmpeg -i input.mp4 \
  -vf "subtitles=subtitles-fa.srt" \
  -c:v libx264 \
  -preset slow \
  -crf 18 \
  -c:a copy \
  output-with-subtitles.mp4

در برخی سیستم‌ها باید مسیر فونت یا Style نیز مشخص شود. پشتیبانی فارسی به Build کتابخانه، فونت و موتور Render وابسته است.

نمونه Style:

ffmpeg -i input.mp4 \
  -vf "subtitles=subtitles-fa.srt:force_style='FontName=Vazirmatn,FontSize=22,Alignment=2,Outline=2,Shadow=0'" \
  -c:v libx264 \
  -preset slow \
  -crf 18 \
  -c:a copy \
  output-fa.mp4

پیش از Render کامل، یک خروجی کوتاه بگیرید و موارد زیر را بررسی کنید:

  • اتصال حروف فارسی
  • راست‌به‌چپ بودن متن
  • نمایش صحیح نیم‌فاصله
  • جای علائم نگارشی
  • ترتیب کلمات فارسی و انگلیسی
  • اندازه فونت
  • Safe Area
  • خوانایی روی پس‌زمینه روشن و تیره

نمایش صحیح فارسی و RTL

زیرنویس فارسی چالش‌های خاصی دارد:

  • جهت راست‌به‌چپ
  • ترکیب فارسی و English
  • اعداد فارسی و لاتین
  • نیم‌فاصله
  • پرانتز و دونقطه
  • علامت سؤال فارسی
  • نشانی اینترنتی
  • API و نام مدل‌ها
  • شکستن خط
  • پشتیبانی فونت

نمونه مشکل:

API درواره از Python پشتیبانی می‌کند؟

ممکن است در بعضی نرم‌افزارها ترتیب بصری اجزا اشتباه شود. فایل را در نرم‌افزار مقصد آزمایش کنید و فقط به ظاهر آن در Text Editor اعتماد نکنید.

برای زیرنویس چسبیده، فونتی با پشتیبانی کامل فارسی مانند Vazirmatn یا فونت مناسب دارای مجوز استفاده انتخاب کنید.

علائم نگارشی در زیرنویس فارسی

اصول مهم:

  • پایان جمله کامل با نقطه مشخص شود.
  • از ویرگول بیش‌ازحد استفاده نشود.
  • علامت سؤال فارسی «؟» به‌کار رود.
  • فاصله قبل از علامت نگارشی حذف شود.
  • نیم‌فاصله در واژه‌هایی مانند «می‌شود» رعایت شود.
  • جمله ناتمام با سه‌نقطه بی‌دلیل تمام نشود.
  • گفتار شکسته را بیش‌ازحد رسمی نکنید.
  • لحن گوینده حفظ شود.
  • تکیه‌کلام‌های غیرضروری با سیاست ثابت مدیریت شوند.

برای محتوای آموزشی، متن می‌تواند کمی تمیزتر از گفتار باشد. برای مصاحبه پژوهشی یا حقوقی، حذف تکیه‌کلام‌ها ممکن است معنای Transcript را تغییر دهد.

تشخیص گوینده یا Speaker Diarization

Diarization پاسخ می‌دهد: «چه کسی، چه زمانی صحبت کرده است؟»

نمونه:

گوینده ۱: امروز درباره API هوش مصنوعی صحبت می‌کنیم.

گوینده ۲: ابتدا از معماری سیستم شروع کنیم.

Diarization با تشخیص هویت واقعی فرد یکسان نیست. معمولاً سیستم فقط برچسب‌هایی مانند Speaker 1 و Speaker 2 تولید می‌کند.

خطاهای رایج:

  • صحبت هم‌زمان
  • شباهت زیاد صداها
  • فایل کوتاه
  • تغییر میکروفون یک گوینده
  • اکو
  • موسیقی
  • قطع و وصل زیاد
  • صدای تلفنی

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

ساخت زیرنویس کلمه‌به‌کلمه برای Reels

در زیرنویس پویا، کلمات هنگام بیان برجسته می‌شوند. این روش به Word-level Timestamp نیاز دارد.

ساختار داده:

{
  "words": [
    {
      "word": "امروز",
      "start": 0.42,
      "end": 0.81
    },
    {
      "word": "درباره",
      "start": 0.82,
      "end": 1.18
    },
    {
      "word": "هوش",
      "start": 1.19,
      "end": 1.45
    },
    {
      "word": "مصنوعی",
      "start": 1.46,
      "end": 1.92
    }
  ]
}

برای فارسی باید فاصله، نیم‌فاصله و ترکیب کلمات به‌دقت مدیریت شود. نمایش هر کلمه به‌صورت مستقل همیشه بهترین تجربه نیست؛ گروه‌های دو یا سه‌کلمه‌ای می‌توانند خواناتر باشند.

ترجمه زیرنویس با هوش مصنوعی

ترجمه فایل SRT نباید زمان‌بندی را تغییر دهد، مگر اینکه مرحله Retiming جداگانه انجام شود.

روش نادرست:

  • ارسال کل فایل به مدل و درخواست ترجمه آزاد
  • اعتماد به خروجی بدون اعتبارسنجی
  • تغییر شماره Cueها
  • حذف Timestampها
  • ادغام یا تفکیک بی‌قاعده Cueها

روش بهتر:

  1. SRT را Parse کنید.
  2. هر Cue را به یک رکورد JSON تبدیل کنید.
  3. شناسه و Timestamp را قفل کنید.
  4. فقط متن را ترجمه کنید.
  5. خروجی را با Schema اعتبارسنجی کنید.
  6. SRT را دوباره بسازید.
  7. سرعت خواندن را بررسی کنید.

ساختار ورودی:

[
  {
    "id": 1,
    "start": "00:00:01,200",
    "end": "00:00:04,600",
    "text": "سلام. به آموزش ساخت زیرنویس خوش آمدید."
  }
]

پرامپت ترجمه:

متن هر Cue را از فارسی به انگلیسی ترجمه کن.

قوانین:
- id، start و end را مطلقاً تغییر نده.
- هیچ Cue را حذف، ادغام یا تقسیم نکن.
- فقط مقدار text را ترجمه کن.
- ترجمه طبیعی، کوتاه و مناسب زیرنویس باشد.
- نام برندها، APIها و کلمات فنی را دقیق حفظ کن.
- فقط JSON معتبر مطابق ساختار ورودی برگردان.

اصلاح زیرنویس با واژه‌نامه

برای محتوای تخصصی یک Glossary بسازید:

{
  "درواره": "Darvareh",
  "رابط برنامه‌نویسی": "API",
  "هوش مصنوعی مولد": "Generative AI",
  "مدل زبانی بزرگ": "Large Language Model",
  "پرامپت": "Prompt",
  "توکن": "Token",
  "عامل هوش مصنوعی": "AI Agent"
}

در ترجمه چندقسمتی، واژه‌نامه باید در تمام Batchها ثابت باشد تا اصطلاحات به شکل‌های متفاوت ترجمه نشوند.

ساخت زیرنویس در Adobe Premiere

Adobe Premiere دارای Workflow تبدیل گفتار به متن و ایجاد Caption است. در نسخه‌های پشتیبانی‌شده:

  1. ویدئو را وارد پروژه کنید.
  2. پنل Text را باز کنید.
  3. Transcript را ایجاد کنید.
  4. زبان و تنظیمات تحلیل صوت را انتخاب کنید.
  5. در صورت پشتیبانی، Speaker Labeling را تنظیم کنید.
  6. متن را اصلاح کنید.
  7. از Transcript، Caption بسازید.
  8. طول، Style و موقعیت Caption را تنظیم کنید.
  9. SRT را Export یا زیرنویس را روی ویدئو Render کنید.

Adobe در مستندات Premiere، Speech-to-Text را برای ایجاد Transcript و Caption خودکار معرفی می‌کند و امکان تحلیل Track مشخص یا محدوده In و Out را توضیح می‌دهد. راهنمای رسمی Speech-to-Text در Premiere

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

ساخت زیرنویس خودکار در YouTube

YouTube برای برخی زبان‌ها و ویدئوها Caption خودکار تولید می‌کند، اما نتیجه باید بازبینی شود.

گردش‌کار حرفه‌ای:

  1. ویدئو را بارگذاری کنید.
  2. زبان اصلی ویدئو را درست تعیین کنید.
  3. منتظر پردازش Caption بمانید.
  4. متن و زمان‌بندی را بازبینی کنید.
  5. نام‌ها و اصطلاحات را اصلاح کنید.
  6. در صورت نیاز فایل زیرنویس خودتان را بارگذاری کنید.
  7. نمایش Caption را روی موبایل و دسکتاپ بررسی کنید.

YouTube به کاربر اجازه می‌دهد Subtitle/CC را فعال یا غیرفعال و Style نمایشی را تنظیم کند. راهنمای رسمی Caption در YouTube

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

اتصال Speech-to-Text به API درواره

درواره یک پلتفرم API هوش مصنوعی است و اپلیکیشن آماده تدوین زیرنویس ارائه نمی‌کند. توسعه‌دهندگان می‌توانند مدل‌های Speech-to-Text موجود در کاتالوگ را برای ساخت سرویس زیرنویس خودکار استفاده کنند.

قابلیت‌های هر مدل متفاوت است. پیش از انتخاب بررسی کنید:

  • زبان فارسی را پشتیبانی می‌کند؟
  • Timestamp بخش‌ها را می‌دهد؟
  • Word-level Timestamp دارد؟
  • Speaker Diarization دارد؟
  • فایل ویدئو را می‌پذیرد یا فقط صوت؟
  • حداکثر حجم و مدت چقدر است؟
  • Prompt یا Vocabulary دارد؟
  • خروجی SRT یا VTT مستقیم می‌دهد؟
  • پاسخ Sync است یا Async؟
  • Streaming دارد؟
  • هزینه براساس دقیقه، ثانیه یا درخواست است؟

Base URL درواره:

https://api.darvareh.ir/v1

نمونه درخواست با cURL:

curl https://api.darvareh.ir/v1/audio/transcriptions \
  -H "Authorization: Bearer YOUR_DARVAREH_API_KEY" \
  -F "file=@cleaned-audio.wav" \
  -F "model=YOUR_TRANSCRIPTION_MODEL_ID" \
  -F "language=fa" \
  -F "response_format=verbose_json"

این پارامترها باید با مستندات مدل انتخابی تطبیق داده شوند. همه مدل‌ها الزاماً verbose_json، زبان صریح یا Timestamp یکسان را پشتیبانی نمی‌کنند.

API Key را فقط در Backend نگه دارید.

نمونه Python برای دریافت Transcript

import os
import requests

url = "https://api.darvareh.ir/v1/audio/transcriptions"

headers = {
    "Authorization": f"Bearer {os.environ['DARVAREH_API_KEY']}"
}

with open("cleaned-audio.wav", "rb") as audio_file:
    files = {
        "file": ("cleaned-audio.wav", audio_file, "audio/wav")
    }

    data = {
        "model": os.environ["DARVAREH_TRANSCRIPTION_MODEL"],
        "language": "fa",
        "response_format": "verbose_json"
    }

    response = requests.post(
        url,
        headers=headers,
        files=files,
        data=data,
        timeout=300
    )

response.raise_for_status()
result = response.json()

print(result)

در محیط Production باید Timeout، Retry، محدودیت حجم، خطای 429 و فرمت‌های متفاوت پاسخ مدیریت شوند.

پردازش فایل‌های طولانی

فایل‌های طولانی ممکن است از محدودیت حجم یا مدت مدل عبور کنند. راهکار استاندارد Chunking است.

مراحل:

  1. تشخیص سکوت و مرز طبیعی
  2. تقسیم فایل با کمی Overlap
  3. ارسال Chunkها به Speech-to-Text
  4. اضافه‌کردن Offset زمانی
  5. حذف متن تکراری Overlap
  6. ادغام Segmentها
  7. Forced Alignment یا Retiming
  8. ساخت SRT نهایی

نمونه تقسیم فایل به قطعات ده‌دقیقه‌ای:

ffmpeg -i input.wav \
  -f segment \
  -segment_time 600 \
  -c copy \
  chunks/chunk-%03d.wav

تقسیم دقیق روی زمان ثابت ممکن است جمله را از وسط قطع کند. استفاده از VAD و مرز سکوت معمولاً بهتر است.

اصلاح Timestamp قطعات

اگر Chunk دوم از ثانیه 600 شروع شده باشد، زمان Segmentهای آن باید 600 ثانیه افزایش پیدا کند.

def apply_offset(segments, offset_seconds):
    return [
        {
            **segment,
            "start": segment["start"] + offset_seconds,
            "end": segment["end"] + offset_seconds
        }
        for segment in segments
    ]

برای Chunk دارای Overlap باید تکرارهای مرزی نیز حذف شوند.

معماری سرویس ساخت زیرنویس

کاربر
↓
آپلود ویدئو
↓
استخراج Metadata
↓
استخراج و استانداردسازی صدا
↓
ساخت Job
↓
VAD و Chunking
↓
Speech-to-Text
↓
Alignment و Diarization
↓
اصلاح متن
↓
تقسیم Caption
↓
ترجمه اختیاری
↓
تولید SRT و VTT
↓
ویرایشگر آنلاین
↓
دانلود یا Render ویدئو

مدل داده پیشنهادی

CREATE TABLE subtitle_jobs (
  id UUID PRIMARY KEY,
  user_id UUID NOT NULL,
  input_object_key TEXT NOT NULL,
  audio_object_key TEXT,
  source_language TEXT,
  target_language TEXT,
  status TEXT NOT NULL DEFAULT 'queued',
  transcription_model TEXT NOT NULL,
  duration_seconds NUMERIC,
  diarization_enabled BOOLEAN DEFAULT FALSE,
  word_timestamps_enabled BOOLEAN DEFAULT FALSE,
  transcript JSONB,
  subtitle_format TEXT DEFAULT 'srt',
  output_object_key TEXT,
  error_code TEXT,
  estimated_cost BIGINT,
  final_cost BIGINT,
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  completed_at TIMESTAMPTZ,
  expires_at TIMESTAMPTZ NOT NULL
);

ساختار Cue در پایگاه داده

{
  "id": "cue_00042",
  "start_ms": 72400,
  "end_ms": 76850,
  "speaker": "speaker_1",
  "source_text": "امروز درباره API هوش مصنوعی صحبت می‌کنیم.",
  "edited_text": "امروز درباره API هوش مصنوعی صحبت می‌کنیم.",
  "translated_text": null,
  "confidence": 0.91,
  "needs_review": false
}

ذخیره زمان به میلی‌ثانیه صحیح از مشکلات اعشاری جلوگیری می‌کند.

وضعیت‌های Job

created
uploading
uploaded
extracting_audio
denoising
chunking
transcribing
aligning
segmenting
translating
quality_check
ready_for_review
exporting
succeeded
failed
cancelled
expired

کنترل کیفیت خودکار

سیستم می‌تواند Cueهای مشکوک را علامت‌گذاری کند:

  • Confidence پایین
  • طول متن زیاد
  • زمان نمایش کوتاه
  • هم‌پوشانی Timestamp
  • فاصله زمانی منفی
  • Cue خالی
  • وجود تکرار
  • کلمه نامفهوم
  • کاراکتر خراب
  • متن بدون علائم نگارشی
  • تغییر ناگهانی زبان
  • عدد یا نام خاص
  • Cue خارج از مدت ویدئو

نمونه:

function validateCue(cue, videoDurationMs) {
  const issues = [];

  if (cue.start_ms < 0) {
    issues.push("negative_start");
  }

  if (cue.end_ms <= cue.start_ms) {
    issues.push("invalid_duration");
  }

  if (cue.end_ms > videoDurationMs) {
    issues.push("after_video_end");
  }

  if (!cue.text.trim()) {
    issues.push("empty_text");
  }

  const durationSeconds =
    (cue.end_ms - cue.start_ms) / 1000;

  const charsPerSecond =
    cue.text.length / durationSeconds;

  if (charsPerSecond > 22) {
    issues.push("reading_speed_too_high");
  }

  return issues;
}

عدد 22 فقط یک Threshold نمونه برای علامت‌گذاری اولیه است و باید با زبان، فونت، پلتفرم و مخاطب تنظیم شود.

ویرایشگر آنلاین زیرنویس باید چه امکاناتی داشته باشد؟

  • Waveform صدا
  • پخش و توقف با میان‌بر
  • نمایش Cue فعلی
  • ویرایش زمان شروع و پایان
  • Split و Merge
  • جست‌وجو و جایگزینی
  • واژه‌نامه
  • تشخیص خطا
  • Undo و Redo
  • تغییر سرعت پخش
  • نمایش Safe Area
  • پیش‌نمایش RTL
  • ترجمه کنار متن اصلی
  • ذخیره خودکار
  • نسخه‌بندی
  • خروجی SRT و VTT
  • واردکردن SRT موجود
  • Keyboard Shortcut

امنیت و حریم خصوصی

ویدئو و صوت می‌توانند شامل اطلاعات خصوصی، جلسه سازمانی یا صدای قابل شناسایی افراد باشند.

اصول امنیتی:

  • فایل در Storage خصوصی نگه‌داری شود.
  • از Signed URL کوتاه‌عمر استفاده شود.
  • API Key در Frontend قرار نگیرد.
  • فایل‌ها پس از زمان مشخص حذف شوند.
  • Transcript نیز داده حساس در نظر گرفته شود.
  • Logها متن کامل گفتگو را ذخیره نکنند.
  • دسترسی کارکنان محدود و ثبت شود.
  • رضایت افراد برای ضبط و پردازش رعایت شود.
  • فایل بدون اجازه برای آموزش مدل استفاده نشود.
  • امکان حذف فوری پروژه وجود داشته باشد.
  • داده در Transit و At Rest رمزگذاری شود.
  • فایل‌های سازمانی با سیاست نگه‌داری مشخص پردازش شوند.

گاهی Transcript از خود فایل صوتی حساس‌تر است؛ زیرا جست‌وجو و استخراج اطلاعات از متن بسیار آسان‌تر خواهد بود.

کنترل هزینه تولید زیرنویس

هزینه نهایی ممکن است شامل این مراحل باشد:

  • آپلود و ذخیره فایل
  • استخراج صدا
  • حذف نویز
  • VAD
  • Speech-to-Text
  • Word Alignment
  • Diarization
  • ترجمه
  • اصلاح با مدل زبانی
  • Render زیرنویس
  • ذخیره و پهنای باند

برای کاهش هزینه:

  1. سکوت‌های طولانی را قبل از STT شناسایی کنید.
  2. فقط Track گفتار را ارسال کنید.
  3. ویدئو را به صوت Mono مناسب تبدیل کنید.
  4. از مدل متناسب با دقت لازم استفاده کنید.
  5. نتیجه هر Chunk را ذخیره کنید.
  6. در Retry فقط Chunk ناموفق را دوباره ارسال کنید.
  7. واژه‌نامه را قبل از ترجمه اعمال کنید.
  8. ترجمه را Batch کنید.
  9. فایل‌های میانی را طبق سیاست حذف کنید.
  10. هزینه را به تفکیک مرحله ثبت کنید.

خطاهای رایج زیرنویس فارسی

کلمات انگلیسی اشتباه‌اند

از Vocabulary یا Prompt استفاده کنید و نام محصولات را بعداً با Find and Replace اصلاح کنید.

Timestamp جلو یا عقب است

Forced Alignment، تأخیر صوتی و Offset کلی را بررسی کنید. ممکن است صدا و تصویر از ابتدا Sync نباشند.

جمله‌ها بسیار بلندند

Segmentها را براساس نشانه‌گذاری، مکث و سرعت خواندن دوباره تقسیم کنید.

زیرنویس فارسی به‌هم‌ریخته است

Encoding، فونت، موتور RTL و ترتیب متن ترکیبی فارسی و انگلیسی را بررسی کنید.

علائم نگارشی در سمت اشتباه قرار می‌گیرند

مشکل معمولاً به Bidirectional Text مربوط است. خروجی را در نرم‌افزار مقصد آزمایش و از فونت و Renderer سازگار استفاده کنید.

نام گویندگان اشتباه است

Diarization را دستی بازبینی کنید. برچسب Speaker به معنای شناخت هویت واقعی نیست.

کلمات در سکوت تولید می‌شوند

مدل دچار Hallucination شده است. از VAD، Prompt کنترل‌شده و فیلتر Segmentهای بدون گفتار استفاده کنید.

عبارت‌ها تکرار می‌شوند

Chunk Overlap یا ادغام Segmentها را بررسی کنید. مدل ممکن است در مرز قطعات متن را تکرار کند.

نکات حقوقی و اخلاقی

  • برای ضبط و پردازش گفت‌وگو رضایت لازم را رعایت کنید.
  • Transcript جلسه خصوصی را بدون اجازه منتشر نکنید.
  • زیرنویس ترجمه‌شده را به‌عنوان نقل‌قول دقیق بدون بازبینی استفاده نکنید.
  • نام افراد و اطلاعات حساس را کنترل کنید.
  • فایل اصلی را برای کاربردهای حقوقی حفظ کنید.
  • خطای AI را در محتوای حساس جدی بگیرید.
  • ترجمه نباید معنای گوینده را تغییر دهد.
  • در محتوای خبری و پژوهشی بازبینی انسانی ضروری است.
  • از زیرنویس جعلی برای نسبت‌دادن سخنان نادرست به افراد استفاده نکنید.
  • مجوز محتوا، موسیقی و ویدئو را رعایت کنید.

چک‌لیست نهایی تولید زیرنویس

پیش از رونویسی

  • بهترین فایل اصلی انتخاب شده است.
  • زبان گفتار مشخص است.
  • کیفیت صدا بررسی شده است.
  • اصطلاحات مهم در واژه‌نامه آمده‌اند.
  • خروجی SRT یا VTT مشخص شده است.
  • نیاز به Diarization تعیین شده است.
  • حریم خصوصی فایل بررسی شده است.

پس از رونویسی

  • نام‌ها و اصطلاحات اصلاح شده‌اند.
  • اعداد و تاریخ‌ها بررسی شده‌اند.
  • علائم نگارشی مناسب‌اند.
  • Timestampها با صدا هماهنگ‌اند.
  • جمله‌ها خوانا تقسیم شده‌اند.
  • Cueها هم‌پوشانی ندارند.
  • متن فارسی RTL درست نمایش داده می‌شود.
  • فایل با UTF-8 ذخیره شده است.

پیش از انتشار

  • زیرنویس روی موبایل آزمایش شده است.
  • دو خط بیشتر از حد لازم ایجاد نشده است.
  • متن روی اجزای مهم تصویر قرار ندارد.
  • ترجمه بازبینی شده است.
  • زیرنویس روی Cutهای تصویر بررسی شده است.
  • نسخه SRT اصلی نگه‌داری شده است.
  • نسخه چسبیده با فونت مناسب Render شده است.
  • فایل کامل از ابتدا تا انتها بازبینی شده است.

سؤالات متداول

چگونه برای فیلم زیرنویس فارسی خودکار بسازیم؟

صدا را از فیلم استخراج کنید، آن را به مدل Speech-to-Text فارسی بدهید، خروجی زمان‌دار دریافت کنید و Segmentها را به فایل SRT یا VTT تبدیل کنید. متن و زمان‌بندی باید قبل از انتشار بازبینی شوند.

بهترین فرمت زیرنویس چیست؟

برای بیشتر پخش‌کننده‌ها و نرم‌افزارهای تدوین، SRT مناسب است. برای ویدئوی HTML5 و وب، WebVTT انتخاب استانداردتری محسوب می‌شود.

آیا می‌توان زیرنویس را به فیلم چسباند؟

بله. با نرم‌افزارهای تدوین یا FFmpeg می‌توان فایل SRT را روی ویدئو Render کرد.

آیا Whisper زبان فارسی را پشتیبانی می‌کند؟

Whisper یک مدل چندزبانه است و می‌تواند گفتار فارسی را رونویسی کند، اما دقت آن به کیفیت صدا، لهجه، مدل انتخابی و محتوای تخصصی بستگی دارد.

آیا زیرنویس خودکار کاملاً دقیق است؟

خیر. نام‌ها، اصطلاحات، اعداد، گفتار هم‌زمان، نویز و زبان ترکیبی می‌توانند باعث خطا شوند. بازبینی انسانی ضروری است.

چگونه زیرنویس انگلیسی را به فارسی ترجمه کنیم؟

SRT را Parse کنید، Timestamp و شناسه‌ها را ثابت نگه دارید، فقط متن Cueها را ترجمه و سپس فایل را دوباره بسازید. ترجمه باید از نظر طول و زمان خواندن بررسی شود.

چرا زیرنویس فارسی برعکس نمایش داده می‌شود؟

مشکل ممکن است از Encoding، فونت، پشتیبانی RTL یا Renderer پخش‌کننده باشد. فایل را با UTF-8 ذخیره و در نرم‌افزار مقصد آزمایش کنید.

آیا می‌توان گویندگان را خودکار تشخیص داد؟

Speaker Diarization می‌تواند بخش‌های صوتی را به گویندگان مختلف نسبت دهد، اما نام واقعی آن‌ها را نمی‌داند و ممکن است در گفتار هم‌زمان اشتباه کند.

آیا درواره برنامه آماده زیرنویس‌ساز دارد؟

درواره پلتفرم API هوش مصنوعی است، نه اپلیکیشن آماده ساخت زیرنویس. توسعه‌دهندگان می‌توانند مدل‌های Speech-to-Text موجود را برای ساخت سرویس زیرنویس در Backend خود استفاده کنند.

آیا کلید API درواره را می‌توان در مرورگر قرار داد؟

خیر. API Key باید فقط در Backend نگه‌داری شود. مرورگر فایل را به سرور شما ارسال می‌کند و سرور با API درواره ارتباط می‌گیرد.

جمع‌بندی

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

برای یک نتیجه مناسب:

  • بهترین فایل صوتی را استفاده کنید.
  • زبان فارسی را صریحاً مشخص کنید.
  • نویز را با شدت ملایم کاهش دهید.
  • خروجی زمان‌دار بگیرید.
  • نام‌ها و اصطلاحات را اصلاح کنید.
  • Cueها را برای خواندن روی موبایل تقسیم کنید.
  • SRT و VTT را با UTF-8 ذخیره کنید.
  • Timestampها را با ویدئو بررسی کنید.
  • ترجمه را بدون تغییر شناسه‌ها و زمان‌ها انجام دهید.
  • زیرنویس خودکار را پیش از انتشار بازبینی کنید.

اگر توسعه‌دهنده هستید و می‌خواهید قابلیت تبدیل صدا به متن، تولید Transcript، ساخت زیرنویس یا ترجمه ویدئو را به محصول خود اضافه کنید، در درواره ثبت‌نام کنید، API Key بسازید و مدل‌های Speech-to-Text فعلی را از طریق Base URL استاندارد https://api.darvareh.ir/v1 در Backend نرم‌افزار خود به کار بگیرید.

مقالات مرتبط

Read more