Я хотел сделать дочери робота помощника с локальным ИИ, чтоб она не отвлекалась от уроков, а наоборот увлеченно их делала.
Но ничего для этого у меня небыло. Была только идея: сделать для дочери робота, с которым можно разговаривать даже без интернета. И хотелось, чтобы он не выглядел просто очередной колонкой с часами или черным лицом с синими глазами. Поэтому первым делом я сделал на ПК анимированное лицо — обычное роботическое, без волос, банта и прочих украшений, хотелось что-то привлекательное.
Показал дочери. Она посмотрела и спросила: «А можно, чтобы это была аниме-кошечка?»
Так первоначальный робот начал превращаться в персонажа. Я стал расспрашивать, что именно ей нравится: глаза, причёска, одежда, выражение лица. Первого варианта оказалось мало. Мысли у неё были довольно конкретные, и выяснилось, что недостаточно просто приделать ушки к экрану. В итоге появились два подробных эскиза образа. Один — с тёмными волосами и розовым кимоно, другой — в более светлых цветах. С этого момента я уже делал не абстрактного робота, а маленького собеседника для своего ребёнка.
первый вариант ей понравился как модель кимоно:

и второй, который в итоге по цветовой гамме понравился ей больше:

Из картинки — в живое лицо
Я начал с того, что можно было проверять без железа. Написал приложение на Python с экранным лицом: глаза, зрачки, брови, рот, моргание. Добавил улыбку и несколько выражений. Когда робот произносил ответ, рот должен был двигаться вместе со звуком. Если программа надолго замирает между вопросом и ответом, никакие красивые глаза не спасают: ребёнок решит, что она сломалась или что хуже просто игнорит тебя. Так постепенно у лица появились состояния «слушаю», «думаю» и обычная спокойная мимика. Но я оставил и другие, первые сделанные лица, их можно менять в настройках.

Для интерфейса я использовал Python и Tkinter. Отрисовку лица отделил от обработки голоса и ответа модели: ожидание сети или генерации текста не должно останавливать моргание. Позже это разделение пригодилось и для движения головы.
Параллельно я понял, что одной анимации мало. Роботу нужен мозг, причём локальный. Но подо что его собирать? Arduino для такого диалога не подходила. Я поискал одноплатный компьютер, сравнил возможности, посмотрел что люди уже запрускали и на чем, и нашёл на Авито Raspberry Pi 5 с 8 ГБ памяти по адекватной цене и заказал его. Хотелось запустить на нём модель примерно на 4 миллиарда параметров. Пока посылка ехала, я продолжал писать программу на ПК и выбирать модель.
Двадцать(!!!) моделей и один маленький компьютер
Я скачал около двадцати LLM-кандидатов. Часть отсеялась быстро: одни плохо держали заданный характер, другие невнятно отвечали на простые вопросы или путались в длинной реплике. Для оставшихся я собрал набор проверок — арифметика, объяснения, связная речь, следование инструкции. Самый «умный» ответ в отдельном тесте не был победой: ребёнку ещё надо дождаться его вслух.
В финале у меня остались четыре GGUF-модели. На Pi 5 основным вариантом стала Qwen3-4B-Instruct-2507: в моём наборе она дала лучший баланс качества и ожидания. Gemma_4_E2B отвечала быстрее и пригодилась как вариант для короткого разговора. Gemma_4_E4B выглядела сильнее в некоторых объяснениях, но работала медленнее. Qwen3.5_9B_DeepSeek_Distill я оставил запасным экспериментом: она интересная, но для маленького робота её длинный ответ кажется очень долгим по времени (там и я уже думал что завис).
В одной из проверок на самом Pi скорость генерации получилась примерно 4,3 токена/с у Qwen3 4B и 7,1 токена/с у Gemma E2B. Это измерения моего набора задач и настроек, не универсальный рейтинг моделей. Для ребёнка разница ощущается просто: задала вопрос — ждёт. Поэтому быстрый ответ иногда полезнее чуть более подробного.
Речь я тоже оставил локальной. Микрофонный звук распознавал Vosk, а ответ озвучивал Piper. Базовый голос «Ирина» был хорош, но персонажу дочери хотелось более мультяшного звучания или даже скорее анимешного. Я не обучал отдельную голосовую модель, да и времени не было: замедлил исходный синтез и изменил высоту уже готового звука. В пресете это выглядит так:
'anime_kawaii': ('irina', 1.38, 1.30)
Здесь 1,38 - коэффициент изменения высоты, 1,30 - замедление исходного синтеза; после этого звук приводится к частоте аудиоустройства. Подбирал на слух: слишком высокий голос превращался в писк, слишком медленный утомлял. Когда получилось приятнее, стало ясно, что просто хлопающих глаз на экране уже мало.
А если голова повернётся?
Я задумался: ну допустим персонаж смотрит на человека, но как он поймёт, где тот стоит, да и по сути ребенок будет ждать внимание наверно? Сначала придумал небольшой поворот головы. Потом добавил к этой идее камеру и поиск лица. Началась охота за деталями.
Для сравнения заказал MG90S и MG996R. Первый маленький, второй заметно крупнее - как раз хотелось проверить, справится ли лёгкий привод с будущей головой.

Управлять ими решил через PCA9685. Для камеры выбрал модуль на IMX708 с автофокусом. Экран — сенсорный Waveshare 3.5-inch DSI LCD (H), 480×800.
Для звука я постепенно собрал отдельную цепочку: цифровой микрофон ICS-43434 подключается к Pi через I²S, воспроизведение идёт через USB-звуковую карту и усилитель к динамикам. Аналоговый MAX9814 тоже рассматривал, но основным микрофоном он не стал. Ещё заказал два подшипника 6901 — они понадобятся для опоры шеи, чтоб не было люфта ни при повороте ни при касании экрана пальцем или стилусом.
Пока нужная камера ехала, я поставил на пробный кронштейн камеру от 3D-принтера, которой до этого пользовался как вебкой, а для разговора взял микрофон компьютера. Это был некрасивый, но полезный стенд: уже можно было наблюдать, находит ли программа лицо и куда она посылает сервопривод.

С питанием PCA9685 вышла отдельная история. На зелёном клеммнике я измерил 5 В, а на силовом контакте ряда сервоприводов — ноль. Через боковой вход V+ те же 5 В до ряда дошли, и привод заработал. Кто виноват и как исправить, я нашел в отзывах маркетплейса, но не стал запаивать, оставил вход V+. Зато на практике усвоил различие: VCC питает логику платы от 3,3 В Pi, а V+ - отдельную силовую шину серво на 5 В. Просто видеть контроллер по I²C ещё не значит, что мотор получил питание.
Настоящая камера и первая голова
Когда пришла IMX708, я сначала проверил не паспортную, а реальную скорость. На Pi 5 при сохранении полного угла обзора захват дал 50,03 кадра/с. С включённым поиском лица я получил 29,90 результата/с в 12-секундной пробе после прогрева. Это два разных числа: камера успевает снять кадры чаще, чем программа обработать лицо. Для плавного слежения мне хватило примерно 30 обновлений координат за секунду.

Экран тоже пришлось запускать и поворачивать уже на Pi. Потом приехал цифровой микрофон. Впервые удалось убрать временные устройства ПК и посмотреть, как ведут себя вместе камера, лицо, голос и привод.
В этот же период я добавил возможность обратиться к DeepSeek по API. Для пробы пополнил счёт на 200 рублей. Ответы на некоторые вопросы стали богаче, но локальные Vosk, Piper и модель на Pi я оставил: исходная идея робота без обязательного интернета никуда не делась. В программе я подбирал длину ответа и подсказку для модели, чтобы получалась реплика собеседника, а не монолог на полминуты.
С механикой всё оказалось муторнее, чем с красивым эскизом. Я подгонял 3D-модель, вырезал место под экран, камеру и крепёж, примерял шлейфы, печатал детали, снова мерил. На картинке всё сходится; в пластике внезапно мешает толщина платы, винт оказывается недоступен отвёртке, а отверстие корпуса зажимает подвижный объектив. Последнее я проверил руками: освободил объектив — автофокус заработал нормально. Поэтому готовность 3D модели ещё не означает готовности собранной головы. Заодно потратил остатки того пластика, который не жалко и валялся уже пару лет.

И вот я запустил первый стенд с экраном, камерой и движением. Голова находила человека и поворачивалась. Казалось бы, цель достигнута. Но я смотрел на неё и понимал: чего-то не хватает, помимо подбора пропорций лица (их я подобрал позже с большим вниманием и вообще сделал настраиваемой в меню).

Конечно. Если собеседник сместился чуть в сторону, сначала должны посмотреть глаза, потом при необходимости повернуться голова. И зрачки должны идти вместе с глазами, а не застывать на месте. Я начал связывать координаты лица с положением глаз и командой привода: сначала взгляд, потом плавный доворот, без рывка за каждым пикселем камеры. Очень долго получалось криво и в неверную сторону. После тщательной настройки движение вдруг стало убедительным: на меня смотрел уже не экран, а персонаж.

MG90S на лёгком кронштейне справлялся, но были рывки, а MG996R в сравнительной пробе оказался плавнее. Окончательный угол поворота и люфт я оставил до полной сборки.
«Как назовём?»
Появилась ещё одна неожиданная проблема. Робот хорошо слышал речь и охотно отвечал — на любую речь вокруг. Стоило поговорить между собой, как он уже считал, что обращаются к нему. Позвал дочь и спросил, как назвать персонажа.
«Лягушка», — ответила она.
WHAT!?!?!?! Нет, не ослышался. Ну ладно, Лягушка так Лягушка. По-моему, даже прикольно.
Вот так и пошло зарождение “Лягушки”.
Я добавил обращение по имени и разговор после взгляда в камеру. Имя помогает позвать её, когда человека нет перед объективом. Если сказать «Лягушка, стоп», она прекращает разговор, возвращает голову в центр и ждёт нового обращения. Это были первые правила поведения, после которых программа начала напоминать домашнего робота, а не постоянно открытый микрофон. А взгляд в камеру активировал запись звука и даже не надо было называть по имени, очень удобно оказалось.
Имя я тоже вынес в настройки: если дочери когда-нибудь надоест «Лягушка», можно вписать другое. Сохранил — и робот уже откликается на новое имя, без правок в коде.
Сейчас это ещё стенд и напечатанная пробная голова, а не окончательно собранная фигурка. Но я уже увидел главное: дочь разговаривает с персонажем, тот отвечает своим голосом, переводит взгляд и поворачивается к ней. В следующей части покажу, как я учил Лягушку не просто смотреть и говорить, а помогать с предметом перед камерой, выводить ответ на экран и отправлять результат на печать.
Продолжение скоро!
Комментарии (13)

mrbp_old
04.10.2026 08:10Хороший проект.
Но сам подход - "создаю ребенку робота, для того, что бы" он занимался с ним уроками, а далее пойдет по нарастающей - отвечал на все почему, советовал во всех вопросах, занимался воспитанием ... Просто очередная "умная" обёртка того же планшета с интернетом, что сейчас родители сюут в руки детям, что бы те не мешали и были заняты.
При таком подходе не стоит удивляться к старости - "и в кого они пошли?! Жёсткие безчувственные машины...". Хорошо, если соберут вам к старости работа, который будет за вами ухаживать.

NitroID Автор
04.10.2026 08:10Благодарю за критику. Я думал об этом. Для этого учитываются некие моменты. Дочь у меня с математическим складом, и ей интересно пределы робота больше, чем просто спрашивать. Безусловно робот не должен становиться заменой родителю, у нас с этим проблем нет.
Да и с вашей точки зрения есть другая сторона. Там где родитель не может уделить много времени в связи с отсутствием на работе, думаю что робот будет полезен, ведь ребенок может искать общение не только с хорошими людьми. В «очередном планшете» есть нативная реклама, приложения с рилсами в которых так же нет ничего хорошего, а в роботе грамотно написаный промпт настраивает его максимально как нужно родителю(это же очень гибкий инструмент). Не хочется чтоб решал за ребенка, прописывается промпт с наводящими вопросами, или вообще только просил обучить его, т.е. из ребенка делал учителя (моя это любит). В общем вариантов много.
Так же нынче создаются достаточно локальных узкоспециализированных моделей, с помощью которых робот может быть полезен и для взрослого, а так же стать вообще осистентом в офисе или каком нибудь рецепшене.

rPman
04.10.2026 08:10Осторожно, настройте циклическую саморизацию фактов в контекстом окне (сжатие), что бы не получалось что в контексте копится долгая беседа, это делает ИИ гиперакцентирующим внимание на факты и стили этой беседы, что неприятно влияет на психику, особенно неокрепшую, особенно когда беседы о чем то волнующем пользователя.
Хороший собеседник на основе ИИ это сам по себе проект не на пару часов.

NitroID Автор
04.10.2026 08:10Да, понял, благодарствую! Сейчас история у меня ограничена по объёму, сжатия пока нет. Когда добавлю сводки, планирую сохранять конкретные факты, предпочтения и незавершённые задачи. Временное настроение не хочу превращать в постоянную характеристику, которую робот потом потянет в каждый разговор. Сохранённые сведения у меня сейчас можно посмотреть, исправить и удалить. Конечно со временем что-то будет дорабатываться.

Ka463
04.10.2026 08:10Проект прикольный, я тоже думаю в том же направлении но не для ребенка а просто робот, но слегка в расширенной конфигурации, есть ускорители вроде ROCKCHIP RK1820/RK1828 как раз подойдут для малых моделей там инференс до 100т.с, и разгружает основной процессор для других полезных действий, так же нужна долговременная память как у агента, это решаемо на мобильных устройствах через ассоциативную память, в таком случае робот превращается в компаньона а не очередную колонку. можно повесить ToF сенсоры для упрощения восприятия глубины и расстояния до объекта, что бы не гонять постоянно камеру, а использовать редко только для распознавания объекта, ну и много чего можно еще придумать =)

NitroID Автор
04.10.2026 08:10Классные модули! Читал про их архитектуру. На больших моделях круто справляется. Но я пока для нынешних DIY-экспериментов модуль **Raspberry Pi AI HAT+ 2** для малинки закажу (жду 11.11 на алишке), думаю на первое время будет достаточно.
ToF смотрел. Но тут как раз цель чтоб голова двигалась. Даже прятки умудряются устроить (для этого пришлось и команды типа "Найди меня" и доворот типа реального поиска сделать). В общем идей для него море. Я хотел чтоб она автономно работала. И расчитывал на 4-6 18650. Временно отказался. Т.к. места прям впритык. Модель я буду дорабатывать в любом случае, но размеры печати принтера так же ограничены, Как разработаю новую 3-Д модель под автономность, то и модули\сенсоры можно будет добавлять.Вторая часть статьи почти дописана.

Ka463
04.10.2026 08:10Тоже отличный выбор, главное разгрузить центральный процессор, а если еще запихать ESP32-P4 на обработку видео и работу с экраном, то вообще остается непаханое поле для реализации любых фичь =)

ooptimum
04.10.2026 08:10Классный проект, который вполне может со временем превратиться в продукт. Не знаю, вывезет ли RPi5 нагрузку, но если бы я пилил такое, то на следующем этапе сделал бы память, чтобы модель помнила старые диалоги и предпочтения “клиента”. По диалогам можно сделать RAG, а для запоминания предпочтений можно прикрутить Honcho или нечто подобное. Тогда можно будет задавать не только сиюминутные вопросы, но и говорить что-то вроде: “Помнишь, мы с тобой обсуждали…?” Возможно, для этого придется завести небольшой домашний сервер. :)
ktibr0
здоровский проект, тема компаньонов, особенно "физических", все чаще появляется и в моем окружении, я для своего Гермеса тоже приделываю "морду лица", правда, использую старый телефон ))
Лягушка, как имя тоже меня "торкнуло", поэтому, пошел в Клод и спросил совета, как можно назвать. ИИ ответил:
Небольшое наблюдение: камера на бантике сверху очень похожа на «лягушачий глаз», который торчит из макушки. Так что тема лягушки в этом дизайне уже есть.Каэру (Kaeru, 蛙): просто «лягушка» по-японски. Это каламбур: 帰る («вернуться домой») звучит так же, поэтому лягушки в Японии считаются талисманом счастливого возвращения. Для домашнего компаньона звучит мило: «всегда возвращается к тебе». Подойдёт и «Каэ-тян».
Василиса: от «Царевны-лягушки». Лягушка превращается в красавицу, а здесь «лягушка» превращается в друга с живым лицом на экране. Можно звать «Васька» или «Ваcя-ква».мне кажется, Василиса, совсем неплохо, это, если бы аниме дулали по русской сказке - может быть так нарисовали ))
NitroID Автор
Спасибо за поддержку) Интересное решение - спросить про совместимость имени! Прикольно что так совпало.