← На главную

Big Mouth Billy Bass превратили в ассистента на Raspberry Pi за уикенд

13.07.2026 18:18 · hackernews

Это руководство превращает игрушечную рыбу Big Mouth Billy Bass в голосового ассистента. Голова поворачивается, рот синхронизируется с голосом, хвост хлопает для выразительности. Внутри — Raspberry Pi 5 с подключением к Amazon Nova 2 Sonic через Amazon Bedrock, и всё это управляется библиотекой Strands Agents с двунаправленным стримингом (BidiAgent). Ни опыта в робототехнике, ни навыков пайки не требуется — автор проекта собрал рыбу за выходные, хотя до этого ни разу не подключал Raspberry Pi.

Начинается всё с софта. На microSD ставится Raspberry Pi OS Lite (64-bit) — именно Lite, без десктопа, иначе встроенная панель перезаписывает звуковой конфиг. Настраивается SSH, WiFi, хостнейм billy. Устанавливаются зависимости: python3-dev, portaudio19-dev, swig, git. С помощью arecord и aplay находятся имена USB-микрофона и динамика (не номера — они переставляются при перезагрузке), и создаётся ~/.asoundrc, чтобы сделать их устройствами по умолчанию. Затем ставится Python-окружение с strands-agents[bidi,bidi-io] и gpiozero. Ключи AWS кладутся в ~/.aws/credentials — только от специально созданного IAM-пользователя billy-bass, которому разрешён ровно один вызов: bedrock:InvokeModelWithBidirectionalStream на модель amazon.nova-2-sonic-v1:0 в регионе us-east-1. Никаких лишних прав.

Софт проверяют на голом Pi — запускают billy.py, говорят в микрофон и слышат ответ. Если всё работает, переходят к рыбе. Из корпуса вынимают батарейки, динамик, пьезопищалку и оригинальную плату управления. Оставляют два мотора (у современной рыбы один отвечает за рот, второй — за поворот головы и взмах хвоста в разные стороны) и кнопку. Моторы подключают через драйвер MX1508: шесть точек пайки для питания и сигнальных проводов, ещё четыре — для подключения самих моторов. Провода от драйвера идут на GPIO-пины Raspberry Pi: питание (+5V) на пин 4, земля на пин 6, управляющие пины — IN1 (9), IN2 (11), IN3 (15), IN4 (13). Перед сборкой всё тестируют скриптом motors.py: команды m, h, t заставляют двигаться рот, голову и хвост. Если что-то идёт не так, достаточно поменять пины в коде или переставить провода.

Финальный скрипт billy_final.py делает главное — липсинк. Проблема в том, что Nova Sonic присылает аудио быстрее, чем оно воспроизводится. Решение — измерять громкость прямо в колбэке звукового вывода и по ней управлять сервоприводом рта. Голова поднимается, пока идёт речь (если тишина длится дольше SILENCE — 1.5 секунды, опускается), хвост хлопает на резких пиках громкости (EMPHASIS) и по событиям начала/конца ответа. Всё завязано на system_prompt — если рыба слишком многословна, правила нужно ужесточить («одно короткое предложение, никаких монологов», «рыбные каламбуры обязательны»). Модель запускается в asyncio: два параллельных цикла — один обрабатывает аудио и реплики, другой опрашивает уровень громкости и дёргает моторами.

Читать оригинал →