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

در این راهنما یاد می‌گیرید چگونه ویس، فایل صوتی، جلسه، مصاحبه و ویدئو را با هوش مصنوعی به متن فارسی تبدیل کنید و یک سرویس Speech to Text با API درواره بسازید.

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

مقدمه

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

تایپ دستی یک فایل صوتی یک‌ساعته ممکن است چندین ساعت زمان ببرد. مدل‌های Speech to Text یا STT می‌توانند این فرایند را تا حد زیادی خودکار کنند و خروجی اولیه‌ای برای ویرایش، خلاصه‌سازی، جست‌وجو و انتشار در اختیار کاربر قرار دهند.

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

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

در این راهنما، روش تبدیل ویس و فایل صوتی به متن فارسی را بررسی می‌کنیم و سپس نحوه ساخت یک سرویس Speech to Text با API درواره را با مثال‌های cURL، Python و Node.js آموزش می‌دهیم.

تبدیل صدا به متن با هوش مصنوعی چیست؟

تبدیل صدا به متن یا Speech to Text فرایندی است که در آن یک مدل Automatic Speech Recognition یا ASR صدای انسان را دریافت و آن را به متن تبدیل می‌کند.

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

  • ویس ضبط‌شده با موبایل
  • فایل MP3 یا WAV
  • جلسه آنلاین
  • مصاحبه
  • صدای کلاس
  • پادکست
  • تماس پشتیبانی
  • ویدئو
  • سخنرانی
  • فایل ضبط‌شده از شبکه‌های اجتماعی
  • صدای زنده میکروفن

خروجی اولیه معمولاً یک Transcript یا رونوشت متنی است. مدل‌های پیشرفته‌تر ممکن است این اطلاعات را نیز ارائه کنند:

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

تفاوت Speech to Text، Transcription و Dictation

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

Speech to Text

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

Transcription

Transcription یا رونویسی معمولاً به تبدیل یک فایل صوتی یا ویدئویی ضبط‌شده به متن گفته می‌شود.

Dictation

در Dictation کاربر مستقیماً صحبت می‌کند تا متن همان لحظه در یک فرم، سند یا ویرایشگر تایپ شود.

اصطلاحکاربرد اصلی
Speech to Textمفهوم عمومی تبدیل گفتار به متن
Transcriptionرونویسی فایل صوتی یا ویدئو
Dictationتایپ صوتی و زنده
Realtime Transcriptionدریافت تدریجی متن هنگام صحبت
Speaker Diarizationمشخص‌کردن اینکه هر بخش را چه کسی گفته است
Subtitle Generationساخت زیرنویس زمان‌بندی‌شده

هوش مصنوعی چگونه صدا را به متن تبدیل می‌کند؟

فرایند ساده‌شده تبدیل صوت به متن شامل چند مرحله است.

دریافت و آماده‌سازی فایل

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

تشخیص بخش‌های دارای گفتار

سامانه Voice Activity Detection یا VAD بخش‌های سکوت را از قسمت‌های دارای گفتار جدا می‌کند.

قطعه‌بندی صوت

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

تشخیص زبان و گفتار

مدل ASR ویژگی‌های صوتی را پردازش و کلمات احتمالی را تشخیص می‌دهد.

بازسازی جمله و علائم نگارشی

خروجی خام به جمله‌های خواناتر تبدیل می‌شود و نقطه، ویرگول یا پاراگراف‌بندی به آن اضافه می‌شود.

اتصال بخش‌ها

Transcript قطعه‌های مختلف با حفظ ترتیب و Timestamp به یکدیگر متصل می‌شوند.

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

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

آیا تبدیل صدا به متن فارسی دقیق است؟

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

  • کیفیت میکروفن
  • نویز محیط
  • فاصله گوینده تا میکروفن
  • سرعت صحبت‌کردن
  • هم‌پوشانی صدای چند نفر
  • لهجه
  • اصطلاحات تخصصی
  • نام اشخاص و برندها
  • کیفیت فشرده‌سازی
  • موسیقی پس‌زمینه
  • بلندی نامتعادل صدا
  • انتخاب مدل
  • مشخص‌کردن زبان
  • Prompt یا واژه‌نامه کمکی

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

بهترین روش، آزمایش مدل با نمونه‌های واقعی همان کاربرد است.

چه فایل‌هایی را می‌توان به متن تبدیل کرد؟

فرمت‌های رایج در سیستم‌های Speech to Text عبارت‌اند از:

  • MP3
  • WAV
  • M4A
  • MP4
  • MPEG
  • MPGA
  • WebM
  • OGG
  • FLAC
  • AAC

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

اگر فرمت فایل پشتیبانی نمی‌شود، می‌توان آن را با FFmpeg تبدیل کرد.

نمونه تبدیل فایل به MP3:

ffmpeg -i input.m4a -ac 1 -ar 16000 -b:a 64k output.mp3

این فرمان:

  • صوت را تک‌کاناله می‌کند.
  • Sample Rate را روی ۱۶ کیلوهرتز قرار می‌دهد.
  • Bitrate را کاهش می‌دهد.
  • حجم مناسب‌تری برای پردازش گفتار ایجاد می‌کند.

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

کاربردهای تبدیل صدا به متن

تبدیل ویس به متن

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

پیاده‌سازی مصاحبه

پژوهشگران، خبرنگاران و تیم‌های منابع انسانی می‌توانند مصاحبه‌ها را رونویسی و سپس دسته‌بندی یا خلاصه کنند.

تبدیل صدای کلاس به جزوه

فایل صوتی کلاس می‌تواند به Transcript تبدیل شود و سپس مدل متنی آن را به جزوه‌ای ساختاریافته تبدیل کند.

مستندسازی جلسه

سیستم می‌تواند علاوه بر Transcript، موارد زیر را استخراج کند:

  • خلاصه جلسه
  • تصمیم‌ها
  • وظایف
  • مسئول هر وظیفه
  • موعدها
  • پرسش‌های بی‌پاسخ
  • موضوعات جلسه بعدی

تبدیل پادکست به مقاله

Transcript پادکست می‌تواند به این خروجی‌ها تبدیل شود:

  • مقاله وبلاگ
  • توضیحات اپیزود
  • خلاصه
  • نقل‌قول‌های کوتاه
  • پست شبکه اجتماعی
  • خبرنامه
  • Timestamp موضوعات

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

با استفاده از Timestamp می‌توان خروجی SRT یا VTT برای ویدئو تولید کرد.

تحلیل تماس‌های پشتیبانی

پس از رونویسی می‌توان موضوع تماس، رضایت مشتری، اقدام موردنیاز و نتیجه مکالمه را استخراج کرد.

جست‌وجو در آرشیو صوتی

Transcript فایل‌ها را می‌توان Index کرد تا کاربران به‌جای گوش‌دادن به تمام آرشیو، عبارت موردنظر را جست‌وجو کنند.

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

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

نمونه Transcript ساده:

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

نمونه SRT:

1
00:00:00,000 --> 00:00:03,500
سلام. در این جلسه درباره برنامه سه‌ماهه محصول صحبت می‌کنیم.

بنابراین ساخت زیرنویس به Timestamp دقیق و قطعه‌بندی مناسب جمله‌ها نیاز دارد.

مدل‌های تبدیل صدا به متن

مدل‌های Speech to Text از نظر سرعت، دقت، قیمت و قابلیت‌ها متفاوت‌اند.

بعضی مدل‌ها برای رونویسی عمومی طراحی شده‌اند و بعضی دیگر قابلیت‌های پیشرفته‌تری دارند:

  • تشخیص بهتر زبان
  • تفکیک گویندگان
  • رونویسی زنده
  • Timestamp دقیق
  • پردازش فایل طولانی
  • بهبود تشخیص اسامی خاص
  • تشخیص چند زبان در یک فایل

برای انتخاب مدل مناسب باید این معیارها را بررسی کنید:

معیارسؤال مهم
زبانآیا فارسی را با کیفیت مناسب پردازش می‌کند؟
دقتWord Error Rate روی داده واقعی چقدر است؟
سرعتفایل یک‌ساعته در چه مدت پردازش می‌شود؟
هزینههزینه هر دقیقه یا Token چقدر است؟
Diarizationآیا گویندگان را تفکیک می‌کند؟
Timestampزمان جمله یا کلمه ارائه می‌شود؟
Realtimeآیا صوت زنده را پردازش می‌کند؟
فرمتچه فرمت‌هایی پذیرفته می‌شوند؟
محدودیت فایلحداکثر حجم و مدت فایل چقدر است؟

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

تبدیل گفتار ضبط‌شده یا Realtime؟

دو معماری اصلی برای Speech to Text وجود دارد.

رونویسی فایل ضبط‌شده

فایل کامل پس از پایان ضبط برای API ارسال می‌شود.

مزایا:

  • پیاده‌سازی ساده‌تر
  • مناسب فایل‌های طولانی
  • امکان پیش‌پردازش صوت
  • Retry آسان‌تر
  • معمولاً دقت پایدارتر

کاربردها:

  • مصاحبه
  • پادکست
  • کلاس
  • جلسه ضبط‌شده
  • فایل ویدئویی

رونویسی زنده

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

مزایا:

  • نمایش لحظه‌ای Transcript
  • مناسب دستیار صوتی
  • مناسب زیرنویس زنده
  • مناسب تماس و جلسه آنلاین

پیاده‌سازی Realtime پیچیده‌تر است و باید موارد زیر مدیریت شوند:

  • اتصال WebSocket یا WebRTC
  • Buffer صوت
  • قطع و وصل شبکه
  • تشخیص پایان جمله
  • Transcript موقت و نهایی
  • Latency
  • ترتیب Eventها

API سازگار معمولی برای رونویسی فایل الزاماً به معنی پشتیبانی از Realtime نیست. وضعیت Endpoint زنده را جداگانه بررسی کنید.

تشخیص گوینده چیست؟

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

خروجی بدون Diarization:

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

خروجی با Diarization:

گوینده ۱: سلام، گزارش آماده شد؟

گوینده ۲: بله، نسخه اولیه آماده است و امروز ارسال می‌کنم.

Diarization با شناسایی هویت واقعی افراد متفاوت است. سیستم معمولاً گویندگان را با برچسب‌هایی مانند speaker_0 و speaker_1 جدا می‌کند، نه نام واقعی آن‌ها.

برای تبدیل برچسب به نام می‌توان از معرفی ابتدای جلسه، Metadata یا تأیید کاربر استفاده کرد.

چگونه دقت تبدیل صدای فارسی به متن را افزایش دهیم؟

زبان را مشخص کنید

اگر مدل پارامتر زبان دارد، برای فایل کاملاً فارسی از کد زبان فارسی استفاده کنید:

fa

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

کیفیت ضبط را افزایش دهید

میکروفن نزدیک، محیط کم‌نویز و صدای واضح تأثیر زیادی بر نتیجه دارند.

از ضبط تک‌کاناله مناسب استفاده کنید

برای گفتار ساده، Mono معمولاً کافی است. در جلسات حرفه‌ای، ذخیره جداگانه صدای هر گوینده می‌تواند نتیجه بهتری ایجاد کند.

صدای ورودی را Normalization کنید

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

نمونه FFmpeg:

ffmpeg -i input.mp3 \
  -af loudnorm \
  -ac 1 \
  -ar 16000 \
  normalized.wav

نویز را قبل از Transcription کاهش دهید

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

واژه‌های تخصصی را ارائه دهید

اگر مدل از Prompt کمکی پشتیبانی می‌کند، نام اشخاص، برندها و اصطلاحات تخصصی را مشخص کنید:

زبان فایل فارسی است.

واژه‌های احتمالی:
درواره، FastAPI، PostgreSQL، LangChain، LlamaIndex

فایل طولانی را هوشمندانه تقسیم کنید

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

از هم‌پوشانی محدود استفاده کنید

برای جلوگیری از حذف کلمه در مرز Chunkها می‌توان چند ثانیه Overlap تعریف کرد. هنگام ترکیب Transcript باید قسمت‌های تکراری حذف شوند.

Transcript را پس‌پردازش کنید

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

Prompt پیشنهادی:

این متن حاصل رونویسی یک فایل صوتی فارسی است.

وظیفه:
- فقط علائم نگارشی و پاراگراف‌بندی را اصلاح کن.
- نیم‌فاصله‌ها را اصلاح کن.
- کلمات را خلاصه یا بازنویسی نکن.
- نام‌ها و اصطلاحات فنی را بدون شواهد تغییر نده.
- بخش‌های نامطمئن را با [نامشخص] علامت‌گذاری کن.

تفاوت پاک‌سازی Transcript با خلاصه‌سازی

این دو مرحله نباید با هم ترکیب شوند.

پاک‌سازی Transcript

هدف حفظ دقیق صحبت گویندگان است:

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

خلاصه‌سازی

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

  • حذف جزئیات کم‌اهمیت
  • استخراج نکات اصلی
  • شناسایی تصمیم‌ها
  • ساخت Action Item

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

استفاده از API درواره برای تبدیل صدا به متن

درواره دسترسی API به مدل‌های هوش مصنوعی را ارائه می‌کند. Base URL ثابت درواره:

https://api.darvareh.ir/v1

Endpoint استاندارد رونویسی فایل صوتی:

https://api.darvareh.ir/v1/audio/transcriptions

برای شروع:

  1. در درواره ثبت‌نام کنید.
  2. از پنل API Key بسازید.
  3. وارد صفحه مدل‌ها شوید.
  4. یک مدل Speech to Text فعال انتخاب کنید.
  5. Model ID درواره را کپی کنید.
  6. فایل صوتی را از Backend برای Endpoint ارسال کنید.

API Key را در Frontend یا برنامه قابل‌دانلود قرار ندهید.

Model ID درواره

مدل‌های Speech to Text ممکن است از نظر قابلیت و شناسه تغییر کنند. برای جلوگیری از استفاده از Model ID قدیمی، شناسه را مستقیماً از صفحه مدل‌های درواره دریافت کنید.

در مثال‌های زیر از این Placeholder استفاده می‌کنیم:

MODEL_ID_DARVAREH

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

تبدیل MP3 به متن با cURL

curl https://api.darvareh.ir/v1/audio/transcriptions \
  -H "Authorization: Bearer $DARVAREH_API_KEY" \
  -F "file=@interview.mp3" \
  -F "model=MODEL_ID_DARVAREH" \
  -F "language=fa" \
  -F "response_format=json"

نمونه پاسخ ساده:

{
  "text": "متن رونویسی‌شده فایل صوتی در این بخش قرار می‌گیرد."
}

فیلدهای دقیق پاسخ به مدل، فرمت خروجی و قابلیت Endpoint بستگی دارند.

تبدیل صدا به متن با Python

ابتدا SDK را نصب کنید:

pip install openai

سپس Base URL را روی API درواره تنظیم کنید:

import os
from pathlib import Path

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["DARVAREH_API_KEY"],
    base_url="https://api.darvareh.ir/v1",
    timeout=300.0,
    max_retries=2
)

audio_path = Path("interview.mp3")

with audio_path.open("rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model="MODEL_ID_DARVAREH",
        file=audio_file,
        language="fa",
        response_format="json"
    )

print(transcript.text)

برای فایل‌های طولانی Timeout مناسب‌تری در نظر بگیرید یا کار را به Job پس‌زمینه تبدیل کنید.

ذخیره Transcript در فایل متنی

from pathlib import Path

text = transcript.text

Path("interview-transcript.txt").write_text(
    text,
    encoding="utf-8"
)

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

تبدیل صدا به متن با Node.js و TypeScript

ابتدا SDK را نصب کنید:

npm install openai

نمونه کد:

import OpenAI from "openai";
import { createReadStream } from "node:fs";
import { writeFile } from "node:fs/promises";

const client = new OpenAI({
  apiKey: process.env.DARVAREH_API_KEY,
  baseURL: "https://api.darvareh.ir/v1",
  timeout: 300000,
  maxRetries: 2,
});

async function transcribeAudio() {
  const transcript = await client.audio.transcriptions.create({
    model: "MODEL_ID_DARVAREH",
    file: createReadStream("meeting.mp3"),
    language: "fa",
    response_format: "json",
  });

  await writeFile(
    "meeting-transcript.txt",
    transcript.text,
    "utf8"
  );

  return transcript.text;
}

transcribeAudio()
  .then(console.log)
  .catch(console.error);

کد باید در Backend اجرا شود؛ زیرا API Key نباید در مرورگر کاربر قرار بگیرد.

ساخت API تبدیل صدا به متن با FastAPI

ابتدا Dependencyها را نصب کنید:

pip install fastapi uvicorn python-multipart openai

نمونه Endpoint:

import os
import tempfile
from pathlib import Path

from fastapi import FastAPI, File, HTTPException, UploadFile
from openai import OpenAI
from pydantic import BaseModel

app = FastAPI()

client = OpenAI(
    api_key=os.environ["DARVAREH_API_KEY"],
    base_url="https://api.darvareh.ir/v1",
    timeout=300.0,
    max_retries=2
)

ALLOWED_CONTENT_TYPES = {
    "audio/mpeg",
    "audio/wav",
    "audio/x-wav",
    "audio/mp4",
    "audio/x-m4a",
    "audio/webm",
    "video/mp4"
}

MAX_FILE_SIZE = 50 * 1024 * 1024


class TranscriptionResponse(BaseModel):
    filename: str
    text: str


@app.post(
    "/api/transcriptions",
    response_model=TranscriptionResponse
)
async def create_transcription(
    file: UploadFile = File(...)
) -> TranscriptionResponse:
    if file.content_type not in ALLOWED_CONTENT_TYPES:
        raise HTTPException(
            status_code=415,
            detail="Unsupported audio format"
        )

    content = await file.read()

    if len(content) > MAX_FILE_SIZE:
        raise HTTPException(
            status_code=413,
            detail="File is too large"
        )

    suffix = Path(file.filename or "audio.mp3").suffix

    try:
        with tempfile.NamedTemporaryFile(
            suffix=suffix,
            delete=True
        ) as temporary_file:
            temporary_file.write(content)
            temporary_file.flush()

            with open(temporary_file.name, "rb") as audio_file:
                transcript = (
                    client.audio.transcriptions.create(
                        model="MODEL_ID_DARVAREH",
                        file=audio_file,
                        language="fa",
                        response_format="json"
                    )
                )

        return TranscriptionResponse(
            filename=file.filename or "audio",
            text=transcript.text
        )

    except Exception as exc:
        raise HTTPException(
            status_code=502,
            detail="Audio transcription failed"
        ) from exc

این نمونه آموزشی است. در Production بهتر است فایل‌های بزرگ مستقیماً وارد حافظه RAM نشوند و از Streaming Upload یا Object Storage استفاده شود.

معماری مناسب برای فایل‌های طولانی

نگه‌داشتن یک Request برای چند دقیقه تجربه مناسبی ایجاد نمی‌کند. برای فایل‌های طولانی بهتر است از معماری Job استفاده کنید.

جریان پیشنهادی:

  1. کاربر فایل را آپلود می‌کند.
  2. فایل در Object Storage ذخیره می‌شود.
  3. Backend یک Job می‌سازد.
  4. Worker فایل را پردازش می‌کند.
  5. Transcript ذخیره می‌شود.
  6. وضعیت Job به completed تغییر می‌کند.
  7. نتیجه در اختیار کاربر قرار می‌گیرد.

پاسخ اولیه:

{
  "job_id": "tr_91842",
  "status": "queued"
}

وضعیت در حال اجرا:

{
  "job_id": "tr_91842",
  "status": "processing",
  "stage": "transcribing"
}

خروجی نهایی:

{
  "job_id": "tr_91842",
  "status": "completed",
  "transcript_url": "/api/transcriptions/tr_91842"
}

طراحی جدول Transcription Jobs

CREATE TABLE transcription_jobs (
    id UUID PRIMARY KEY,
    user_id UUID NOT NULL,
    model_id TEXT NOT NULL,
    original_filename TEXT NOT NULL,
    storage_key TEXT NOT NULL,
    language TEXT,
    status TEXT NOT NULL,
    duration_seconds INTEGER,
    transcript TEXT,
    error_code TEXT,
    error_message TEXT,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    started_at TIMESTAMPTZ,
    completed_at TIMESTAMPTZ
);

وضعیت‌های پیشنهادی:

queued
processing
completed
failed
cancelled

تقسیم فایل‌های طولانی با FFmpeg

برای تقسیم فایل به بخش‌های ده‌دقیقه‌ای:

ffmpeg -i meeting.mp3 \
  -f segment \
  -segment_time 600 \
  -c copy \
  chunks/part_%03d.mp3

این روش ساده است، اما ممکن است جمله در مرز دو فایل قطع شود.

روش بهتر:

  • تشخیص سکوت
  • تقسیم در مرز جمله
  • تعریف چند ثانیه Overlap
  • حذف قسمت‌های تکراری هنگام ادغام

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

ادغام Transcript چند Chunk

ساختار هر Chunk:

{
  "index": 3,
  "start_seconds": 1800,
  "end_seconds": 2400,
  "text": "..."
}

هنگام ادغام:

  1. Chunkها بر اساس index مرتب شوند.
  2. Timestamp نسبی به زمان کلی تبدیل شود.
  3. متن تکراری حاصل از Overlap حذف شود.
  4. بخش‌های ناقص بررسی شوند.
  5. نسخه خام و نهایی جدا ذخیره شوند.

برای حذف تکرار می‌توان شباهت انتهای Chunk قبلی و ابتدای Chunk جدید را بررسی کرد؛ اما این کار نباید باعث حذف جمله‌های واقعاً تکرارشده گوینده شود.

ساخت خلاصه جلسه پس از Transcription

پس از دریافت Transcript، آن را به یک مدل متنی در درواره ارسال کنید.

Prompt پیشنهادی:

متن زیر رونوشت یک جلسه کاری است.

وظایف:
1. خلاصه جلسه را در حداکثر ۱۰ نکته بنویس.
2. تصمیم‌های قطعی را استخراج کن.
3. Action Itemها را در جدول بیاور.
4. برای هر وظیفه، مسئول و موعد را فقط در صورت ذکر صریح بنویس.
5. موارد مبهم یا حل‌نشده را جدا کن.
6. هیچ نام، تاریخ یا تصمیمی اختراع نکن.

Transcript:
{{TRANSCRIPT}}

خروجی ساختاریافته پیشنهادی:

{
  "summary": ["string"],
  "decisions": ["string"],
  "action_items": [
    {
      "task": "string",
      "owner": "string | null",
      "deadline": "string | null"
    }
  ],
  "open_questions": ["string"]
}

تبدیل Transcript پادکست به مقاله

Transcript خام معمولاً برای انتشار مناسب نیست. گفتار دارای تکرار، جمله‌های نیمه‌کاره و عبارت‌های محاوره‌ای است.

فرایند پیشنهادی:

  1. رونویسی فایل
  2. پاک‌سازی حداقلی
  3. استخراج ساختار موضوعی
  4. ساخت Outline مقاله
  5. بازنویسی هر بخش
  6. بررسی تطابق با Transcript
  7. افزودن عنوان و Meta Description
  8. بازبینی انسانی
  9. انتشار

Prompt:

بر اساس Transcript زیر یک مقاله مستقل بنویس.

قوانین:
- فقط از اطلاعات موجود در Transcript استفاده کن.
- ساختار مقاله را منطقی و غیرمکالمه‌ای کن.
- تکرارهای گفتاری را حذف کن.
- ادعا یا آمار جدید اضافه نکن.
- نقل‌قول مستقیم را فقط در صورت اطمینان حفظ کن.
- لحن حرفه‌ای و روان فارسی باشد.

تولید فایل SRT از Transcript

اگر API زمان شروع و پایان Segmentها را ارائه دهد، می‌توان SRT ساخت.

نمونه تابع Python:

def srt_timestamp(seconds: float) -> str:
    milliseconds = int((seconds % 1) * 1000)
    total_seconds = int(seconds)

    hours = total_seconds // 3600
    minutes = (total_seconds % 3600) // 60
    remaining_seconds = total_seconds % 60

    return (
        f"{hours:02d}:{minutes:02d}:"
        f"{remaining_seconds:02d},{milliseconds:03d}"
    )


def segments_to_srt(segments: list[dict]) -> str:
    entries = []

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

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

    return "\n\n".join(entries)

خروجی SRT را با Encoding UTF-8 ذخیره کنید:

from pathlib import Path

Path("subtitle.srt").write_text(
    srt_content,
    encoding="utf-8"
)

ارزیابی دقت Speech to Text

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

معیار رایج Word Error Rate یا WER است:

WER = (تعداد جایگزینی‌ها + حذف‌ها + اضافه‌ها) ÷ تعداد کلمات متن مرجع

هرچه WER پایین‌تر باشد، خروجی به متن مرجع نزدیک‌تر است.

برای زبان فارسی باید پیش از محاسبه Normalization انجام شود:

  • یکسان‌سازی «ی» و «ک»
  • کنترل نیم‌فاصله
  • حذف تفاوت‌های صرفاً نگارشی
  • یکسان‌سازی اعداد در صورت نیاز
  • تعیین تکلیف علائم نگارشی

فقط WER کافی نیست. این معیارها نیز مهم‌اند:

  • دقت نام اشخاص
  • دقت اصطلاحات فنی
  • دقت اعداد
  • دقت Timestamp
  • دقت تفکیک گویندگان
  • Latency
  • هزینه هر دقیقه
  • نرخ فایل ناموفق

کنترل هزینه تبدیل صدا به متن

قیمت مدل‌ها می‌تواند بر اساس مدت صوت، Token، مدل یا قابلیت‌های اضافی محاسبه شود. اعداد قیمت ممکن است تغییر کنند؛ بنابراین آخرین اطلاعات را در صفحه مدل‌های درواره مشاهده کنید.

برای کنترل هزینه:

فایل‌های نامعتبر را قبل از ارسال رد کنید

نوع، حجم و مدت فایل را بررسی کنید.

سکوت طولانی را حذف کنید

پردازش چندین دقیقه سکوت می‌تواند هزینه و زمان را افزایش دهد.

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

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

خروجی‌های تکراری را Cache کنید

از Hash فایل برای تشخیص آپلود تکراری استفاده کنید.

import hashlib


def calculate_sha256(path: str) -> str:
    digest = hashlib.sha256()

    with open(path, "rb") as file:
        for chunk in iter(
            lambda: file.read(1024 * 1024),
            b""
        ):
            digest.update(chunk)

    return digest.hexdigest()

برای هر کاربر سهمیه تعریف کنید

  • حداکثر دقیقه روزانه
  • حداکثر حجم فایل
  • حداکثر درخواست هم‌زمان
  • مدل‌های مجاز
  • قابلیت Diarization
  • مدت نگه‌داری فایل

هزینه هر دقیقه موفق را اندازه بگیرید

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

مدیریت خطا

فایل پشتیبانی‌نشده

فرمت را با FFmpeg به MP3 یا WAV تبدیل کنید.

فایل بیش از حد بزرگ

فایل را فشرده یا به Chunkهای مناسب تقسیم کنید.

صدای بسیار کم

Normalization انجام دهید و دوباره آزمایش کنید.

زبان اشتباه

زبان را صریحاً مشخص کنید.

Transcript خالی

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

Timeout

برای فایل طولانی از Worker و Job Queue استفاده کنید.

Rate Limit

درخواست‌ها را در صف قرار دهید و Retry محدود با Exponential Backoff اجرا کنید.

Model ID نامعتبر

شناسه مدل را از صفحه مدل‌های درواره کپی کنید.

نکات مربوط به نگه‌داری فایل‌ها

فایل صوتی ممکن است حاوی اطلاعات خصوصی یا داخلی باشد. در طراحی محصول:

  • فقط فایل‌های لازم را دریافت کنید.
  • مدت نگه‌داری را مشخص کنید.
  • حذف فایل را پس از پردازش در نظر بگیرید.
  • دسترسی به فایل را محدود کنید.
  • لینک عمومی دائمی نسازید.
  • از URL امضاشده و کوتاه‌مدت استفاده کنید.
  • Logها را بدون محتوای حساس نگه دارید.
  • فایل موقت را پس از پایان کار پاک کنید.
  • امکان حذف Transcript را به کاربر بدهید.

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

اشتباهات رایج

انتظار دقت صددرصدی

تمام Transcriptهای مهم باید بازبینی شوند.

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

کیفیت ورودی مستقیماً بر کیفیت خروجی اثر می‌گذارد.

مشخص‌نکردن زبان فارسی

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

اصلاح بیش از حد Transcript با مدل متنی

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

ترکیب Transcript و خلاصه

نسخه خام، پاک‌سازی‌شده و خلاصه باید جدا بمانند.

قراردادن API Key در Frontend

API Key باید فقط روی سرور ذخیره شود.

پردازش هم‌زمان تعداد زیادی فایل

از Queue، محدودیت Concurrency و Worker استفاده کنید.

ذخیره فایل در Database

معمولاً بهتر است فایل صوتی در Object Storage و Metadata در Database قرار گیرد.

نداشتن Retry محدود

Retry نامحدود هزینه را افزایش می‌دهد و مشکل درخواست نامعتبر را حل نمی‌کند.

استفاده از Model ID حدسی

همیشه شناسه دقیق مدل را از صفحه مدل‌های درواره دریافت کنید.

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

چگونه صدا را به متن تبدیل کنیم؟

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

آیا تبدیل ویس فارسی به متن امکان‌پذیر است؟

بله. مدل‌های چندزبانه Speech to Text می‌توانند ویس فارسی را پردازش کنند. کیفیت نتیجه به مدل و کیفیت فایل بستگی دارد.

آیا می‌توان فایل MP3 را به متن تبدیل کرد؟

بله. MP3 یکی از فرمت‌های رایج برای Transcription است.

آیا ویدئو هم به متن تبدیل می‌شود؟

بله. صدای ویدئو استخراج و به متن تبدیل می‌شود. در صورت نیاز می‌توان Timestampها را به زیرنویس SRT تبدیل کرد.

بهترین فرمت برای تبدیل صدا به متن چیست؟

WAV باکیفیت برای حفظ اطلاعات صوتی مناسب است، اما حجم زیادی دارد. MP3 یا M4A با کیفیت مناسب نیز برای بسیاری از کاربردها کافی است. انتخاب نهایی به مدل و محدودیت فایل بستگی دارد.

آیا Speech to Text نام افراد را درست تشخیص می‌دهد؟

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

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

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

آیا می‌توان صدای زنده را به متن تبدیل کرد؟

بله، اما به مدل و Endpoint مخصوص Realtime نیاز دارد. Endpoint معمول رونویسی فایل لزوماً Streaming زنده ارائه نمی‌کند.

آیا می‌توان از Transcript خلاصه جلسه ساخت؟

بله. پس از رونویسی، Transcript را به یک مدل متنی ارسال کنید تا خلاصه، تصمیم‌ها و Action Itemها استخراج شوند.

آیا می‌توان از فایل صوتی زیرنویس SRT ساخت؟

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

آیا هوش مصنوعی گفتار محاوره‌ای فارسی را تشخیص می‌دهد؟

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

Model ID درواره چیست؟

مدل‌های صوتی مختلفی ممکن است در دسترس باشند. Model ID درواره را از صفحه مدل‌ها کپی کنید.

قیمت تبدیل صدا به متن چقدر است؟

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

چگونه API Key درواره بگیریم؟

در درواره ثبت‌نام کنید و از پنل کاربری یک API Key بسازید.

Base URL درواره چیست؟

https://api.darvareh.ir/v1

آیا درواره ابزار آماده تبدیل صوت به متن ارائه می‌دهد؟

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

جمع‌بندی

تبدیل صدا به متن با هوش مصنوعی یکی از کاربردی‌ترین روش‌ها برای صرفه‌جویی در زمان و قابل‌جست‌وجوکردن محتوای صوتی است. با این فناوری می‌توان ویس، MP3، جلسه، مصاحبه، پادکست، کلاس و ویدئو را به متن فارسی تبدیل کرد.

کیفیت نتیجه فقط به مدل وابسته نیست. ضبط مناسب، کاهش نویز، انتخاب زبان، واژه‌نامه تخصصی، Chunking صحیح و بازبینی Transcript همگی بر خروجی اثر می‌گذارند.

برای پروژه‌های نرم‌افزاری نیز بهتر است فایل‌های طولانی در Job Queue پردازش شوند، خروجی خام از نسخه ویرایش‌شده جدا بماند و مصرف هر کاربر کنترل شود.

برای مشاهده مدل‌های Speech to Text، قیمت به‌روز و Model ID درواره به صفحه مدل‌های درواره مراجعه کنید. سپس در درواره ثبت‌نام کرده، API Key خود را بسازید و با Base URL زیر قابلیت تبدیل گفتار به متن را به محصول خود اضافه کنید:

https://api.darvareh.ir/v1

مقالات مرتبط

Read more