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


AliExpress RU&CIS

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

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

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

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

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

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




Комментарии (47):

  1. ramzes2
    /#22585208

    Классная поделка! Как идея для следующих релизов, вместо квадратных зрачков глаз делать треугольные при проигрывании музыки, вроде такая фича была в Бендера.

    • Zen_Kong
      /#22585258 / +1

      Спасибо!
      Ну они сейчас хардварно квадратные:) Это надо какие-нибудь экранчики в глаза тогда.
      Вообще так бы и рот сделать экраном гибким было бы классно, чтобы его «мимику» из мульта повторить.

      • rexen
        /#22586576 / +2

        надо какие-нибудь экранчики в глаза… и рот сделать экраном

        Тогда уже получится LEXX, а не Футурама image

  2. Exchan-ge
    /#22585654 / +4

    Самый симпатичный вариант умной колонки, из тех, которые я видел.

    • nitro80
      /#22585860 / -2

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

  3. andi123
    /#22585748

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

    • RiddickABSent
      /#22586192

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

      • Zen_Kong
        /#22586364 / +1

        image
        Пока остановился:) Дальше посмотрим как будет вдохновение.

    • Zen_Kong
      /#22586352 / +1

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

      • aaj
        /#22591236

        Двигающиеся глаза добавят жизни, это точно. Можно еще отдельно руку, чтоб пальцы шевелились и всякие знаки могли показывать, козу, виктори ну и прочее по желанию. Потрясающая работа. Весело и со вкусом.

        • Zen_Kong
          /#22591252

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

          • aaj
            /#22591404

            Видел в сети несколько проектов манипуляторов типа рука, также на принтере печатанные, можно было бы как опцию сделать. =)

  4. GLaNIK
    /#22585792 / +1

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


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


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

    • Zen_Kong
      /#22586366

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

  5. AndyKorg
    /#22585974

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

  6. vitya-nfc
    /#22586546

    Мне срочно нужна такая же колонка :D вам бы открыть свое производство и продавать этот шедевр

    • Zen_Kong
      /#22586574 / +1

      На самом деле это не consumer-ready продукт, чтобы его продавать.
      И даже если допилить есть несколько моментов:
      1) Собственно самый главный — копирайт. Futurama — собственность Fox, а теперь тем более это Disney. Я почитал на тему лицензирования у Disney, пишут, что их обычно интересуют суммы от 6 нулей в долларах. Я послал им запрос на почту в декабре(так как меня уже спрашивали люди на Ютубе и Реддите о возможности купить в виде кита), но думаю либо ответа не будет вообще, либо «нам неинтересно». Ещё хуже если вообще скажут: «Удаляй всё с Ютуба нафиг!»
      2) Политика продажи Raspberry Pi Zero — одна штука в руки. Поэтому явно придётся переделывать на что-то другое в таком случае.
      3) 3D-печатью своими силами много не напечатаешь, я так условно прикидывал, сами сможем 1 штуку в неделю производить. Для массового производства надо форму делать, это всё очень приличные вложения.

      • abondarev
        /#22586670 / -1

        Ну на счет копирайта можно же быть хитрее.
        Вы можете случайно выложить исходники для 3d печати. А продовать начинку, с инструкцией что можно распечатать еще корпус, вот пример, но сделайте его сами.

        • Zen_Kong
          /#22586740

          Они выложены специально:)
          Проект открытый изначально, и модель, и софт.
          Но если заглянуть на лицензирование Disney, то получается что даже для "for non-commercial uses such as hand-made artwork, clothing, themed private parties, student projects, stage shows, etc." — надо просить разрешение.
          На Etsy много продаётся товаров диснеевской тематики. Видимо никого не трогают, пока не появляются большие суммы, или кто-то не пожалуется.
          Но я для себя считаю, что правильно было бы платить роялти создателям Футурамы. Благодаря им этот проект в принципе появился, и если зарабатывать на этом, надо однозначно отдавать долю авторам.

          • abondarev
            /#22588374

            Ну, так если в результате будет ощутимая доля, тогда с ними можно и поговорить. А пока что работа юриста будет стоить куда больше чем они смогут получить. В лицензию они это внесли исключительно из тех соображений, чтобы когда раскрутился некоммерческий проект, можно было предъявить претензии.

            • Zen_Kong
              /#22588646 / +1

              Вот если представить, что я пойду на какую-нибудь краудфаундинговую платформу с проектом, затрагивающим копирайт Диснея(да не важно чей, любой копирайт, на который у меня нет прав), как думаете они примут такой проект?
              Мне почему-то кажется нафиг пошлют.

      • veneressa
        /#22587884

        будет куда обиднее, если вдруг в диснее прочухают про эту колонку и наклепают таких же, потому что им можно

        • Zen_Kong
          /#22587886

          Да пусть делают)
          А я буду брюзжать, что первым сделал))
          Но вообще такое ощущение пока, что Футурама для Диснея, не пришей кобыле хвост.
          Они не транслируют её у себя на Disney+. Неформат для основной аудитории Диснея.

  7. Norton-nsk
    /#22586718

    Очень круто. Хочу сделать также

  8. S404Do
    /#22586732

    Может сделаете производство?

  9. Zen_Kong
    /#22586748

    Ответил выше.
    Промазал с комментарием. Если можно прошу модераторов удалить лишний.

  10. Make_Pic
    /#22587176

    Классно молодец! По поводу распознавания команд — не хватает избирательной направленности микрофона, массива микрофонов с дальнейшей DSP обработкой. Да и акустическая конструкция (расположение микрофонов, динамика, демпфирование, экранировка) играет не последнюю роль.

    • hogstaberg
      /#22587772

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


      • Zen_Kong
        /#22587926

        Это да. У нас отечественная пиратская подделка, поэтому Pinder:)

    • Zen_Kong
      /#22587940

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

      • trapwalker
        /#22588472

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


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


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

        • Zen_Kong
          /#22588526

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

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

          Здесь смотря для чего, делать что-то глобальное, соглашусь — неподъёмно(хотя может для какого-нибудь очень продуктивного гения и реально, не буду категоричен).
          А вот сделать что-то по фану вполне достаточно, даже вот оффлайн.

  11. astromill
    /#22588058

    коутейшая штука. хотя я и не любитель всех этих колонок) но сделал бы. 3д принтер есть

    • Zen_Kong
      /#22588120

      Можете просто напечатать корпус)
      Или например можно его использовать как ночник:
      image

  12. unit4
    /#22588122

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

  13. gigimon
    /#22591046

    Модель выглядит очень хорошо обработанной и не скажешь сразу, что это на 3д принтере (очень гладко). Было б хорошо про «механическую» часть узнать, как делалась

    • Zen_Kong
      /#22591184

      К сожалению брат вряд ли будет писать статью по своей части.
      У вас есть какие-то конкретные вопросы?
      На странице 3D-модели есть небольшое описание: https://www.thingiverse.com/thing:4384974
      И сзади, вблизи хорошо видно, что 3D-печать:
      image

  14. AndyKorg
    /#22591394

    • Zen_Kong
      /#22591516

      Для меня Linux — плюс. Я использую его в том числе просто как сервачок для тестов иногда.
      И если бы сейчас делал продвинутою версию, взял бы или полноразмерную Малину, или что-то подобное с графикой помощнее, чтобы ещё и как консоль к телевизору использовать.

  15. KMU
    /#22593860

    Спасибо за статью! Я давно планирую своего "робота", говорящая злая голова + роботизированная рука )) Планирую на платформе Nvidia jetson nano 2GB (около 50$). Плюсы, что много всего для нейросети от Nvidia уже идёт. Кстати, я в 15 минутах от Диснея живу (в Орландо), могу к знакомым коллегам обратиться по вашему вопросу ))

    • Zen_Kong
      /#22593900

      Да, на Джетсоне можно конечно гораздо больше всего накрутить, хотя бы даже распознавание на Mozilla DeepSpeech должно нормально работать(правда когда я пробовал летом была беда с сэмплами плохого качества, в то время как Microsoft STT отлично справлялся, но всё равно было бы очень интересно попробовать на Джетсоне).
      Если «за спрос денег не берут», тогда поинтересуйтесь)) Спасибо!