Мой блог
Как я собираю умного робота на Raspberry Pi 5 для дочери: от идеи до аниме-персонажа
Я задался целью собрать для дочери умного робота-помощника, который мог бы мотивировать её на учебу и сделать этот процесс увлекательным. В основе моей концепции лежала идея создать устройство, способное поддерживать диалог полностью локально, без обязательного подключения к интернету. Мне категорически не хотелось делать заурядную колонку с часами или безликий экран с синими глазами. Поэтому в качестве первого шага я набросал на персональном компьютере простую роботизированную анимацию лица — без лишних деталей, исключительно чтобы оценить общую привлекательность концепта.









Когда я продемонстрировал заготовку дочери, она внимательно изучила её и задала встречный вопрос: нельзя ли превратить робота в аниме-кошечку? С этого момента утилитарный проект стал обрастать чертами полноценного персонажа. Мы подробно обсудили её пожелания касательно прически, выражения лица, элементов одежды и формы глаз. Выяснилось, что простой привязки кошачьих ушек к дисплею недостаточно, и в результате появились два проработанных эскиза. Первый вариант привлек внимание моделью кимоно и темными волосами, а второй — более светлой и гармоничной цветовой гаммой.

Разработка интерфейса и локального интеллекта
Создание проекта я начал с софтовой части, которую можно было тестировать без закупки железа. Написал приложение на Python с использованием библиотеки Tkinter, реализовав интерактивное лицо: проработал глаза, зрачки, брови, рот, моргание, а также добавил улыбку и смену эмоций. Было критически важно синхронизировать движение рта с воспроизводимым аудиоответом. Я понимал, что если между вопросом ребенка и реакцией системы возникнет долгая пауза, никакая графика не спасет — ребенок решит, что устройство зависло. Именно так сформировались базовые состояния: «слушаю», «думаю» и спокойная мимика, причем ранние варианты лиц я оставил доступными в настройках.

Отрисовку графического интерфейса я намеренно отделил от обработки голоса и генерации ответов нейросети, чтобы ожидание ответа модели не останавливало моргание глаз. Параллельно я подбирал «мозг» для устройства, так как плата Arduino для подобных задач явно не подходила. Изучив опыт других энтузиастов и оценив характеристики одноплатных компьютеров, я приобрел на Авито плату Raspberry Pi 5 с 8 ГБ оперативной памяти и начал подбирать языковую модель с размером около 4 миллиардов параметров.

Тестирование моделей и локальная озвучка
Я протестировал около двух десятков LLM-кандидатов. Часть вариантов отсеялась сразу из-за неумения держать заданный характер или путаницы в длинных репликах. Для оставшихся кандидатов я подготовил комплексный набор тестов, включающий арифметику, связность речи, следование инструкциям и способность объяснять материал. При этом «самый умный» ответ не всегда побеждал, ведь ребенку не хочется долго ждать генерацию. В финал вышли четыре GGUF-модели, среди которых базовой на Pi 5 стала Qwen3-4B-Instruct-2507, обеспечившая лучший баланс скорости и качества. Для быстрых коротких диалогов пригодилась Gemma_4_E2B.

Генерацию речи я также оставил полностью локальной. За распознавание микрофонного звука отвечал движок Vosk, а озвучку выполняла программа Piper. Стандартный голос «Ирина» звучал неплохо, но для аниме-персонажа хотелось более мультяшного и высокого звучания. Я не стал обучать отдельную модель, а подобрал параметры синтеза на слух: коэффициент изменения высоты звука составил 1,38, а замедление исходного синтеза — 1,30. Доббившись приятного тембра, я убедился, что одной анимации на экране уже недостаточно.
Интеграция механики, камеры и периферии
Для реализации зрительного контакта мне потребовалось добавить подвижность головы и камеру. Я заказал для тестов два сервопривода — компактный MG90S и более крупный и мощный MG996R, чтобы проверить, справится ли легкий мотор с нагрузкой. Управлением приводами занялся контроллер PCA9685, в качестве камеры был выбран модуль IMX708 с автофокусом, а дисплеем стал сенсорный экран Waveshare с диагональю 3.5 дюйма. Звуковой трак я собрал из цифрового микрофона ICS-43434, подключенного по шине I²S, USB-звуковой карты и усилителя с динамиками, а для механической прочности шеи заказал подшипники.

Пока ехала основная камера, я собрал временный стенд с вебкой от 3D-принтера и обычным компьютерным микрофоном, чтобы отладить поиск лиц. При подключении питания контроллера сервоприводов возникла проблема с отсутствием напряжения на силовой шине через клеммник, которую я решил подачей питания на боковой вход V+. Вскоре пришла камера IMX708, тесты которой показали высокую реальную скорость захвата кадров и стабильный поиск лиц на уровне почти 30 кадров в секунду, чего вполне хватало для плавного отслеживания.

Сборка, настройка взгляда и выбор имени
Работа с корпусом оказалась сложнее красивых эскизов: при сборке 3D-модели мешала толщина плат, шлейфы и доступ к крепежу, а один из элементов зажимал подвижный объектив камеры, что потребовало ручной доработки. Первый запуск полноценного стенда с камерой и экраном показал, что персонаж находит человека и поворачивается, но движение выглядит неестественно. Я связал координаты лица с позицией глаз и приводов: сначала смещается взгляд, а затем плавно поворачивается голова без резких рывков за каждым пикселем.

В процессе тестирования обнаружилась неожиданная проблема: робот реагировал на любые разговоры вокруг. Посоветовавшись с дочерью, мы решили назвать персонажа «Лягушка». Я запрограммировал реакцию на имя, возможность завершить диалог командой «стоп» и активацию записи звука по взгляду в камеру. Имя и основные параметры я вынес в настройки, чтобы их можно было легко изменить. Сейчас устройство представляет собой рабочий стенд с напечатанной головой, но дочка уже вовсю общается с персонажем, который умеет слушать, отвечать своим голосом и поворачивать голову.

