Привет всем. В данной статье я расскажу историю как мы с двоюродным братом сделали свою «умную» колонку.
На самом деле никакая она неумная, грубая и не особо полезная, но зато весёлая и с характером.
За мной сама идея, программирование, железо (подбор и настройка).
От брата 3D-модель, 3D-печать, железо (подбор и электромонтаж).
Статья по-большей части описывает то, что делал я, лишь немного касаясь 3D-модели.
Будучи большим фанатом известного мультсериала «Футурама», однажды (где-то в 2018 году) мне захотелось заиметь самодельную голову робота Бендера Родригеса. В голове, в том числе крутились дурацкие варианты сделать её из какой-нибудь кастрюли. В силу своей глупости идея была забыта и заброшена ровно до того момента пока у одного хорошего человека, моего брата, товарища xbost’а не появился 3D-принтер (весна 2019 года). И тут эта идея снова ожила…
Обсудив эту идею за пивом, принялись за работу. Брат начал делать 3D-модель, а я искать, что из электронного хлама в ящике стола можно задействовать в проекте.
К тому моменту, у меня уже несколько лет валялась без дела плата Intel Galileo Gen2. И было желание задействовать её в этом проекте. Изначально никаких «умных» функций не планировалась, просто запихнуть её в корпус вместе с динамиком и светодиодами, вытащить кнопочку, при нажатии на которую воспроизводились бы цитаты из серий и светились диоды.
В то же время вокруг буйным цветом расцветали (и продолжают расцветать сейчас) умные колонки с голосовыми ассистентами. Они вежливы (Алиса правда хамовата), достаточно много всего умеют и не работают без Интернета. И по мне достаточно скучны.
Это привело к мысли, что на основе Бендера с его вредным, эгоистичным и вообще отрицательным характером можно сделать для себя отличную «умную» колонку. Этакий арт-проект, протест против умных колонок. И обязательно работающую оффлайн, даже ценой производительности.
Почитав о системах распознавания речи с возможностью оффлайн-распознавания, а также узнав, что ещё один хороший человек, коллега с прошлой работы, в то время писавший диплом, использует CMU Sphinx, выбор был остановлен на нём.
В силу своей природной… хм… невнимательности, я упустил существование более подходящей для моей задачи версии – pocketsphinx, и начал с «большого» CMU Sphinx на Java.
Создал простенькие JSGF-грамматику и программу на Яве. Взял несколько наиболее известных цитат для проигрывания(“with blackjack and hookers”, “bite my shiny metal ass”, “kill all humans” и т.п.). Пробовал изначально на достаточно мощном компьютере(MacBook Pro 13-го года), был доволен результатом производительности, но понимал, что на Галилео меня ждёт нечто другое. Но дело оказалось совсем плохо.
Вообще Галилео уже давно заброшен Интелом. Стандартный Линукс, шедший с ним мне в принципе особенно не нравился. Поэтому попробовал с последней доступной для него сборкой Дебиан.
Туда с проблемами(подробности уже честно не вспомню) был поставлен JRE. В качестве устройства ввода/вывода аудио была использована USB-гарнитура. И… Результат был крайне печален в плане производительности. Сейчас опять же не вспомню, возможно неправильную акустическую модель использовал на ней, но на реакции уходило 30-60 секунд. Плюс брат начал разрабатывать 3D-модель, и сказал, что габариты Галилео большеваты. Плюс отсутствие встроенного Wi-Fi. В общем Галилео опять отправилась в стол.
Решено было попробовать на гораздо более популярной Малинке, и выбор пал на слабую, но самую компактную версию Raspberry Pi Zero W. А также, прокачав внимательность, узнал о pocketsphinx (отличная статья для старта), перешёл на него, и переписал программу на Питоне.
При переходе на Малину, с подачи xbost’а, родилось название для проекта – Pinder (Raspberry Pi + Bender). Да, я прекрасно помню историю с Pidora в русскоязычном сегменте, но в данном случае намеренно выбрал такое лулзовое для русского уха название.
И так предыстория завершена, можно переходить непосредственно к описанию Пиндера.
Перечень использованных компонентов:
Raspberry Pi Zero W – собственно основа всего.
UPS-Lite for Raspberry Pi Zero
Маленький ИБП для Малинки. Его штатный выключатель был выпаян, и к его контактам был припаян микропереключатель (см. далее по списку).
RGB адресная светодиодная лента на WS2812B, 60 светодиодов на 1 метр
Для подсветки и анимации «зубов»(18 штук) и глаз(2 штуки).
В принципе подойдёт любая, работающая в Линуксе. Подключается через OTG-кабель в единственный доступный для этого порт на Малине Зеро.
Усилитель и один динамик от таких колонок
В общем тут колхозный вариант был использован. Колонки были раздербанены, взят один динамик, усилитель вытащен из корпуса. Можно было купить отдельный усилитель и динамик, но для меня самым быстрым вариантом было тогда купить эти колонки и разобрать на части.
Но во время разработки поначалу использовался микрофон от телефонной гарнитуры Philips.
Микропереключатель с лапкой KLS7-KW10
Замыкается/размыкается при вставлении/вынимании "антенны" Бендера. Включает/выключает питание от UPS к Малине.
3,5мм разъём и гнездо jack. Для подключения микрофона к аудиокарте (микрофон находится наверху Бендера, в антенне).
В общем внутри всё достаточно колхозно.
Схема подключений очень простая:
Глаза сидят на отдельном пине от зубов и запараллелены между собой. Если бы делал сейчас, то включил бы глаза на одну ленту вместе с зубами, но что уже сделано, то сделано.
Здесь я не смогу рассказать многого, так как эта часть работы полностью брата.
3D-модель и небольшая инструкция доступны здесь.
Зубы и глаза напечатаны фотополимерной смолой на Anycubic Photon. Все остальные части PLA на Creality Ender 3.
Если будут какие-то вопросы по 3D-модели и печати можно задать мне, я их передам, либо попробовать напрямую спросить у xbost’а на thingiverse (но не уверен будет ли он на них отвечать).
Краткая схема сборки:
Фото в процессе сборки и полностью собранном виде:
В качестве ОС используется штатный Raspbian (теперь Raspberry Pi OS).
За распознавание, как уже писалось выше, отвечает pocketsphinx. В качестве аудиоподсистемы используется Alsa (Pulseaudio выпилен).
Подсветка управляется с помощью библиотеки Adafruit_Blinka.
Данные о заряде/напряжении читаются из UPS-Lite посредством SMBus.
При разработке никакими лучшими практиками не руководствовался, поэтому код «попахивает».
Поддерживается два языка: английский и русский. Для каждого языка своя JSGF-грамматика, набор аудио-сэмплов(сэмплов в репозитории нет, по соображениям авторских прав) и синтез речи. Русский дорабатывался(и дорабатывается) с некоторым опозданием.
Основной целью была просто возможность отвечать фановыми фразами из серий. Задаешь ему вопросы типа “Как дела?”, “Где ты родился?”, “Что думаешь о Сири?”. Ищется и воспроизводится ответ из сэмплов (в случае отсутствия сэмпла используется синтез речи, но об этом чуть позже).
Изначально скорость ответов на Малине была не очень шустрой (4-6 секунд до ответа):
Покопавшись у себя в коде, были найдены и уничтожены необязательные паузы. То же самое касалось и сэмплов (были пустые места вплоть до 1 секунды в начале файлов). А также прочитана информация о параметрах оптимизации pocketsphinx. Получилось уже получше:
Далее начал добавлять кое-какие полезные функции. Первой стала проигрывание музыки с локальной ФС или интернет-радио с помощью MPD. При этом докричаться до Бендера при проигрывании музыки на приличной громкости сложновато:
После достаточно долгого перерыва, живя на даче, была добавлена первая функция “умного дома”- управление освещением в своём углу через ModBusTCP. Вот только Бендера недостаточно иногда просто попросить включить свет, нужно обязательно сказать "пожалуйста". Работает достаточно шустро:
Потом однажды захотелось добавить читалку RSS-новостей. Это уже было невозможно без синтеза речи, но при этом хотелось, чтобы синтезатор звучал как, или хотя бы похоже на голос Бендера. Такой синтез речи на Малине Зеро представляется малореальным и поэтому в этом моменте пришлось сдаться и задействовать онлайн-сервис.
Почитав информацию и попробовав разные варианты остановился на Microsoft Azure Custom Speech.
При создании пользовательского голоса на выбор есть три варианта:
Statistical Parametric – стандартное качество, нужно небольшое количество(для английского языка) сэмплов для обучения.
Concatenative – высокое качество, нужно 6000 сэмплов для обучения.
Neural премиум-качество. По факту недоступно(доступно из США, при написании челобитной в Майкрософт зачем тебе это нужно и выкладывании 100 000$).
Более подробно по технологиям синтеза речи можно почитать например на Википедии.
У меня не было большого количества сэмплов, поэтому сначала поигрался со Statistical Parametric. Результат был неплох, голос конечно не был похож(такой тип синтеза для сильной похожести и не предназначен), но интонации передавал сносно. В итоге на основе набора данных созданного с помощью этой модели я создал оффлайновую модель для CMU Flite, используемую в случае отсутствия связи с MS Azure.
Но всё же хотелось большей похожести и я решился попробовать собрать 6000 сэмплов для Concatenative модели, использующей отрывки из сэмплов настоящего голоса. Очень помог некий хороший человек, выложивший на YouTube 7 видео The Best of Bender. Надёргав оттуда сэмплов, приплюсовав к ним те что уже были и натравив на них майкрософтовский же Text-to-Speech (здесь у меня набор тулзов вспомогательных), получил что-то около 2000 транскрибированных сэмплов. Было принято решение просто скопировать это всё три раза под разными именами, чтобы получить 6000.
В итоге всё это было залито на обучение модели, и результат получился следующим:
Да конечно не идеально, но меня результат трудов устроил.
В итоге синтез речи используется не только для чтения новостей, но и в случае отсутствия оригинального сэмпла. Сначала ищется сэмпл. Если его нет, проверяется связь с порталом MS Azure, если есть – синтезируется с помощью него. Если же связи с Azure нет – используется локальная модель Flite(а для русского языка роботизированный голос eSpeak).
В сумме периодическими волнами и рывками разработка шла с весны 2019-го по весну 2020-го, в свободное время(хорошо видно по коммитам на гитхабе). Далее уже даже не волнами, просто отдельными всплесками.
Как таковых планов развития проекта нет. Если появляется желание и вдохновение, то добавляю что-нибудь. Так конечно напрашивается сделать режим просто болталки на нейронке, обученной на фразах Бендера. Ещё возможно добавить режим bluetooth-колонки(и чтобы зубы загорались синим в этом режиме) и приложение для смартфона, для активации схемы патриотизма.
Но для начала надо изобрести удлинитель пальца.
Исходный код ПО и 3D-модель выложены под открытыми лицензиями, так что если у кого-то есть желание сделать своего Бендера, добавить свои функции и улучшить – буду рад.
На этом статья подошла к концу. Спасибо, что прочитали!
Всем хороших новостей!
Классная поделка! Как идея для следующих релизов, вместо квадратных зрачков глаз делать треугольные при проигрывании музыки, вроде такая фича была в Бендера.
Спасибо!
Ну они сейчас хардварно квадратные:) Это надо какие-нибудь экранчики в глаза тогда.
Вообще так бы и рот сделать экраном гибким было бы классно, чтобы его «мимику» из мульта повторить.
Тогда уже получится LEXX, а не Футурама
Самый симпатичный вариант умной колонки, из тех, которые я видел.
Да уж, это не бездушная Алиса
Идея — агонь!
Отчаянно нехватает движения глаз и век.
Если поставить пару-тройку микрофонов, можно запилить поворот глаз на говорящего.
Или поворотной на все 360 подставки.
Главное, чтобы автор не останавливался на бета-релизе)
Пока остановился:) Дальше посмотрим как будет вдохновение.
Спасибо!

Да, мне тоже не хватает.
Причём это заложено в конструкции:
Но когда разрабатывали я подумал, что колонке управляемые глаза не нужны, сейчас об этом немного жалею.
А вот товарищи из Италии сделали ремикс модели брата(но по железу используют ESP8266, распознавания у них нет) и добавили выезжающие глаза(а ещё съезжание крыши Бендера от магнита):
Двигающиеся глаза добавят жизни, это точно. Можно еще отдельно руку, чтоб пальцы шевелились и всякие знаки могли показывать, козу, виктори ну и прочее по желанию. Потрясающая работа. Весело и со вкусом.
С рукой для меня точно слишком:) Вообще в принципе хотелось, чтобы он был достаточно простым и из недорогих деталей, чтобы другим при желании не так сложно было повторить.

Вот в машинку посадить была мысль:
Видел в сети несколько проектов манипуляторов типа рука, также на принтере печатанные, можно было бы как опцию сделать. =)
Очень круто! :D
Лезет ещё в голову что-то типа:
speech to text -> GPT-3 -> text to speech
Спасибо!
Мне тоже лезет, но пока лень сильнее:)
вот это использую как основу для домашнего ассистента в квартире https://docs.espressif.com/projects/esp-adf/en/latest/get-started/get-started-esp32-lyrat.html
Мне срочно нужна такая же колонка :D вам бы открыть свое производство и продавать этот шедевр
На самом деле это не consumer-ready продукт, чтобы его продавать.
И даже если допилить есть несколько моментов:
1) Собственно самый главный — копирайт. Futurama — собственность Fox, а теперь тем более это Disney. Я почитал на тему лицензирования у Disney, пишут, что их обычно интересуют суммы от 6 нулей в долларах. Я послал им запрос на почту в декабре(так как меня уже спрашивали люди на Ютубе и Реддите о возможности купить в виде кита), но думаю либо ответа не будет вообще, либо «нам неинтересно». Ещё хуже если вообще скажут: «Удаляй всё с Ютуба нафиг!»
2) Политика продажи Raspberry Pi Zero — одна штука в руки. Поэтому явно придётся переделывать на что-то другое в таком случае.
3) 3D-печатью своими силами много не напечатаешь, я так условно прикидывал, сами сможем 1 штуку в неделю производить. Для массового производства надо форму делать, это всё очень приличные вложения.
Ну на счет копирайта можно же быть хитрее.
Вы можете случайно выложить исходники для 3d печати. А продовать начинку, с инструкцией что можно распечатать еще корпус, вот пример, но сделайте его сами.
Они выложены специально:)
Проект открытый изначально, и модель, и софт.
Но если заглянуть на лицензирование Disney, то получается что даже для "for non-commercial uses such as hand-made artwork, clothing, themed private parties, student projects, stage shows, etc." — надо просить разрешение.
На Etsy много продаётся товаров диснеевской тематики. Видимо никого не трогают, пока не появляются большие суммы, или кто-то не пожалуется.
Но я для себя считаю, что правильно было бы платить роялти создателям Футурамы. Благодаря им этот проект в принципе появился, и если зарабатывать на этом, надо однозначно отдавать долю авторам.
Ну, так если в результате будет ощутимая доля, тогда с ними можно и поговорить. А пока что работа юриста будет стоить куда больше чем они смогут получить. В лицензию они это внесли исключительно из тех соображений, чтобы когда раскрутился некоммерческий проект, можно было предъявить претензии.
Вот если представить, что я пойду на какую-нибудь краудфаундинговую платформу с проектом, затрагивающим копирайт Диснея(да не важно чей, любой копирайт, на который у меня нет прав), как думаете они примут такой проект?
Мне почему-то кажется нафиг пошлют.
будет куда обиднее, если вдруг в диснее прочухают про эту колонку и наклепают таких же, потому что им можно
Да пусть делают)
А я буду брюзжать, что первым сделал))
Но вообще такое ощущение пока, что Футурама для Диснея, не пришей кобыле хвост.
Они не транслируют её у себя на Disney+. Неформат для основной аудитории Диснея.
Очень круто. Хочу сделать также
Может сделаете производство?
Ответил выше.
Вы большой молодец, вышло просто супер, успехов!!!
Спасибо!
Но всё таки молодцы, с братом вместе)
Ответил выше.
Промазал с комментарием. Если можно прошу модераторов удалить лишний.
Классно молодец! По поводу распознавания команд — не хватает избирательной направленности микрофона, массива микрофонов с дальнейшей DSP обработкой. Да и акустическая конструкция (расположение микрофонов, динамика, демпфирование, экранировка) играет не последнюю роль.
Я бы в первую очередь поставил правильный и каноничный процессор, проверенный временем.
Это да. У нас отечественная пиратская подделка, поэтому Pinder:)
Я летом купил такую штуку — https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/. Эта с двумя микрофонами, а там ещё есть и 4, и 6, и вроде 8.
И начал делать то ли вторую версию Бендера, то ли сына Бендера, то ли безумного робота Роберто.
Неплохо в принципе работает, но как-то у меня уже топливо на этот проект к тому моменту истощилось. Ща валяется на даче, может ещё сделаю что-нибудь с этим.
Жаль всё это только в зачаточном состоянии сейчас.
Нормального открытого ПО для работы с массивами микрофонов нет, нет стандартизованных модульных интерфейсов для голосовых помощниуов, Алиса та же едва-едва покрывает долю процента от потенциальных возможностей концепции.
Вглядит, конечно, будто вот бери малинку и делай, все технологии есть, но по факту работы не меряно и потянуть в одно лицо такой проект, чтобы было юзабельно — это очень трудно. Вон даже гигантский яндекс пока что не выкатывает толком норамльных возможностей, а откровенно слабый АПИ для скиллов рубит огромное количество классных идей.
Голосовым помощникам очень не хватает качественной универсальной и стандартизированной аппаратной работы с голосами, с локацией их в пространстве, с конецепцией multiroom, с языками, с интонациями, акцентами, ударениями.
В софте не хватает поддержки вложенных и смешанных контекстов, возможности смешивать скиллы для одновременной работы в одном контексте.
Много всего можно сделать сейчас. Рынок в этой отрасли как дикий запад. Вон люди пишут тупые игры для алисы и выигрывают конкурсы яндекса на них. Очень не хватает качественной открытой аппаратной части для типовой колонки. Тогда, мне кажется, будет прорыв.
Честно скажу я никакими голосовыми помощниками и не пользуюсь:)
Фото где наш Бендер на Яндекс.Станции — у брата.
Этот проект, он именно что пародия на умные колонки, арт-проект, игрушка.
Здесь смотря для чего, делать что-то глобальное, соглашусь — неподъёмно(хотя может для какого-нибудь очень продуктивного гения и реально, не буду категоричен).
А вот сделать что-то по фану вполне достаточно, даже вот оффлайн.
коутейшая штука. хотя я и не любитель всех этих колонок) но сделал бы. 3д принтер есть
Можете просто напечатать корпус)

Или например можно его использовать как ночник:
не подскажите ссылку на 3д модель которую использовали вы?
Вообще было в статье в разделе 3D-модель)
Но мне не жалко) — https://www.thingiverse.com/thing:4384974
Какой Pinder это же Benderasp самый настоящий!!!!
:)
Модель выглядит очень хорошо обработанной и не скажешь сразу, что это на 3д принтере (очень гладко). Было б хорошо про «механическую» часть узнать, как делалась
К сожалению брат вряд ли будет писать статью по своей части.

У вас есть какие-то конкретные вопросы?
На странице 3D-модели есть небольшое описание: https://www.thingiverse.com/thing:4384974
И сзади, вблизи хорошо видно, что 3D-печать:
Для меня Linux — плюс. Я использую его в том числе просто как сервачок для тестов иногда.
И если бы сейчас делал продвинутою версию, взял бы или полноразмерную Малину, или что-то подобное с графикой помощнее, чтобы ещё и как консоль к телевизору использовать.
Спасибо за статью! Я давно планирую своего "робота", говорящая злая голова + роботизированная рука )) Планирую на платформе Nvidia jetson nano 2GB (около 50$). Плюсы, что много всего для нейросети от Nvidia уже идёт. Кстати, я в 15 минутах от Диснея живу (в Орландо), могу к знакомым коллегам обратиться по вашему вопросу ))
Да, на Джетсоне можно конечно гораздо больше всего накрутить, хотя бы даже распознавание на Mozilla DeepSpeech должно нормально работать(правда когда я пробовал летом была беда с сэмплами плохого качества, в то время как Microsoft STT отлично справлялся, но всё равно было бы очень интересно попробовать на Джетсоне).
Если «за спрос денег не берут», тогда поинтересуйтесь)) Спасибо!