ساخت یک دستیار صوتی که مکالمه با آن حسی شبیه صحبت با یک انسان واقعی داشته باشد، فراتر از زنجیرهکردن چند فراخوانی سادهی 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های ابری برای رسیدن به کمترین تاخیر ممکن
پیادهسازی از صفر
-
نشست WebRTC. یک اتاق LiveKit و یک کلاینت تحت وب راهاندازی کنید که صدای میکروفون را استریم کند. در سمت سرور، ورکر ایجنت را متصل کنید تا به اتاق بپیوندد.
-
استریمینگ ASR. فریمهای 20 میلیثانیهای PCM را به Deepgram Nova-3 (یا faster-whisper روی پردازندهی گرافیکی) بفرستید. رویدادهای متن ناقص و نهایی را سابسکرایب کنید و تاخیر هر متن ناقص را به لاگ بفرستید.
-
سیستم VAD و شناساگر نوبت. مدل Silero VAD v5 را روی استریم فریمها اجرا کنید. پس از وقوع رویداد پایان صحبت، شناساگر نوبت LiveKit را روی آخرین متن ناقص اجرا کنید. تنها زمانی وضعیت «پایان نوبت مکالمه» را قطعی بدانید که VAD به مدت 500 میلیثانیه سکوت را تشخیص دهد و امتیاز تکمیل شناساگر نوبت بالاتر از 0.6 باشد.
-
استریمینگ LLM. پس از پایان نوبت، فراخوانی مدل زبانی را با تاریخچهی مکالمه و متن نهایی آغاز کنید. توکنها را بهصورت استریمینگ بگیرید و با رسیدن اولین توکن، آن را بلافاصله تحویل TTS دهید.
-
استریمینگ TTS. چانکهای صوتی از Cartesia Sonic-2 بهصورت استریم برمیگردند. اولین چانک صوتی باید حداکثر ظرف 200 میلیثانیه پس از دریافت اولین توکن LLM از سرور خارج شود. چانکها را به اتاق LiveKit بفرستید تا کلاینت آن را از طریق بافر لرزش (jitter buffer) تحت WebRTC پخش کند.
-
ورود ناگهانی به کلام (Barge-in). وقتی VAD صدای جدیدی از کاربر حین پخش TTS تشخیص داد، استریم TTS را فوراً لغو کنید، ادامهی خروجی LLM را دور بریزید و ASR را مجدداً برای دریافت صدا آماده کنید. همچنین یک اسپن
tts_canceledثبت کنید. -
کانال جانبی ابزارها. ابزارهای آبوهوا و تقویم را بهعنوان توابع قابل فراخوانی ثبت کنید. هنگام فراخوانی، عملیات را بهشکل همزمان (concurrent) اجرا کنید؛ اگر عملیات ظرف 300 میلیثانیه تمام نشد، مدل زبانی باید عبارت پرکنندهای مثل «یک لحظه اجازه بدید بررسی کنم» ارسال کند؛ پس از بازگشت پاسخ ابزار، مکالمه را ادامه دهید.
-
بستر آزمایشی (Eval harness). تعداد 100 تماس تستی را ضبط کنید. نرخ خطای کلمات (در مقایسه با متن مرجع)، نرخ قطع اشتباه کلام (لغو شدن TTS وسط حرف کاربر)، میانهی زمان رسیدن اولین صوت (p50)، امتیاز کیفی گفتار (با ارزیابی انسانی یا مدل NISQA)، و تست افت بسته (حذف عمدی 3 درصد از بستهها) را اندازه بگیرید.
-
تست بار. با یک تماسگیرندهی مصنوعی، 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 |
تمرینها
-
سرویس Deepgram Nova-3 را با faster-whisper v3 turbo روی سرور g5.xlarge جایگزین کنید. تفاوت تاخیر و WER را اندازه بگیرید و مواردی را که انتخاب بین CPU و GPU تعیینکننده است مشخص کنید.
-
منطق داوری وقفه اضافه کنید: اگر کاربر حین اجرای یک ابزار وارد کلام شد، ایجنت چه واکنشی نشان دهد؟ سه سیاست مختلف را مقایسه کنید (لغو سخت، اتمام کار ابزار و سپس توقف، بردن نوبت بعدی به صف).
-
یک سناریوی چالشی برای شناساگر نوبت اجرا کنید: به کاربر مکثهای طولانی وسط جمله بدهید. آستانهی سکوت در VAD و آستانهی امتیاز شناساگر نوبت را طوری تنظیم کنید که بدون رد شدن تاخیر از 900 میلیثانیه، کمترین نرخ قطع اشتباه کلام به دست آید.
-
همین ایجنت را از طریق Twilio روی شبکهی تلفنی سنتی (PSTN) دیپلوی کنید. تاخیر رسیدن اولین صوت در PSTN را با WebRTC مقایسه کنید و تفاوتهای بافر لرزش و کدکهای صوتی را توضیح دهید.
-
قابلیت تشخیص فعالیت صوتی را برای زبانهای غیرانگلیسی (ژاپنی، اسپانیایی) اضافه کنید. نرخ فعالسازی نادرست مدل Silero VAD v5 را با مدلهای فاینتیونشده برای آن زبانها بسنجید.
اصطلاحات کلیدی
| اصطلاح | برداشت عامیانه | معنای دقیق فنی |
|---|---|---|
| تشخیص نوبت مکالمه (Turn detection) | «پایان گفتار» | کلاسیفایری که با تکیه بر سکوت VAD و متن ناقص، تشخیص میدهد که صحبت کاربر تمام شده است |
| ورود ناگهانی به کلام (Barge-in) | «مدیریت وقفه» | لغو فوری پخش TTS در زمانی که VAD متوجه صحبت مجدد کاربر میشود |
| زمان رسیدن اولین صوت (First-audio-out) | «تاخیر» | فاصلهی زمانی بین لحظهی سکوت کاربر تا خروج اولین بستهی صوتی از سرور |
| تشخیص فعالیت صوتی (VAD) | «دریچهی تشخیص گفتار» | مدلی که فریمهای صوتی را به دو دستهی گفتار و سکوت تفکیک میکند؛ Silero VAD v5 گزینهی پیشفرض سال 2026 است |
| بافر لرزش (Jitter buffer) | «هموارسازی صدا» | بافری در سمت کلاینت که بستهها را برای مدتی کوتاه نگه میدارد تا نوسانات شبکه خنثی شود |
| پرکننده (Filler) | «توکن تایید اولیه» | عبارت کوتاهی که ایجنت برای جلوگیری از سکوت آزاردهنده حین کندی ابزار پخش میکند |
| امتیاز نظر میانگین (MOS) | «امتیاز کیفیت درکشده» | مقیاسی برای سنجش کیفیت ادراکی گفتار؛ مدل NISQA جایگزین خودکار آن است |
برای مطالعهی بیشتر
- پروژهی LiveKit Agents 1.0 — فریمورک مرجع برای ایجنتهای صوتی تحت WebRTC
- پروژهی Pipecat — فریمورک پایتونی دیگر برای ساخت پایپلاینهای استریمینگ ایجنت
- مستندات OpenAI Realtime API — مرجعی برای کار با مدلهای گفتاری یکپارچه
- مستندات Deepgram Nova-3 — مرجع ASR استریمینگ
- مخزن Silero VAD v5 — مدل مرجع برای تشخیص فعالیت صوتی
- مستندات Cartesia Sonic-2 — مرجع موتور TTS با کمترین تاخیر ممکن
- معماری Retell AI — بررسی معماری ایجنت صوتی در محیط عملیاتی (پروداکشن)
- استک عملیاتی Vapi.ai — مرجع عملیاتی دیگر در صنعت
