Я сделаю свою «умную» колонку… «with blackjack and hookers!»

Привет всем. В данной статье я расскажу историю как мы с двоюродным братом сделали свою «умную» колонку.

На самом деле никакая она неумная, грубая и не особо полезная, но зато весёлая и с характером.

За мной сама идея, программирование, железо (подбор и настройка).

От брата 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 штуки).

  • USB-аудиокарта

    В принципе подойдёт любая, работающая в Линуксе. Подключается через OTG-кабель в единственный доступный для этого порт на Малине Зеро.

  • Усилитель и один динамик от таких колонок

    В общем тут колхозный вариант был использован. Колонки были раздербанены, взят один динамик, усилитель вытащен из корпуса. Можно было купить отдельный усилитель и динамик, но для меня самым быстрым вариантом было тогда купить эти колонки и разобрать на части.

  • Микрофон HBC10A

    Но во время разработки поначалу использовался микрофон от телефонной гарнитуры Philips.

  • Микропереключатель с лапкой KLS7-KW10

    Замыкается/размыкается при вставлении/вынимании "антенны" Бендера. Включает/выключает питание от UPS к Малине.

  • 3,5мм разъём и гнездо jack. Для подключения микрофона к аудиокарте (микрофон находится наверху Бендера, в антенне).

В общем внутри всё достаточно колхозно.

Схема подключений очень простая:

Глаза сидят на отдельном пине от зубов и запараллелены между собой. Если бы делал сейчас, то включил бы глаза на одну ленту вместе с зубами, но что уже сделано, то сделано.

3D-модель, корпус

Здесь я не смогу рассказать многого, так как эта часть работы полностью брата.

3D-модель и небольшая инструкция доступны здесь.

Зубы и глаза напечатаны фотополимерной смолой на Anycubic Photon. Все остальные части PLA на Creality Ender 3.

Если будут какие-то вопросы по 3D-модели и печати можно задать мне, я их передам, либо попробовать напрямую спросить у xbost’а на thingiverse (но не уверен будет ли он на них отвечать).

Краткая схема сборки:

Фото

Фото в процессе сборки и полностью собранном виде:

Программная часть 1

В качестве ОС используется штатный Raspbian (теперь Raspberry Pi OS).

За распознавание, как уже писалось выше, отвечает pocketsphinx. В качестве аудиоподсистемы используется Alsa (Pulseaudio выпилен).

Подсветка управляется с помощью библиотеки Adafruit_Blinka.

Данные о заряде/напряжении читаются из UPS-Lite посредством SMBus.

При разработке никакими лучшими практиками не руководствовался, поэтому код «попахивает».

Код лежит здесь.

Поддерживается два языка: английский и русский. Для каждого языка своя JSGF-грамматика, набор аудио-сэмплов(сэмплов в репозитории нет, по соображениям авторских прав) и синтез речи. Русский дорабатывался(и дорабатывается) с некоторым опозданием.

Основной целью была просто возможность отвечать фановыми фразами из серий. Задаешь ему вопросы типа “Как дела?”, “Где ты родился?”, “Что думаешь о Сири?”. Ищется и воспроизводится ответ из сэмплов (в случае отсутствия сэмпла используется синтез речи, но об этом чуть позже).

Изначально скорость ответов на Малине была не очень шустрой (4-6 секунд до ответа):

Покопавшись у себя в коде, были найдены и уничтожены необязательные паузы. То же самое касалось и сэмплов (были пустые места вплоть до 1 секунды в начале файлов).  А также прочитана информация о параметрах оптимизации pocketsphinx. Получилось уже получше:

Далее начал добавлять кое-какие полезные функции. Первой стала проигрывание музыки с локальной ФС или интернет-радио с помощью MPD. При этом докричаться до Бендера при проигрывании музыки на приличной громкости сложновато:

После достаточно долгого перерыва, живя на даче, была добавлена первая функция “умного дома”-  управление освещением в своём углу через ModBusTCP. Вот только Бендера недостаточно иногда просто попросить включить свет, нужно обязательно сказать "пожалуйста". Работает достаточно шустро:

Программная часть 2

Потом однажды захотелось добавить читалку 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-модель выложены под открытыми лицензиями, так что если у кого-то есть желание сделать своего Бендера, добавить свои функции и улучшить – буду рад.

На этом статья подошла к концу. Спасибо, что прочитали!

Всем хороших новостей!

Комментарии 38

    +2
    Классная поделка! Как идея для следующих релизов, вместо квадратных зрачков глаз делать треугольные при проигрывании музыки, вроде такая фича была в Бендера.
      +3
      Спасибо!
      Ну они сейчас хардварно квадратные:) Это надо какие-нибудь экранчики в глаза тогда.
      Вообще так бы и рот сделать экраном гибким было бы классно, чтобы его «мимику» из мульта повторить.
        +6
        надо какие-нибудь экранчики в глаза… и рот сделать экраном

        Тогда уже получится LEXX, а не Футурама image
      +10
      Самый симпатичный вариант умной колонки, из тех, которые я видел.
        0

        Да уж, это не бездушная Алиса

        +8

        Идея — агонь!
        Отчаянно нехватает движения глаз и век.
        Если поставить пару-тройку микрофонов, можно запилить поворот глаз на говорящего.

          0

          Или поворотной на все 360 подставки.
          Главное, чтобы автор не останавливался на бета-релизе)

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

            +3

            Очень круто! :D


            Лезет ещё в голову что-то типа:


            speech to text -> GPT-3 -> text to speech

              0
              Спасибо!
              Мне тоже лезет, но пока лень сильнее:)
              0

              вот это использую как основу для домашнего ассистента в квартире https://docs.espressif.com/projects/esp-adf/en/latest/get-started/get-started-esp32-lyrat.html

                0
                Мне срочно нужна такая же колонка :D вам бы открыть свое производство и продавать этот шедевр
                  +1
                  На самом деле это не consumer-ready продукт, чтобы его продавать.
                  И даже если допилить есть несколько моментов:
                  1) Собственно самый главный — копирайт. Futurama — собственность Fox, а теперь тем более это Disney. Я почитал на тему лицензирования у Disney, пишут, что их обычно интересуют суммы от 6 нулей в долларах. Я послал им запрос на почту в декабре(так как меня уже спрашивали люди на Ютубе и Реддите о возможности купить в виде кита), но думаю либо ответа не будет вообще, либо «нам неинтересно». Ещё хуже если вообще скажут: «Удаляй всё с Ютуба нафиг!»
                  2) Политика продажи Raspberry Pi Zero — одна штука в руки. Поэтому явно придётся переделывать на что-то другое в таком случае.
                  3) 3D-печатью своими силами много не напечатаешь, я так условно прикидывал, сами сможем 1 штуку в неделю производить. Для массового производства надо форму делать, это всё очень приличные вложения.
                    –1
                    Ну на счет копирайта можно же быть хитрее.
                    Вы можете случайно выложить исходники для 3d печати. А продовать начинку, с инструкцией что можно распечатать еще корпус, вот пример, но сделайте его сами.
                      +1
                      Они выложены специально:)
                      Проект открытый изначально, и модель, и софт.
                      Но если заглянуть на лицензирование Disney, то получается что даже для "for non-commercial uses such as hand-made artwork, clothing, themed private parties, student projects, stage shows, etc." — надо просить разрешение.
                      На Etsy много продаётся товаров диснеевской тематики. Видимо никого не трогают, пока не появляются большие суммы, или кто-то не пожалуется.
                      Но я для себя считаю, что правильно было бы платить роялти создателям Футурамы. Благодаря им этот проект в принципе появился, и если зарабатывать на этом, надо однозначно отдавать долю авторам.
                        0
                        Ну, так если в результате будет ощутимая доля, тогда с ними можно и поговорить. А пока что работа юриста будет стоить куда больше чем они смогут получить. В лицензию они это внесли исключительно из тех соображений, чтобы когда раскрутился некоммерческий проект, можно было предъявить претензии.
                          +1
                          Вот если представить, что я пойду на какую-нибудь краудфаундинговую платформу с проектом, затрагивающим копирайт Диснея(да не важно чей, любой копирайт, на который у меня нет прав), как думаете они примут такой проект?
                          Мне почему-то кажется нафиг пошлют.
                      0
                      будет куда обиднее, если вдруг в диснее прочухают про эту колонку и наклепают таких же, потому что им можно
                        0
                        Да пусть делают)
                        А я буду брюзжать, что первым сделал))
                        Но вообще такое ощущение пока, что Футурама для Диснея, не пришей кобыле хвост.
                        Они не транслируют её у себя на Disney+. Неформат для основной аудитории Диснея.
                    0
                    Очень круто. Хочу сделать также
                      0
                      Может сделаете производство?
                        0
                          0
                          Вы большой молодец, вышло просто супер, успехов!!!
                            0
                            Спасибо!
                            Но всё таки молодцы, с братом вместе)
                        0
                        Ответил выше.
                        Промазал с комментарием. Если можно прошу модераторов удалить лишний.
                          0
                          Классно молодец! По поводу распознавания команд — не хватает избирательной направленности микрофона, массива микрофонов с дальнейшей DSP обработкой. Да и акустическая конструкция (расположение микрофонов, динамика, демпфирование, экранировка) играет не последнюю роль.
                            +1

                            Я бы в первую очередь поставил правильный и каноничный процессор, проверенный временем.


                              0
                              Это да. У нас отечественная пиратская подделка, поэтому Pinder:)
                              0
                              Я летом купил такую штуку — https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/. Эта с двумя микрофонами, а там ещё есть и 4, и 6, и вроде 8.
                              И начал делать то ли вторую версию Бендера, то ли сына Бендера, то ли безумного робота Роберто.
                              Неплохо в принципе работает, но как-то у меня уже топливо на этот проект к тому моменту истощилось. Ща валяется на даче, может ещё сделаю что-нибудь с этим.
                                0

                                Жаль всё это только в зачаточном состоянии сейчас.
                                Нормального открытого ПО для работы с массивами микрофонов нет, нет стандартизованных модульных интерфейсов для голосовых помощниуов, Алиса та же едва-едва покрывает долю процента от потенциальных возможностей концепции.
                                Вглядит, конечно, будто вот бери малинку и делай, все технологии есть, но по факту работы не меряно и потянуть в одно лицо такой проект, чтобы было юзабельно — это очень трудно. Вон даже гигантский яндекс пока что не выкатывает толком норамльных возможностей, а откровенно слабый АПИ для скиллов рубит огромное количество классных идей.


                                Голосовым помощникам очень не хватает качественной универсальной и стандартизированной аппаратной работы с голосами, с локацией их в пространстве, с конецепцией multiroom, с языками, с интонациями, акцентами, ударениями.
                                В софте не хватает поддержки вложенных и смешанных контекстов, возможности смешивать скиллы для одновременной работы в одном контексте.


                                Много всего можно сделать сейчас. Рынок в этой отрасли как дикий запад. Вон люди пишут тупые игры для алисы и выигрывают конкурсы яндекса на них. Очень не хватает качественной открытой аппаратной части для типовой колонки. Тогда, мне кажется, будет прорыв.

                                  0
                                  Честно скажу я никакими голосовыми помощниками и не пользуюсь:)
                                  Фото где наш Бендер на Яндекс.Станции — у брата.
                                  Этот проект, он именно что пародия на умные колонки, арт-проект, игрушка.

                                  Вглядит, конечно, будто вот бери малинку и делай, все технологии есть, но по факту работы не меряно и потянуть в одно лицо такой проект, чтобы было юзабельно — это очень трудно.

                                  Здесь смотря для чего, делать что-то глобальное, соглашусь — неподъёмно(хотя может для какого-нибудь очень продуктивного гения и реально, не буду категоричен).
                                  А вот сделать что-то по фану вполне достаточно, даже вот оффлайн.
                              0
                              коутейшая штука. хотя я и не любитель всех этих колонок) но сделал бы. 3д принтер есть
                                0
                                Можете просто напечатать корпус)
                                Или например можно его использовать как ночник:
                                image

                                  0
                                  не подскажите ссылку на 3д модель которую использовали вы?
                              0

                              Какой Pinder это же Benderasp самый настоящий!!!!

                            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                            Самое читаемое