فاز 19 · درس 3

پروژه پایانی 3 — ساخت ایجنت صوتی بلادرنگ (ASR به LLM به TTS)

نوع
پروژه‌ی پایانی
زمان
حدود 10 دقیقه
زبان‌ها
Python (agent + pipeline), TypeScript (web client)
پیش‌نیاز
فاز 6 (صوت و پردازش گفتار)، فاز 7 (ترنسفورمرها)، فاز 11 (مهندسی مدل‌های زبانی)، فاز 13 (ابزارها)، فاز 14 (ایجنت‌ها)، فاز 17 (زیرساخت)
یک موج صوتی درخشان که از یک بلندگوی استودیویی متصل به کابل شبکه خارج می‌شود و به یک موج دیگر برخورد می‌کند
فهرست مطالب
  1. صورت مسئله
  2. مفاهیم کلیدی
  3. معماری
  4. استک فنی
  5. پیاده‌سازی از صفر
  6. استفاده از ابزارهای واقعی
  7. خروجی این درس
  8. تمرین‌ها
  9. اصطلاحات کلیدی
  10. برای مطالعه‌ی بیشتر

ساخت یک دستیار صوتی که مکالمه با آن حسی شبیه صحبت با یک انسان واقعی داشته باشد، فراتر از زنجیره‌کردن چند فراخوانی ساده‌ی REST API است. چالش اصلی در کاهش تاخیر سرتاسری به زیر 800 میلی‌ثانیه، تشخیص درست زمان پایان صحبت کاربر بدون قطع کردن نابجای کلام او و مدیریت ورود ناگهانی به کلام (Barge-in) هنگام پخش صداست. در این درس، پایپ‌لاین استریمینگ کاملی را بر بستر WebRTC پیاده‌سازی می‌کنید که از ورودی میکروفون تا خروجی صوتی را با سقف تاخیر سخت‌گیرانه مدیریت می‌کند.

برای اجرای عملی این پایپ‌لاین، به سرویس‌های ابری تخصصی نظیر Deepgram برای تشخیص گفتار و Cartesia برای تبدیل متن به گفتار، یا مدل‌های باز مانند faster-whisper روی پردازنده‌های گرافیکی نیاز دارید. با توجه به اینکه پرداخت ارزی مستقیم از طریق کارت‌های بانکی ایرانی در این سرویس‌های خارجی مقدور نیست و دسترسی به برخی APIها و ارائه‌دهندگان ابری نیز با محدودیت‌های متغیر مواجه است، می‌توانید از راه‌کارهای خودمیزبان روی سرور شخصی یا گیت‌وی‌های واسط برای مدیریت این زیرساخت استفاده کنید.

ایجنت صوتی که حس طبیعی به کاربر بدهد، تاخیر سرتاسری (end-to-end latency) زیر 800 میلی‌ثانیه دارد، پایان صحبت شما را به‌موقع تشخیص می‌دهد، ورود ناگهانی به کلام (barge-in) را مدیریت می‌کند و می‌تواند بدون وقفه در صدا ابزار فراخوانی کند. پلتفرم‌های Retell، Vapi، LiveKit Agents و Pipecat همگی در سال 2026 به این استاندارد رسیده‌اند. معماری همه‌ی آن‌ها یکسان است: تشخیص خودکار گفتار (ASR) استریمینگ، سیستم تشخیص نوبت گفت‌وگو، مدل زبانی بزرگ (LLM) استریمینگ و تبدیل متن به گفتار (TTS) استریمینگ؛ همگی روی بستر WebRTC و با سقف تاخیر سخت‌گیرانه در هر گام لغزش (hop). یکی از این ایجنت‌ها را بسازید، معیارهای WER و MOS و نرخ قطع اشتباه کلام را بسنجید و عملکرد آن را زیر بار افت بسته تست کنید.

فازهای تمرین‌شده: P6 · P7 · P11 · P13 · P14 · P17
زمان: 30 ساعت

صورت مسئله

حوزه‌ی صوت، سریع‌ترین بخش از تجربه کاربری هوش مصنوعی در سال‌های 2025 تا 2026 بوده است. در هر فصل، سقف فنی این حوزه جابه‌جا شد. پلتفرم‌های OpenAI Realtime API، Gemini 2.5 Live، Cartesia Sonic-2، ElevenLabs Flash v3، LiveKit Agents 1.0 و Pipecat 0.0.70 زمان رسیدن اولین بایت صوتی به گوش کاربر (first-audio-out) را به زیر 800 میلی‌ثانیه رساندند. مسئله فقط تاخیر نیست؛ اصل ماجرا حس تعامل است: قطع نکردن نابجای حرف کاربر، قطع نشدن بی‌موقع کلام خود سیستم، بازیابی درست بعد از یک وقفه در میانه‌ی جمله، فراخوانی ابزار در حین مکالمه بدون قفل شدن صدا و دوام آوردن روی شبکه‌های موبایل دارای نوسان تصادفی (jitter).

با وصل کردن سه درخواست ساده‌ی REST به چنین نتیجه‌ای نمی‌رسید. معماری این سیستم، یک پایپ‌لاین استریمینگ سرتاسری است. وقتی این سیستم را بسازید، حالت‌های شکست (failure modes) یکی‌یکی خود را نشان می‌دهند: مدلی برای تشخیص فعالیت صوتی (Voice Activity Detection یا VAD) که برای تلفن تنظیم شده و با صدای تلویزیون در پس‌زمینه فعال می‌شود، سیستم تشخیص نوبتی که منتظر علائم نگارشی ناموجود می‌ماند، یا موتور TTS که قبل از پخش صدا 400 میلی‌ثانیه بافر می‌کند. پروژه‌ی نهایی این است که این ایرادها را تک‌به‌تک زیر بار برطرف کنید و گزارش جامع تاخیر و کیفیت را ارائه دهید.

مفاهیم کلیدی

این پایپ‌لاین پنج مرحله‌ی استریمینگ دارد: ورودی صدا (WebRTC از سمت مرورگر یا PSTN)، موتور ASR (متن‌های ناقص استریمینگ از Deepgram Nova-3 یا faster-whisper)، تشخیص نوبت مکالمه (VAD به‌همراه یک مدل ترنسفورمر کوچک برای تحلیل متن‌های ناقص و یافتن نشانه‌های پایان کلام)، مدل زبانی (استریمینگ توکن‌ها بلافاصله پس از تایید پایان نوبت کاربر)، موتور TTS (ارسال استریمینگ صدا حداکثر ظرف 200 میلی‌ثانیه پس از دریافت اولین توکن LLM).

سه دغدغه‌ی فراگیر نیز وجود دارد:

  • ورود ناگهانی به کلام (Barge-in): وقتی کاربر حین صحبت ایجنت شروع به حرف زدن می‌کند، خروجی TTS لغو می‌شود و ASR بی‌درنگ صدای جدید را دریافت می‌کند.
  • فراخوانی ابزار (Tool use): فراخوانی توابع وسط مکالمه (مثل هواشناسی یا تقویم) باید روی کانالی جانبی و بدون متوقف کردن صدا اجرا شود؛ اگر تاخیر ابزار از 300 میلی‌ثانیه گذشت، ایجنت توکنی برای تایید اولیه می‌فرستد («یک لحظه...»).
  • پس‌زدگی (Backpressure): در زمان افت بسته‌های شبکه، متن‌های ناقص نگه داشته می‌شوند، VAD آستانه‌ی تشخیص کلام را بالا می‌برد و ایجنت از صحبت کردن هم‌زمان روی پیامی که دریافتش تایید نشده پرهیز می‌کند.

معیارها کاملاً کمی هستند: نرخ خطای کلمات (WER) زیر 8 درصد در بنچمارک Hamming VAD با نسبت سیگنال به نویز 15 دسی‌بل؛ میانه (p50) زمان خروج اولین صوت زیر 800 میلی‌ثانیه در 100 تماس ثبت‌شده؛ نرخ قطع اشتباه کلام زیر 3 درصد؛ امتیاز نظر میانگین (MOS) بالای 4.2 برای کیفیت TTS؛ و پاسخگویی هم‌زمان به 50 تماس روی یک سرور g5.xlarge. این اعداد، خروجی‌های قطعی پروژه‌ی شما هستند.

معماری

browser / Twilio PSTN
        |
        v
   WebRTC / SIP edge
        |
        v
  LiveKit Agents 1.0  (or Pipecat 0.0.70)
        |
   +----+--------------+--------------+-----------------+
   |                   |              |                 |
   v                   v              v                 v
  ASR              VAD v5         turn-detector     side-channel
(Deepgram         (Silero)          (LiveKit)        tools
 Nova-3 /         speech-gate    completion score    (weather,
 Whisper-v3)      per 20ms        on partials        calendar)
   |                   |              |
   +--------+----------+--------------+
            v
        LLM (streaming)
     GPT-4o-realtime / Gemini 2.5 Flash /
     cascaded Claude Haiku 4.5
            |
            v
        TTS streaming
     Cartesia Sonic-2 / ElevenLabs Flash v3
            |
            v
     audio back to caller
            |
            v
   OpenTelemetry voice traces -> Langfuse

استک فنی

  • بستر انتقال (Transport): ابزار LiveKit Agents 1.0 (روی WebRTC) به‌همراه گیت‌وی Twilio PSTN؛ فریم‌ورک Pipecat 0.0.70 به‌عنوان گزینه‌ی جایگزین
  • تشخیص گفتار (ASR): سرویس Deepgram Nova-3 (استریمینگ، زمان دریافت اولین متن ناقص زیر 300 میلی‌ثانیه) یا مدل Whisper-v3-turbo روی کتابخانه‌ی faster-whisper به‌صورت خودمیزبان
  • تشخیص فعالیت صوتی (VAD): مدل Silero VAD v5 به‌همراه شناساگر نوبت LiveKit (یک ترنسفورمر کوچک که متن‌های ناقص را بررسی می‌کند)
  • مدل زبانی (LLM): مدل GPT-4o-realtime از OpenAI برای یکپارچگی عمیق، Gemini 2.5 Flash Live، یا مدل آبشاری Claude Haiku 4.5 (تکمیل متن استریمینگ با مسیر صوتی جداگانه)
  • تبدیل متن به گفتار (TTS): مدل Cartesia Sonic-2 (سریع‌ترین زمان تحویل اولین بایت)، ElevenLabs Flash v3، یا مدل متن‌باز Orpheus برای اجرای خودمیزبان
  • ابزارها: کانال جانبی FastMCP برای دریافت آب‌وهوا، تقویم یا رزرو؛ با قابلیت پخش عبارت پرکننده (filler) توسط ایجنت در صورتی که اجرای ابزار بیش از 300 میلی‌ثانیه طول بکشد
  • مشاهده‌پذیری (Observability): اسپن‌های صوتی OpenTelemetry و ردگیری‌های صوتی Langfuse به همراه قابلیت بازپخش صدا
  • دیپلوی: یک سرور منفرد g5.xlarge (با 24 گیگابایت حافظه‌ی گرافیکی) برای اجرای خودمیزبان Whisper و Orpheus؛ یا APIهای ابری برای رسیدن به کمترین تاخیر ممکن
نمودار آبشاری تاخیر صوتبه‌صورت پایپ‌لاین، نه ترتیبی
VOICE LATENCY WATERFALLEvery stage streams into the next before it finishes: ASR emits partials while the user still speaks, the turn detector fires on completion cues, and TTS starts within the 800ms first-audio budget. When the user barges in at 900ms the TTS cancels instantly and ASR takes over again.ورودی میکخروجی میانی ASRتشخیص نوبتتوکن‌های LLMخروجی TTS0400msبودجه 800msاولین صوت 780msورود ناگهانیلغو شد
هر مرحله قبل از پایان خود به مرحله بعدی استریم می‌شود: ASR در حین صحبت کاربر نتایج میانی را ارسال می‌کند، آشکارساز نوبت با نشانه‌های پایان گفتار فعال می‌شود و TTS در بازه بودجه 800 میلی‌ثانیه‌ای اولین صوت شروع به کار می‌کند. با ورود ناگهانی کاربر در 900 میلی‌ثانیه، TTS بلافاصله لغو شده و ASR دوباره کنترل را به دست می‌گیرد.

پیاده‌سازی از صفر

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

  2. استریمینگ ASR. فریم‌های 20 میلی‌ثانیه‌ای PCM را به Deepgram Nova-3 (یا faster-whisper روی پردازنده‌ی گرافیکی) بفرستید. رویدادهای متن ناقص و نهایی را سابسکرایب کنید و تاخیر هر متن ناقص را به لاگ بفرستید.

  3. سیستم VAD و شناساگر نوبت. مدل Silero VAD v5 را روی استریم فریم‌ها اجرا کنید. پس از وقوع رویداد پایان صحبت، شناساگر نوبت LiveKit را روی آخرین متن ناقص اجرا کنید. تنها زمانی وضعیت «پایان نوبت مکالمه» را قطعی بدانید که VAD به مدت 500 میلی‌ثانیه سکوت را تشخیص دهد و امتیاز تکمیل شناساگر نوبت بالاتر از 0.6 باشد.

  4. استریمینگ LLM. پس از پایان نوبت، فراخوانی مدل زبانی را با تاریخچه‌ی مکالمه و متن نهایی آغاز کنید. توکن‌ها را به‌صورت استریمینگ بگیرید و با رسیدن اولین توکن، آن را بلافاصله تحویل TTS دهید.

  5. استریمینگ TTS. چانک‌های صوتی از Cartesia Sonic-2 به‌صورت استریم برمی‌گردند. اولین چانک صوتی باید حداکثر ظرف 200 میلی‌ثانیه پس از دریافت اولین توکن LLM از سرور خارج شود. چانک‌ها را به اتاق LiveKit بفرستید تا کلاینت آن را از طریق بافر لرزش (jitter buffer) تحت WebRTC پخش کند.

  6. ورود ناگهانی به کلام (Barge-in). وقتی VAD صدای جدیدی از کاربر حین پخش TTS تشخیص داد، استریم TTS را فوراً لغو کنید، ادامه‌ی خروجی LLM را دور بریزید و ASR را مجدداً برای دریافت صدا آماده کنید. همچنین یک اسپن tts_canceled ثبت کنید.

  7. کانال جانبی ابزارها. ابزارهای آب‌وهوا و تقویم را به‌عنوان توابع قابل فراخوانی ثبت کنید. هنگام فراخوانی، عملیات را به‌شکل هم‌زمان (concurrent) اجرا کنید؛ اگر عملیات ظرف 300 میلی‌ثانیه تمام نشد، مدل زبانی باید عبارت پرکننده‌ای مثل «یک لحظه اجازه بدید بررسی کنم» ارسال کند؛ پس از بازگشت پاسخ ابزار، مکالمه را ادامه دهید.

  8. بستر آزمایشی (Eval harness). تعداد 100 تماس تستی را ضبط کنید. نرخ خطای کلمات (در مقایسه با متن مرجع)، نرخ قطع اشتباه کلام (لغو شدن TTS وسط حرف کاربر)، میانه‌ی زمان رسیدن اولین صوت (p50)، امتیاز کیفی گفتار (با ارزیابی انسانی یا مدل NISQA)، و تست افت بسته (حذف عمدی 3 درصد از بسته‌ها) را اندازه بگیرید.

  9. تست بار. با یک تماس‌گیرنده‌ی مصنوعی، 50 تماس هم‌زمان را روی یک سرور g5.xlarge اجرا کنید. صدک 95 (p95) زمان رسیدن اولین صوت را در حالت بار پایدار اندازه بگیرید.

استفاده از ابزارهای واقعی

caller: "what is the weather in tokyo tomorrow"
[asr  ] partial @280ms: "what is the"
[asr  ] partial @540ms: "what is the weather"
[turn ] completion score 0.82 at @820ms; commit
[llm  ] tool call emitted @880ms
[tool ] weather.tokyo tomorrow -> 68/52 partly cloudy @940ms
[llm  ] first token @990ms
[tts  ] first audio-out @1040ms: "Tokyo tomorrow will be partly cloudy..."
turn latency: 1040ms user-stop -> audio-out

خروجی این درس

خروجی نهایی این پروژه فایل outputs/skill-voice-agent.md است. این فایل با دریافت یک حوزه‌ی کاری (پشتیبانی مشتری، زمان‌بندی جلسات یا کیوسک تعاملی)، یک ایجنت LiveKit با پایپ‌لاین بهینه‌شده‌ی ASR/VAD/LLM/TTS بر اساس معیارهای سنجش زیر راه‌اندازی می‌کند. شیوه‌نامه‌ی نمره‌دهی:

ضریب معیار روش ارزیابی
25 تاخیر سرتاسری میانه‌ی (p50) زمان رسیدن اولین صوت زیر 800 میلی‌ثانیه در 100 تماس ضبط‌شده
20 کیفیت نوبت‌گیری مکالمه نرخ قطع اشتباه کلام زیر 3 درصد در بنچمارک Hamming VAD
20 صحت فراخوانی ابزار فراخوانی ابزار در میانه‌ی مکالمه و بازگرداندن داده‌ی درست بدون متوقف شدن صدا
20 پایداری در شرایط افت بسته پایداری نوبت‌گیری مکالمه و نرخ خطای کلمات با اعمال 3 درصد افت بسته
15 جامعیت بستر آزمایشی اندازه‌گیری‌های تکرارپذیر به‌همراه پیکربندی عمومی
100

تمرین‌ها

  1. سرویس Deepgram Nova-3 را با faster-whisper v3 turbo روی سرور g5.xlarge جایگزین کنید. تفاوت تاخیر و WER را اندازه بگیرید و مواردی را که انتخاب بین CPU و GPU تعیین‌کننده است مشخص کنید.

  2. منطق داوری وقفه اضافه کنید: اگر کاربر حین اجرای یک ابزار وارد کلام شد، ایجنت چه واکنشی نشان دهد؟ سه سیاست مختلف را مقایسه کنید (لغو سخت، اتمام کار ابزار و سپس توقف، بردن نوبت بعدی به صف).

  3. یک سناریوی چالشی برای شناساگر نوبت اجرا کنید: به کاربر مکث‌های طولانی وسط جمله بدهید. آستانه‌ی سکوت در VAD و آستانه‌ی امتیاز شناساگر نوبت را طوری تنظیم کنید که بدون رد شدن تاخیر از 900 میلی‌ثانیه، کمترین نرخ قطع اشتباه کلام به دست آید.

  4. همین ایجنت را از طریق Twilio روی شبکه‌ی تلفنی سنتی (PSTN) دیپلوی کنید. تاخیر رسیدن اولین صوت در PSTN را با WebRTC مقایسه کنید و تفاوت‌های بافر لرزش و کدک‌های صوتی را توضیح دهید.

  5. قابلیت تشخیص فعالیت صوتی را برای زبان‌های غیرانگلیسی (ژاپنی، اسپانیایی) اضافه کنید. نرخ فعال‌سازی نادرست مدل Silero VAD v5 را با مدل‌های فاین‌تیون‌شده برای آن زبان‌ها بسنجید.

اصطلاحات کلیدی

اصطلاح برداشت عامیانه معنای دقیق فنی
تشخیص نوبت مکالمه (Turn detection) «پایان گفتار» کلاسیفایری که با تکیه بر سکوت VAD و متن ناقص، تشخیص می‌دهد که صحبت کاربر تمام شده است
ورود ناگهانی به کلام (Barge-in) «مدیریت وقفه» لغو فوری پخش TTS در زمانی که VAD متوجه صحبت مجدد کاربر می‌شود
زمان رسیدن اولین صوت (First-audio-out) «تاخیر» فاصله‌ی زمانی بین لحظه‌ی سکوت کاربر تا خروج اولین بسته‌ی صوتی از سرور
تشخیص فعالیت صوتی (VAD) «دریچه‌ی تشخیص گفتار» مدلی که فریم‌های صوتی را به دو دسته‌ی گفتار و سکوت تفکیک می‌کند؛ Silero VAD v5 گزینه‌ی پیش‌فرض سال 2026 است
بافر لرزش (Jitter buffer) «هموارسازی صدا» بافری در سمت کلاینت که بسته‌ها را برای مدتی کوتاه نگه می‌دارد تا نوسانات شبکه خنثی شود
پرکننده (Filler) «توکن تایید اولیه» عبارت کوتاهی که ایجنت برای جلوگیری از سکوت آزاردهنده حین کندی ابزار پخش می‌کند
امتیاز نظر میانگین (MOS) «امتیاز کیفیت درک‌شده» مقیاسی برای سنجش کیفیت ادراکی گفتار؛ مدل NISQA جایگزین خودکار آن است

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسچرا نمی‌توان یک ایجنت صوتی را صرفاً با متصل کردن سه فراخوانی مسدودکننده (blocking) REST ساخت؟
  2. پیش از درسنقش آشکارساز نوبت (turn-detector) در کنار VAD چیست؟
  3. حین درسوقتی کاربر در میان پاسخ ایجنت شروع به صحبت می‌کند، برای اینکه ورود ناگهانی به کلام طبیعی به نظر برسد چه اتفاقی باید بیفتد؟
  4. حین درسچرا وقتی اجرای یک ابزار بیش از حدود 300 میلی‌ثانیه طول می‌کشد، یک عبارت پرکننده کوتاه مثل «یک لحظه، اجازه بدید بررسی کنم» پخش می‌شود؟
  5. حین درساولین قطعه صوتی تقریباً پس از چه مدتی از تولید اولین توکن LLM باید سرور را ترک کند؟
  6. پس از درسکدام معیار مستقیماً ورود ناگهانی نامناسب به کلام یا پایان دادن زودهنگام نوبت را اندازه‌گیری می‌کند؟
  7. پس از درسدر شرایط افت بسته 3 درصدی، پایپ‌لاین به کدام دو رفتار تطبیقی متکی است؟

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

چگونه تاخیر خروجی صدا (first-audio-out) را به زیر 800 میلی‌ثانیه می‌رسانیم؟

با استفاده از پایپ‌لاین کاملاً استریمینگ روی بستر WebRTC؛ یعنی شروع فوری TTS هم‌زمان با استریم اولین توکن از مدل زبانی و استفاده از موتورهای فوق‌سریع مانند Cartesia و Deepgram.

سیستم ورود ناگهانی به کلام (Barge-in) چگونه کار می‌کند؟

مدل Silero VAD فریم‌های ورودی را بررسی می‌کند؛ اگر هنگام پخش صدا توسط ایجنت، کاربر شروع به صحبت کند، استریم TTS فوراً لغو شده و خروجی مدل زبانی دور ریخته می‌شود.

چگونه از قفل شدن صدا هنگام فراخوانی طولانی ابزارها جلوگیری می‌شود؟

ابزارها روی کانال جانبی اجرا می‌شوند و اگر زمان پاسخ بیش از 300 میلی‌ثانیه طول بکشد، مدل زبانی با ارسال یک توکن پرکننده مثل «یک لحظه بررسی کنم...» مانع ایجاد سکوت غیرطبیعی می‌شود.

ما رو توی گوگل بیشتر ببین

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