تصور کنید یک ماهی پلاستیکی که با Raspberry Pi 5 کار میکند، سر و دمش را دقیقاً همزمان با کلمات یک هوش مصنوعی متفکر تکان میدهد. این پروژه که توسط مورگان ویلیس (Morgan Willis) طراحی شده، ثابت میکند که مشکل اصلی عاملهای صوتی، کیفیت صدا نیست، بلکه نحوه مدیریت جریان دادههای صوتی است. ویلیس استدلال میکند که «دره وهم» (Uncanny Valley) در دستیارهای صوتی، بیش از آنکه به کیفیت صدای تولید شده مربوط باشد، به هماهنگی و ارکستراسیون استریم صوتی بازمیگردد.
بیشتر دستیارهای صوتی امروز از یک تأخیر آزاردهنده ۵ ثانیهای رنج میبرند؛ چون صدا را تکهتکه پردازش میکنند. آنها منتظر میمانند شما حرفتان را تمام کنید، فایل ضبط شده را به سرور میفرستند و سپس پاسخ کامل را پخش میکنند. این فرآیند خطی، جریان طبیعی گفتگو را میکشد و باعث میشود تعامل با ماشین، خشک و غیرطبیعی به نظر برسد. این چالشها نشان میدهد که برای رسیدن به تعاملات انسانی، تغییر اولویتها در توسعه هوش مصنوعی صوتی و تمرکز بر بهینهسازیهای ساختاری بیش از افزایش صرفِ مقیاس مدلها اهمیت دارد.
برای حل این مشکل، این پروژه از یک معماری استریم دوطرفه (Bidirectional Streaming) استفاده میکند. در این حالت، اپلیکیشن بهجای انتظار برای ضبط کامل، صدا را بهصورت لحظهای و در زمان واقعی به مدل میفرستد. مدل همزمان پایان نوبت کاربر را تشخیص داده و پاسخ را بلافاصله استریم میکند؛ یعنی عامل میتواند در حالی که هنوز بقیه دادههای صوتی در حال رسیدن هستند، شروع به صحبت کند و این امر باعث حذف تأخیرهای طولانی میشود.
زمینهای از هکهای قدیمی
انتخاب ماهی Billy Bass تصادفی نبود. ویلیس که متولد دهه ۹۰ میلادی است، در کودکی شیفته این اسباببازی شده بود. علاوه بر این، این ماهی بیش از ۲۵ سال است که یکی از ارکان اصلی هکهای سختافزاری به شمار میرود. همانطور که در تحلیلهای قبلی ما دربارهی ادغام سختافزار و مدلهای زبانی اشاره کردیم، تبدیل اشیای فیزیکی به رابطهای هوشمند، بهترین راه برای تست تأخیر (Latency) در دنیای واقعی است.
بر اساس بررسی تاریخچه این اسباببازی، نمونههای جالبی در سالهای گذشته وجود داشت که مسیر را برای این پروژه هموار کرد:
- سال ۲۰۰۰: مایک نیل (Mike Neil) پروژهای به نام "FishHack" را به MacHax ارائه کرد که ماهی را به یک مکینتوش متصل میکرد تا هر زمان که کامپیوتر صدای بوق (Beep) میداد، ماهی شروع به آواز خواندن کند.
- سال ۲۰۱۶: برایان کین (Brian Kane) ویدئویی ویروسی با عنوان "the future" منتشر کرد که در آن یک ماهی Billy Bass گزارشهای آبوهوای لحظهای را میخواند.
- نسخههای دیگر: پروژههایی مثل "billy-b-assistant" اثر تام کوپمن (Thom Koopman) زیربنای مشابهی را برای نسخه فعلی مبتنی بر هوش مصنوعی فراهم کردند.
ویلیس معتقد است بیلی برای این پروژهها ایدهآل است چون تعاملی است، به طرز دلپذیری عجیب است و هک کردن آن بهطور غافلگیرکنندهای آسان است. او با شوخی اشاره کرد که «واقعاً هیچ فکر یا تجربه اورجینالی نداشته است»، زیرا صرفاً از دنبالهرو دههها مثالهایی بوده که مردم کارهای هرچه مضحکتر و عجیبتری با این ماهی انجام میدادند.
ویلیس این پروژه را «BillAI Bass» نامید و قصد داشت ماهی را به یک عامل هوش مصنوعی کامل با قابلیت صوتی تبدیل کند. او در ابتدا به شوخی درباره تبدیل آن به یک ابزار کدنویسی به نام "Cod Code" صحبت کرد، اما در نهایت روی یک دستیار شخصی همهمنظوره تمرکز کرد. این پروژه در ژانویه با خرید تجهیزات آغاز شد، اما ماهها در کشو ماند تا اینکه در ژوئن، پس از یک هفته بسیار پراسترس، ویلیس تصمیم گرفت تمام مسئولیتهایش را نادیده بگیرد و روی بیلی «جراحی مغزی» انجام دهد.
مغز فنی و زیرساخت
هوش این عامل توسط Amazon Nova 2.5 Sonic و از طریق Amazon Bedrock تأمین میشود. در حالی که استنتاج (Inference) — یعنی همان لحظهای که مدل جواب تولید میکند، شبیه به خودِ آشپزی (نه دورهی آموزش آشپز) — در ابر رخ میدهد، اما حلقهٔ اجرای عامل و اجرای ابزارها (Tool Execution) بهصورت محلی روی Raspberry Pi اجرا میشوند.
برای مدیریت این پیچیدگی، ویلیس از Strands Harness SDK و بهطور خاص مؤلفه BidiAgent استفاده کرد. این SDK وظیفه هماهنگی استریم و مسیریابی رویدادها را در سراسر اپلیکیشن بر عهده دارد. این سیستم برای اجرا به پایتون ۳.۱۲ یا نسخههای جدیدتر، اعتبارنامههای AWS و نصب PortAudio روی سیستمعامل نیاز دارد. نصب این ابزار از طریق دستور python -m pip install "strands-agents[bidi-all,bidi-pyaudio]==1.57.2" انجام میشود.
به نقل از مستندات پروژه، این ساختار با OpenAI Realtime Model نیز سازگار است. تنها کافی است ساختار مدل در کد تغییر کند. برای مثال، با استفاده از OpenAIRealtimeModel و صدای «ballad»، سیستم میتواند همان پرامپتهای سیستمی و فراخوانیهای ابزار را حفظ کند و فقط ارائهدهنده صدا را تغییر دهد. اگر کاربر بخواهد بیلی با یک لهجه بریتانیایی خشک و اشرافی صحبت کند، این درخواست را میتوان مستقیماً به پرامپت سیستمی اضافه کرد.
یکی از بزرگترین چالشها در هوش مصنوعی صوتی مبتنی بر سختافزار، «حلقه بازخورد» (Feedback Loop) است. وقتی بلندگو نزدیک میکروفون باشد، عامل صدای خودش را میشنود و تصور میکند کاربر در حال صحبت است، در نتیجه خودش را قطع میکند. ویلیس این مشکل را با فعال کردن audio_processor=True در نمونه AudioIO حل کرد که سه قابلیت حیاتی را فعال میکند:
- حذف اکوی صوتی (Acoustic echo cancellation)
- سرکوب نویز (Noise suppression)
- کنترل خودکار بهره (Automatic gain control)
استفاده از یک نمونه واحد AudioIO برای هر دو ورودی و خروجی به پردازشگر اجازه میدهد تا از صدای بلندگو به عنوان یک مرجع اکو استفاده کند تا از قطع شدن خودبهخودی جلوگیری شود.

ارکستراسیون پیشرفته و تلهمتری
علاوه بر مدیریت صدا، SDK مورد استفاده، جنبههای کمتر جذاب اما ضروری اپلیکیشنهای صوتی مانند محدودیتهای اتصال را مدیریت میکند. یک گفتگو اغلب میتواند طولانیتر از زمانی باشد که یک ارائهدهنده اجازه میدهد یک اتصال واحد باز بماند. Strands میتواند آن اتصال را تمدید کرده و بستر (Context) گفتگو را به اتصال جایگزین منتقل کند. این سیستم بهطور خاص به دنبال مرز بین دو نوبت گفتگو (Turn Boundary) میگردد تا پیش از رسیدن به ضربالاجل، اتصال را تمدید کند.
برای عیبیابی مسائل مربوط به عملکرد — مثلاً زمانی که بیلی بیش از حد طول میکشد تا پاسخ دهد — ویلیس از OpenTelemetry استفاده کرد. با فعال کردن StrandsTelemetry و یک اکسپورتر کنسول، او میتواند موارد زیر را ردیابی کند:
- بازههای زمانی نشست (Session spans)
- زمان پاسخدهی مدل (Model response times)
- مدت زمان اجرای ابزارها (Tool call durations)
- رویدادهای اتصال (Connection events)
این تلهمتری برای بررسی دقیق «لولهکشی» عامل ضروری است تا اطمینان حاصل شود که جریان گفتگو بهصورت طبیعی پیش میرود.
جراحی ماهی و سختافزار
برای آوردن عامل به دنیای فیزیکی، باید مدارات الکترونیکی اصلی ماهی جایگزین میشد. ویلیس که پیش از این هرگز هک سختافزاری انجام نداده بود، از Fable 5 و Claude Code برای شناسایی سیمکشی داخلی کمک گرفت. او با گرفتن عکس از قطعات داخلی و ارسال آنها به Claude Code، توانست تشخیص دهد کدام سیمها موتورهای دهان، سر و دم را کنترل میکنند.
پس از برداشتن قاب پشتی، هدف این بود که کنترل موتورها از مدارات اصلی بیلی گرفته شده و به Raspberry Pi سپرده شود.

ویلیس از یک برد درایور موتور MX1508 به عنوان پل ارتباطی بین پینهای GPIO در Raspberry Pi و موتورهای داخلی ماهی استفاده کرد. در این ساختار، رزبری پای سیگنالی را به MX1508 میفرستد و این برد سپس توان لازم برای حرکت موتورها در جهت مورد نظر را تأمین میکند. این فرآیند شامل بریدن سیمهای اصلی و لحیمکاری آنها به MX1508 بود؛ فرآیندی که در طی آن ویلیس لحیمکاری را یاد گرفت، در حالی که منتظر «ناامیدی مطلق» در صورت شکست پروژه بود.
قبل از اتصال به هوش مصنوعی، موتورها با استفاده از کدهای خالص پایتون و کتابخانه gpiozero تست شدند تا از صحت لحیمکاری و توانایی Pi در تحریک مستقل حرکات اطمینان حاصل شود. تخصیص پینها در اسکریپت تست به این صورت بود:
- دهان: PWMOutputDevice(17)
- سر: OutputDevice(22)
- دم: OutputDevice(27)
این اسکریپت تست به ویلیس اجازه داد تا حرکات را بهصورت دستی (m برای دهان، h برای سر، t برای دم) فعال کند تا پیش از ادغام با عامل هوش مصنوعی، سختافزار را تأیید کند.

همگامسازی ذهن و بدن
گام نهایی، ایجاد یک خروجی صوتی سفارشی بود. سیستم میزان بلندی (Loudness) جریان صوتی خروجی را در بازگشت (Callback) پخش اندازهگیری میکند. این کار اجازه میدهد تا دهان ماهی متناسب با حجم صدای هوش مصنوعی تکان بخورد. از آنجایی که یک تکه صوتی (Audio Chunk) رسیده از مدل ممکن است در بافر منتظر بماند، اندازهگیری صدا در لحظه پخش واقعی، باعث میشود حرکت دهان دقیقاً با صدایی که از بلندگو خارج میشود همزمان باشد.
قوانین زیر برای زندهتر کردن ماهی تعریف شد:
- دهان: دقیقاً از بلندی لحظهای صدا پیروی میکند.
- سر: هنگام صحبت کردن عامل، به جلو کشیده میشود.
- دم: برای تأکید در کلام، هر از گاهی تکان میخورد.
از آنجایی که در این نسخه خاص از ماهی، سر و دم از یک موتور مشترک استفاده میکنند، کد بهگونهای نوشته شده که این حرکات را بهصورت متناوب اجرا کند. این منطق در فایل billy.py پیادهسازی شده و در ابتدا با کمک Fable پیشنویس شد. این مجموعه قوانین، رویدادهای پاسخ و خروجی صوتی را به حرکات فیزیکی موتور تبدیل میکند.
ادغام ابزارها و شخصیت
این ماهی فقط حرف نمیزند، بلکه به عنوان یک دستیار همهمنظوره عمل میکند. با پاس دادن ماژول billy_tools() به BidiAgent، ماهی قابلیتهای زیر را پیدا میکند:
- بررسی گزارشهای لحظهای آبوهوا
- خواندن آخرین اخبار
- تحلیل تقویم روزانه کاربر
پرامپت سیستمی (System Prompt) برای حفظ شخصیت ماهی حیاتی است. این دستورالعمل به مدل میگوید: «تو بیلی بس هستی، یک ماهی سخنگو. پاسخهایت را کوتاه، خندهدار و محاورهای نگه دار. در صورت نیاز از ابزارهایت استفاده کن و نتایج را در یک یا دو جمله کوتاه شفاهی خلاصه کن. هرگز دادههای خام یا لیستهای طولانی را بلند نخوان.»
مدل صوتی تصمیم میگیرد چه زمانی یک ابزار را فراخوانی کند، Strands آن را اجرا میکند و نتیجه برای توضیح شفاهی به بیلی بازگردانده میشود. این معماری امکان گسترشهای آینده را فراهم میکند؛ مثلاً اتصال ماهی به دستگاههای خانه هوشمند، دسترسی به APIهای مختلف یا در نهایت فعال کردن "Cod Code" با دادن ابزارهای کدنویسی به او.
کاربران همچنین میتوانند عامل اصلی را در ابر اجرا کنند و از Raspberry Pi صرفاً به عنوان رابط فیزیکی با دنیا استفاده کنند. همانطور که ویلیس میگوید: «دنیا برای شما باز است و ماهی در واقع فقط یک رابط است.»
این ساخت، ثابت میکند لولهکشی مورد نیاز برای یک ماهی اسباببازی، دقیقاً همان چیزی است که برای دستیارهای پشتیبانی مشتری حرفهای، دستگاههای خانه هوشمند صوتی یا هر اپلیکیشن صوتی دیگری نیاز است. رابط کاربری — چه یک ماهی پلاستیکی باشد و چه یک بلندگوی شیک — در برابر ارکستراسیون استریم زیربنایی، در اولویت دوم قرار دارد.
برای توسعهدهندگانی که قصد بازسازی این پروژه را دارند، تمام دیاگرامهای سیمکشی، لیست قطعات، تنظیمات Raspberry Pi و پیادهسازی پایتون در مخزن گیتهاب پروژه در آدرس https://github.com/morganwilliscloud/billai-bass در دسترس است.
گام بعدی شما
- اگر توسعهدهنده هستید، مخزن گیتهاب پروژه را برای بررسی دیاگرامهای سیمکشی و پیادهسازی پایتون بررسی کنید.
- برای کاهش تأخیر در اپلیکیشنهای صوتی خود، معماری استریم دوطرفه (Bidirectional Streaming) را جایگزین مدلهای Request-Response کنید.
- قابلیت حذف اکو (Echo Cancellation) را در لایه سختافزاری یا درایور صوتی خود پیاده کنید تا از قطع شدن مدل توسط صدای خودش جلوگیری شود.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell و پردازش لبه مراجعه کنید.




گفتگو