تصور کنید به یک تماس ویدئویی با یک تأمین‌کننده در سئول یا یک مشتری در سائوپائولو می‌پیوندید و دقیقاً همان‌طور صحبت می‌کنید که با همکار خود در اتاق مجاور صحبت می‌کنید. خبری از مترجمی که در حالت بی‌صدا (mute) منتظر باشد نیست. کسی نیست که روی کیبورد خم شده باشد و در جعبه چت تایپ کند. ترجمه صوتی هوش مصنوعی در لحظه (real-time)، همین حالا این امر را ممکن ساخته است. این فناوری به جای جایگزینی ارتباط انسانی، اصطکاک‌هایی را که مانع نزدیکی افراد می‌شود، از میان برمی‌دارد. اما ساخت سیستمی که واقعاً مانند یک گفتگوی طبیعی به نظر برسد، واقعاً دشوار است. شما صرفاً در حال تبدیل کلمات نیستید؛ بلکه در حال بازسازی جریان گفتار انسانی در درون نرم‌افزار هستید.

پنج لایه اصلی خط لوله (Pipeline)

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

لایه ارتباطات صوتی (Voice Communication Layer) زیربنای کار است. این لایه وظیفه ضبط صدا از میکروفون، حذف نویز، حذف اکو و انتقال بسته‌ها (packets) در اینترنت را بر عهده دارد. آن را مانند یک خط تلفن دیجیتال در نظر بگیرید. اگر این لایه باعث از دست رفتن بسته‌ها یا ایجاد لرزش (jitter) شود، بقیه خط لوله با داده‌های بی‌کیفیت کار خواهند کرد. اکثر تیم‌ها در اینجا از WebRTC استفاده می‌کنند، زیرا اتصالات نظیر‌به‌نظیر (peer-to-peer) را مدیریت کرده و شامل محافظ‌های صوتی داخلی است.

مرحله بعد، تبدیل گفتار به متن (Speech-to-Text یا STT) است. شما باید صدای ورودی را در سریع‌ترین زمان ممکن به کلمات مکتوب تبدیل کنید. موتورهای STT جریانی (streaming)، منتظر سکوت نمی‌مانند؛ بلکه با رسیدن هر هجا، متن‌های ناقص (partial transcripts) را منتشر می‌کنند. این رفتار حیاتی است. اگر ماژول STT شما تا شنیدن یک مکث، داده‌ها را ذخیره (buffer) کند، همین حالا میلی‌ثانیه‌های ارزشمند را از دست داده‌اید. پیاده‌سازی‌های مدرنِ جریانی، صدای ورودی را به‌طور مداوم پردازش کرده و با رسیدن بافت (context) بیشتر، حدس‌های خود را اصلاح می‌کنند.

ترجمه ماشینی (Machine Translation یا MT) در میانه قرار دارد. این بخش متن خام را گرفته و آن را به زبان مقصد بازنویسی می‌کند. سیستم‌های اولیه کار چندانی فراتر از جابه‌جایی عبارات انجام نمی‌دادند. مدل‌های فعلی مبتنی بر Transformer، نحو (syntax) و وابستگی‌های طولانی‌مدت را بسیار بهتر مدیریت می‌کنند، اما همچنان به یکپارچه‌سازی دقیق نیاز دارند. شما به ماژول MT نیاز دارید که ورودی جریانی را بپذیرد تا بتواند ترجمه قطعات جمله را پیش از آنکه گوینده صحبت خود را تمام کند، آغاز نماید.

سپس نوبت به تبدیل متن به گفتار (Text-to-Speech یا TTS) می‌رسد. اینجا همان جایی است که سیستم شما صدا پیدا می‌کند. مدل‌های قدیمی TTS ترکیبی (concatenative)، شبیه به صدای GPS هنگام اعلام خروجی بزرگراه بودند. مدل‌های Neural TTS با پیش‌بینی مستقیم طیف‌نگاشت‌ها (spectrograms) یا شکل‌موج‌های خام، بازی را تغییر دادند. آن‌ها صداهایی تولید می‌کنند که بالا و پایین می‌روند و نفس می‌کشند. آن‌ها همچنین می‌توانند برخی رنگ‌مایه‌های احساسی را حفظ کنند، که بسیار مهم است؛ زیرا یک عذرخواهی بی‌روح که با لحنی رباتیک و یکنواخت بیان شود، می‌تواند ناخواسته کنایه‌آمیز به نظر برسد.

در نهایت، لایه استریم صوتی (Audio Streaming) گفتار ترجمه‌شده را به شنونده بازمی‌گرداند. زمان‌بندی در اینجا نیز اهمیت دارد. صدای سنتز شده باید با زمان‌بندی شبکه همگام باشد تا یا خیلی زود نرسد و باعث ایجاد اکو نشود، یا خیلی دیر نرسد و شنونده را در سکوت معلق نگذارد.

مشکل تأخیر (Latency)

تأخیر (Latency) بزرگترین دشمن شماست. گفتگوی انسانی تنها وقفه‌های کوتاه را تحمل می‌کند. اگر سیستم منتظر بماند تا کاربر یک جمله کامل را تمام کند و سپس ترجمه را شروع کند، تعامل کند و گسسته به نظر می‌رسد. افراد شروع به پریدن وسط حرف یکدیگر می‌کنند، یا بدتر از آن، در ریتم خشک و عصبیِ صحبت کردن با بی‌سیم فرو می‌روند. هدف شما باید تأخیر کلِ سرتاسری (end-to-end) کمتر از یک ثانیه باشد.

برای رسیدن به این هدف، باید صدا را در قطعات (chunks) کوچک پردازش کنید. اندازه قطعات را بین ۲۰ تا ۱۰۰ میلی‌ثانیه نگه دارید. بیست میلی‌ثانیه تقریباً معادل مدت زمان یک صدای صامت است. صد میلی‌ثانیه حدود یک و نیم هجا را در خود جای می‌دهد. این قطعات را به یک خط لوله جریانی (streaming pipeline) تزریق کنید تا STT، ترجمه و TTS همگی بر اساس اطلاعات ناقص کار کنند. هیچ‌چیز نباید منتظر پایان جمله بماند.

در هر مرحله از پردازش جریانی صدا استفاده کنید. این بدان معناست که موتور STT به‌طور مداوم متن‌های ناقص را منتشر می‌کند، موتور MT به محض دریافت کلمات کافی برای تشکیل یک بند (clause) منسجم، قطعات را ترجمه می‌کند، و موتور TTS شروع به بیان نیمه اول جمله می‌کند در حالی که نیمه دوم هنوز در حال رمزگشایی است.

دستیابی به تأخیر زیر یک ثانیه مستلزم انضباط در تمام مراحل (hop) است: ضبط، کدگذاری، انتقال، صف‌بندی، پردازش، سنتز و پخش. بافرینگ‌های غیرضروری را در هر مرحله حذف کنید. به عنوان مثال، از اجرای الگوریتم‌های حذف نویز که نیاز به نیم ثانیه نگاه به جلو (lookahead) دارند، مگر در موارد بسیار ضروری، خودداری کنید. به جای PCM خام، از پروتکل‌های فشرده‌سازی کارآمد مانند Opus استفاده کنید. استنتاج (inference) را روی سرورهای لبه (edge servers) که از نظر جغرافیایی به هر دو تماس‌گیرنده نزدیک هستند اجرا کنید تا رفت و برگشت‌های شبکه (round trips) کوتاه باقی بماند.

جایی که مدل‌های هوش مصنوعی هنوز با چالش روبرو هستند

هوش مصنوعی چالش‌های خاصی را به همراه دارد که مترجم‌های کپی-پیست (clipboard translators) هرگز با آن‌ها روبرو نبودند.

درک زمینه (Context) واقعاً دشوار است. در انگلیسی، کلمه duck می‌تواند نام یک حیوان باشد، یا فعلی به معنای خم کردن سر، و یا حتی در برخی گویش‌ها یک اصطلاح محبت‌آمیز باشد. موتوری که کلمه را به صورت مجزا ببیند، حدس اشتباهی خواهد زد. پردازش جریانی (Streaming) این مسئله را دشوارتر می‌کند، زیرا سیستم باید پیش از آنکه جمله کامل معنای آن را روشن کند، روی یک کلمه تصمیم نهایی بگیرد. برخی تیم‌ها با ایجاد پنجره‌های بازگشت (rollback windows) کوچک در موتور STT، این مشکل را حل می‌کنند تا اگر صدای بعدی تفسیر را تغییر داد، موتور بتواند متن پیاده‌سازی شده را اصلاح کند.

طبیعی بودن صدا بیش از آنچه اکثر مهندسان انتظار دارند اهمیت دارد. مردم از صداهای رباتیک متنفرند. مدل‌های عصبی TTS با شبیه‌سازی الگوهای آهنگین (prosody) گفتار انسانی، احساسات را در صدا حفظ می‌کنند. اگر گوینده اصلی هیجان‌زده یا نگران به نظر برسد، خروجی ترجمه شده نیز باید بخشی از آن انرژی را منتقل کند، نه اینکه هر جمله را مانند گزارش هواشناسی بیان کند. انتقال نشانه‌های نشانه‌گذاری یا نشانگرهای لحن از صدای منبع به ماژول TTS به حفظ آن بافت انسانی کمک می‌کند.

مکالمات آشفته هستند. افراد حرف یکدیگر را قطع می‌کنند، به عقب برمی‌گردند، می‌گویند «اِم»، و جملاتی را شروع می‌کنند که هرگز تمام نمی‌کنند. سیستم شما برای مدیریت هوشمندانه این وقفه‌ها به تشخیص فعالیت صوتی (Voice Activity Detection یا VAD) نیاز دارد. یک VAD خوب، بین گفتار واقعی و نویز پس‌زمینه، و همچنین بین یک مکث کوتاه در حین صحبت و پایان واقعی یک نوبت صحبت، تمایز قائل می‌شود. اگر VAD بیش از حد حساس باشد، ابتدای پاسخ‌ها را می‌بُرد. اگر بیش از حد محتاط باشد، سکوت را به موتور ترجمه می‌فرستد که باعث هدر رفتن منابع پردازشی و ایجاد وقفه‌های عجیب در جریان مکالمه می‌شود.

مقیاس‌پذیری و امنیت

از همان اولین طرح معماری، برای مقیاس‌پذیری برنامه‌ریزی کنید. یک سیستم یکپارچه (monolith) که یک تماس را به راحتی ترجمه می‌کند، زیر بار هزار مکالمه همزمان فرو خواهد ریخت. از میکروسرویس‌ها استفاده کنید تا بتوانید هر مرحله را به طور مستقل مقیاس‌بندی کنید. اگر صف TTS شما به دلیل اینکه یک زبان نسبت به زبان دیگر پیچیدگی آوایی بیشتری دارد دچار پشت‌شدگی شود، می‌توانید بدون دست زدن به کلاستر STT، تعداد بیشتری از ورکر‌های TTS را فعال کنید. اگر سرویس MT شما در یک جفت‌زبان خاص دچار مشکل شود، می‌توانید آن بخش را جدا کرده و به تنهایی مقیاس‌بندی کنید.

امنیت غیرقابل مذاکره است. داده‌های صوتی، بیومتریک و عمیقاً شخصی هستند. برای محافظت از صدای خام در حین انتقال، از رمزنگاری سرتاسری (end-to-end encryption) استفاده کنید. داده‌های صوتی خام را ذخیره نکنید، مگر اینکه دلیل مشخص و اعلام‌شده‌ای داشته باشید، مانند رضایت صریح کاربر برای بهبود مدل. حتی در آن صورت نیز، ضبط‌ها را به صورت رمزنگاری‌شده ذخیره کرده و طبق یک برنامه زمانی دقیق آن‌ها را پاک کنید. یک سیستم ترجمه صوتی که محتوای تماس را لو می‌دهد یا مکالمات را به صورت مخفیانه نگه می‌دارد، اعتماد کاربر را برای همیشه از بین می‌برد.

شروع به ساختن

توسعه‌دهندگان اکنون به مدل‌های STT متن‌باز، APIهای MT مبتنی بر ابر و چک‌پوینت‌های از پیش آموزش‌دیده TTS عصبی دسترسی دارند که یافتن آن‌ها حتی تا چند سال پیش غیرممکن بود. قطعات مهیا هستند. معماری نیز شناخته شده است.

از کوچک شروع کنید. دو ثانیه از صدای میکروفون را از طریق یک موتور STT جریانی عبور دهید.