— Ирина, таймер...
— Ставлю таймер на пять минут.

Вполне себе обыденная история из моего быта. Я таки сделал собственного автономного голосового помощника.

TL;DR> Ирина вполне неплохо работает дома 24x7.

Потребуется установить Python 3.5+ и зависимости через pip (немного знаний Python).

Скиллы "из коробки": таймер, погода, контроль медиа (громче/тише/дальше), контроль плеера MPC-HC, запуск медиа из папки, расписание ближайших электричек, "подбрось кубик/монетку".

Плагинами добавляются: другие скиллы, Text-to-Speech и Speech-to-Text движки.

Мотивация

За каждым проектом стоят причины, побудившие автора им заняться. Давайте сначала немного о них.

Во-первых, я не в восторге, что общедоступные голосовые помощники контролируются корпорациями. Я не могу точно сказать, что X порекомендует моему ребенку на запрос "мультики" и что покажет ему на Ютубе. Я бы предпочел контролировать это самостоятельно, пусть на это уйдёт и несколько больше времени.

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

В-третьих, четкая работа помощника по командам. Мне хотелось бы точно знать, что происходит, когда я произношу то или иное слово. Идея "поболтать с Алисой" мне несколько чужда - в частности, потому, что я не могу до конца доверять мотивациям людей, её создающим. Если брать ребенка, то мне бы хотелось, чтобы он учился командовать компьютером, а не болтать с ним; в конце концов, именно однозначно понимаемый набор команд можно назвать алгоритмом.

В-четвертых, короткие команды. Наверное, их можно настроить и в других помощниках, но тут это сделать гораздо проще - можно их просто запрограммировать.

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

Если вы в первом приближении разделяете часть моих мотиваций - возможно, Ирина вам подойдет.

Архитектурные компромиссы

Нельзя объять необъятное

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

  1. Основная цель проекта - дать программисту возможность быстро дополнять навыки голосового помощника и настраивать их под себя.

  2. Установка помощника сделана больше для программиста на Python, нежели для конечного пользователя. Потребуется скачать проект с Github, установить зависимости через pip, и запустить Python-файл. Зато дописывать проще. (Я не против, если кто-то упакует это в EXE, но я сам не чувствую в этом необходимости)

  3. Установка плагинов. Плагины надо кинуть в папку plugins, а после их запуска можно настроить их JSON-конфиг в папке config. Возможно, имело смысл сделать какой-нибудь онлайн-репозиторий, и механизм установки, но я делал быстро и максимально просто.

  4. Мультиязычность. Мультиязычность бы потребовала умение обрабатывать разные языки (определенная сложность парсинга команд), а также каждый раз работать с локализованными строками. Я посчитал, что её поддержание обойдется слишком дорого программисту, пишущему "для себя". Поэтому многоязычность плагинов не поддерживается - всё только на русском, но просто. (Ядро поддерживает многоязычность, т.к. там не так много языкозависимых строк. При желании вы можете просто переписать нужные вам плагины на нужный вам язык. Также можно подключить другие Text-to-Speech и Speech-to-Text движки, и работать на другом языке)

  5. Не Python-style кода (личное). С Python я начал работать не так давно, и до сих пор много работаю на других языках. Поэтому при написании кода я часто использую типовое ООП, хотя возможно, что-то можно было сделать компактнее.

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

Быстрый старт

  1. Скачайте проект с Github

  2. Для быстрой установки всех требуемых зависимостей можно воспользоваться командой: pip install -r requirements.txt

  3. Для запуска запустите файл runva_vosk.py из корневой папки. По умолчанию он запустит оффлайн-распознаватель vosk для распознавания речи с микрофона, и pyttsx движок для озвучивания ассистента (стандартный движок Windows для синтеза речи).

  4. После запуска проверить можно простой командой - скажите "Ирина, привет!" в микрофон

Общая логика

Запуск всех команд начинается с имени ассистента (настраивается в options/core.json, по умолчанию - Ирина). Так сделано, чтобы исключить неверные срабатывания при постоянном прослушивании микрофона. Далее будут описываться команды без префикса "Ирина".

Плагины

Поддержка плагинов сделана на собственном движке Jaa.py - минималистичный однофайловый движок поддержки плагинов и их настроек.

Плагины располагаются в папке plugins и должны начинаться с префикса "plugins_". Плагины задают навыки/скиллы голосового помощника.

Настройки плагинов, если таковые есть, располагаются в папке "options" (создается после первого запуска).

Готовые плагины

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

plugin_greetings.py - приветствие (оффлайн). Пример команды: "ирина, привет"

plugin_timer.py - таймер (оффлайн). Примеры: "таймер, таймер шесть минут, таймер десять секунд, таймер десять" (без указания единиц ставит на минуты - "таймер десять" - на десять минут. Просто "таймер" ставит на пять минут)

plugin_mediacmds.py - команды управления медиа (оффлайн). Пример: "дальше, громче, тише, сильно громче, сильно тише, пауза". (Если установлено mpcIsUseHttpRemote, то сначала делается попытка вызвать команду плеера MPC-HC, если не удается - используется эмуляция мультимедийных клавиш)

plugin_mpchcmult.py - проигрывание мультиков через MPC-HC из определенной папки (оффлайн). Пример "мультик <название_мультика>". Папка задается в конфиге. При вызове команды в папке ищется файл с соответствующим названием <название_мультика> и любым расширением. Если найден - запускается на проигрывание. (Как можно догадаться, этот плагин предназначен для показа отобранных медиа без обращения к ютубу.)

plugin_random.py - рандом (оффлайн). Примеры: "подбрось|брось кубик|монетку". Содержит примеры парсинга дерева команд (команды можно задавать деревом). Больше демонстрационный плагин.

plugin_weatherowm.py - погода (онлайн). Примеры: "погода, погода завтра, погода послезавтра, прогноз погоды". Требует установки в конфиге бесплатного API-ключа отсюда, а также местоположения пользователя.

plugin_yandex_rasp.py - расписание ближайших электричек через Яндекс.Расписания. Пример: "электричка, электрички". Требует установки в конфиге бесплатного API-ключа для личных нужд (до 500 запросов в сутки) отсюда, а также станций отправления и назначения. (Если вы ездите на электричке - фраза "ирина, электричка" очень удобна для проверки расписания)

plugin_tts_pyttsx.py - (оффлайн) позволяет делать TTS (Text-To-Speech, озвучку текста) через pyttsx движок. Используется по умолчанию.

plugin_tts_console.py - (оффлайн) заглушка для отладки. Вместо работы TTS просто выводит текст в консоль.

Свои Text-to-Speech и Speech-to-Text движки

По умолчанию для распознания речи используется движок VOSK, для синтеза - Windows (голос Irene).

Дописать свои варианты вполне можно, это стандартная операция. Детали - в Github.

Уже доступен STT через модуль SpeechReсognition (онлайн-распознавание от Гугла и пр.), а также TTS через Silero (нейросетевая генерация оффлайн). Мне не очень понравился результат Silero (хотя сам проект прекрасен) - генерируется дольше, задержка в несколько секунд, а также есть "металлические" шумы, но, возможно, он подойдет вам. (Кстати, в одном из комментариев @putnik поделился собственным анализом доступных движков TTS и STT.)

Кстати, имя помощника тоже настраивается в файле конфигурации - так что если нужно, можете сделать, чтобы он откликался на имя "Джарвис". И можно поставить мужской голос, конечно.

Аналоги

Честно говоря, я начал писать свой проект без анализа аналогов. Ну, точнее, беглый гуглеж позволил мне найти прекрасную хабрастатью @EnjiRouz Пишем голосового ассистента на Python, а также соответствующий репозиторий, который и послужил основой для проекта.

Правда, например, код для получения погоды c OpenWeatherMap пришлось полностью переписать, потому что они перестали поддерживать старое API.

Лишь позднее, в декабре на хабре появилась статья Программируем умный дом, а к ней довольно интересный коммент putnik, который попробовал самые разные системы. Процитирую:

Ну и более конкретно прокомментирую часть про голосовых ассистентов, так как я этим сейчас активно занимаюсь:

Один из самых больших проектов на github с открытым кодом голосового помощника называется Leon. Система сделана французом…

…и поэтому поддерживает только два языка: английский и французский. К тому же проект имеет довольно небольшое сообщество и в основном разрабатывается автором. Как следствие, набор модулей, которые обеспечивают интеграцию, довольно скуден.

После, у нас есть JARVIS из Железного Человека. <…> Это позволит вам создавать вашу собственную Сири в пределах отдельно взятой сети.

Интересно, получилось ли у автора создать собственную Сири, или всё же самостоятельная настройка споттера, распознавания голоса и озвучки текста на отдельно взятой малинке всё же сильно выходят за рамки «небольшой конфигурации». Ну, и если ничего не поменялось, то у него была проблема с поддержкой даже не русского, а вообще какой-либо локализации. Так что, вероятно, вам придётся делать форк и переводить все сообщения.

Чуть более популярная чем Jarvis, но уступающая Леону — система Mycroft.

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

Ядро небольшое, почти всё вынесено в плагины и навыки. Есть какое-никакое сообщество, которое эти навыки пишет и поддерживает. Хотя встречается довольно много говна и палок не самых лучших архитектурных решений. Ядро в интернет ломится за настройками навыков, которые хранятся на сервере, сами навыки за данными. По умному дому более-менее нормальная интеграция есть только с Home Assistant, остальное вам придётся писать с нуля. По музыке есть интеграция со Spotify (если вас не смущает необходимость хранить пароль в открытом виде на чужих серверах).

Лично я немного потыкал Jarvis, который мне показался похожим по архитектуре на мою собственную. Сделан достаточно удобно; но это, вообще говоря, проект, рассчитанный под консольные команды(!) на английском(!). Т.е. адекватная локализация на русский - дело крайне большое; не говоря уже о том, что ряд кейсов плохо укладывается в голосовое, а не консольное управление (например, игра "Быки и коровы").

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

Заключение

Честно говоря, я сам не ожидал, но Ирина вполне себе прижилась у нас в семье.

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

Крутится это все на ноутбуке, который в настоящее время является сервером. Встроенного микрофона хватает на эффективное распознавание с 2-3 метров; хотя, конечно, иногда не срабатывает и приходится либо повторять, либо подходить вплотную.

Загрузка процессора минимальна; думаю, пойдет и на Малинке, но, конечно, не пробовал.

Свои плагины

Честно говоря, у меня уже есть несколько собственных плагинов чисто "под себя".

Например, по "ирина, запусти музыку" открывается Яндекс.Музыка.

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

  1. Открыть страницу доставки

  2. Подождать чуть-чуть

  3. Найти на экране картинку (форму ввода телефона) (да, в pyautogui такое есть из коробки)

  4. Перевести туда мышь и кликнуть

  5. Сэмулировать ввод телефона

  6. Вуаля! Страница со статусом доставки доступна

В общем, вроде писать плагины оказалось несложно. (Если вы вдруг что-то напишете и захотите поделиться, можете кидать ссылки сюда.

Благодарности

@EnjiRouz за проект голосового ассистента, который стал основой (правда, был очень сильно переработан), а также за отличную статью на Хабре: Пишем голосового ассистента на Python

AlphaCephei за прекрасную библиотеку распознавания Vosk.

@putnik за разбор других голосовых помощников и список TTS и STT решений


Github проекта

UPD: Некоторые добавления с момента публикации статьи

  • Добавлен TTS плагин для RHVoice

  • Вышла версия 3.x - с возможностью многомашинных инсталляций. На центральном сервере запускается REST/JSON сервер с Ириной (FastAPI). Сервер делает всю работу плюс даже TTS. От клиентов требуется отправлять только распознавать данные с микрофона и отсылать команды серверу. Так что Ирину можно запускать на нескольких машинах в разных комнатах.

    • Для клиента в базовом варианте (vosk) сделал готовый EXE-файл (auto-py-to-exe), который не привязан к установке Питона. Его вроде можно запускать вообще где угодно.

    • Учитывая, что у Ирины теперь есть REST API, при желании можно запилить какие-нибудь интеграции (например, написать клиент для Телеграм и удаленно вызывать команды)

  • В комментах к статье есть обсуждение с проблемами установки под Linux; возможно, кому-то пригодится

Комментарии (86)


  1. wtigga
    07.02.2022 15:18
    +4

    Завернул бы кто-нибудь это чудо в аддон для HomeAssistant


    1. Supervadim
      07.02.2022 18:17

      Доделывать придется немало.

      Как я понял, в текущей реализации помощник заточен под ноутбук: например, по команде "запусти радио" открывается веб-страница Яндекс Музыки.

      Под HA надо всё в headless переделывать


      1. janvarev Автор
        07.02.2022 18:22

        > по команде «запусти радио» открывается веб-страница Яндекс Музыки.
        Не, это вообще в допплагинах.

        В базовых плагинах весь вывод через TTS, который (сделав нужный TTS-плагин) можно во что угодно завернуть. Правда, в базовом нет никакой музыки.


    1. munghauzen
      10.02.2022 11:20

      Есть такой с RHVoice: https://github.com/definitio/ha-rhvoice


      1. janvarev Автор
        10.02.2022 11:30

        Посмотрел, интересно.
        Можно таким же способом обернуть TTS через webapi Ирины. У Ирины есть вызов ttsWav, рендерящий через WAV через настроенный TTS и возвращающий его.


  1. Jury_78
    07.02.2022 15:24

    для синтеза - Windows (голос Irene).

    Почему не RHVoice, мне понравился - неприхотлив...


    1. janvarev Автор
      07.02.2022 15:28
      +1

      Мне не очень звук понравился + по-моему, он у меня быстро не заработал почему-то.
      Вообще можно дописать свой TTS-плагин, если охота прикрутить. Я буду только рад :)


      1. Jury_78
        07.02.2022 15:34
        +1

        Звук, это конечно вкусовщина. Вполне четкий, я запись(на 5 слов) с RHVoice скармливал Vosk с минимальной моделью и получалось 1 к 1.


        1. janvarev Автор
          07.02.2022 20:11

          UPD: Только что залил свежий апдейт на Github — TTS плагин для RHVoice, если нужно :)


          1. Jury_78
            08.02.2022 13:39
            +1

            Спасибо, но делаю своё... хоть и проще. Проблемы есть, не смог запустить vosk на 32 битнойт системе (у меня тонкий клиент для этого).


            1. janvarev Автор
              08.02.2022 13:42

              Если нужно, я сейчас сделал опцию с тонкими клиентами. Правда, в основном варианте там тоже vosk… но есть и Recognition, может, заработает.

              Ну, или своё. REST сервис у Ирины появился, может, будет полезен.


              1. Jury_78
                08.02.2022 15:05

                vosk не расчитан на 32бита, я пытался компилировать самостоятельно, но ума не хватило...

                есть и Recognition

                это что?


                1. janvarev Автор
                  08.02.2022 15:13

                  pip install SpeechRecognition
                  pip install PyAudio

                  и можно попробовать запустить другой распознаватель

                  runva_speechrecognition.py

                  вместо VOSK. Детали на Github есть.


                  1. Jury_78
                    08.02.2022 18:27

                    Этот, да знаю, но выбор из offline то же vosk. Возможно обойдусь без Speech Recognition буду использовать ИК пульт.


            1. DollaR84
              08.02.2022 19:56

              Можете попробовать pocketsphinx. Он конечно похуже воска с распознаванием, но если ориентироваться не на свободное распознавание произвольной речи, а на конкретные команды со своим словарем, то вполне неплохо справляется.
              Я когда-то давно тоже делал ассистента, основанного на нем, делал свой словарь, а самое главное: распознавание основывалось на правилах JSGF. В таком варианте довольно неплохо справляется. Пример можно посмотреть на моем варианте: SARA. Реагирует на фразу: Ок Сара =)
              реализовал различные расширения, о всех реализованных функциях можно прочитать тут: SARA Home page
              там есть и ссылка на справку по доступным командам. Правда токен на API погоды протух, но в настройках его можно заменить на свой.


              1. Jury_78
                08.02.2022 20:06
                +1

                Спасибо, pocketsphinx - установился. Буду пробовать...


                1. Jury_78
                  08.02.2022 22:39

                  Попробовал, качество распознования вполне... НО время обработки записи на 5-6 слов - 180 сек. Да процессор ATOM 1 ядро, но все же...


  1. Pangr
    07.02.2022 15:26
    +3

    Тоже страдал таким года 4-5 назад но на шарпе, а тогда голосовые помощники были ну вообще так себе(И мысль была больше не о безопасности, а о в принципе чтоб оно нормально понимало что я хочу). Но понял что мне вообще не нужен голосовой помошник в итоге XD Потом попробовал голосовой ввод текста, тоже не зашло) Настолько привык к горячим клавишам и клавиатуре, и просить, ждать обработки и т.п. невыносимо (А вдруг я буду уставшим, а оно ещё и не поймет меня, этож как нажимать на букву "е" а оно будет писать "а")


    1. janvarev Автор
      07.02.2022 15:30
      +1

      По ощущениям — один из основных кейсов — это таймер на кухне, когда заняты руки и неохота прикасаться к клавиатуре/мыши. Ну, и смежные — смена музыки, громкость.

      Ну и для детей — голосовое управление на первых порах, а не клава/мышь.

      По личным ощущениям — распознает хорошо, постоянно пользуемся.


      1. vkni
        07.02.2022 20:57
        +2

        когда заняты руки и неохота прикасаться к клавиатуре/мыши

        Спасибо! Наверное, от "когда заняты руки" и надо плясать с этими помошниками. Без этоо было совершенно непонятно, зачем они нужны.


        1. janvarev Автор
          07.02.2022 21:12

          Вообще-то, мне тоже было непонятно :)
          Потом я пришел к знакомой и увидел, как она командует Алисой на кухне. И почувствовал, что это прикольный кейс. Да, имеет смысл обычно тогда, когда заняты руки.


    1. IvaYan
      07.02.2022 15:40

      Но понял что мне вообще не нужен голосовой помошник в итоге

      На самом деле интересно, а если ли какая-то статистика по реальному использование голосовых помощников? Я вот тоже не могу себе представить, что буду разговаривать, скажем, с Siri, чтобы попросить ее что-то сделать, если я могу сам натыкать нужные кнопки, и возможно это окажется быстрее, чем словами описывать, что я хочу.


      1. positron48
        07.02.2022 16:04
        +3

        Из бегло нагугленного и без проверки источников на данных америки за 2021 год (из числа владельцев, включая помощники в телефоне):

        85% музыка
        74% проверяют погоду
        65% ставят будильник
        62% проверяют текущее время
        42% ставят напоминания
        32% телефонный звонок


      1. cepera_ang
        07.02.2022 16:15
        +1

        У меня прижилось ставить таймер, узнавать погоду (в местах отличных от текущего) и просто гуглить случайные вещи.


      1. putnik
        07.02.2022 16:32
        +2

        Про статистику не знаю, но мы вот умеренно активно используем Алису (и я всё надеюсь перейти на что-нибудь открытое и оффлайновое). Основные кейсы на текущий момент:

        • включение/выключение света и изменение яркости (в квартире заменены все выключатели, а в лампах, которые включаются в розетки, стоят умные лампочки) — удобно давать команды, например, когда лежишь ещё не проснувшись в кровати и даже глаза открыть не можешь, или выключать всё перед выходом из дома; но при этом управление голосом не должно заменять ручное

        • информация о погоде — неожиданное очень частый юзкейс

        • прослушивание музыки — тут всё понятно, модный мультирум у нас не зашёл совсем

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

        Из того, что уже назрело и хочется сделать:

        • управление роботом-пылесосом (наш уже старый и не умеет в удалённое управление), хотя тут в более далёкой перспективе лучше привязывать к отслеживанию наличия людей дома

        • открытие/закрытие штор (управление голосом тут скорее бонус)

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


      1. Alex_ME
        07.02.2022 20:46

        Использую "Google Ассистент" ровно в двух случаях:

        • Поставить таймер

        • Узнать номер квартиры знакомого, к кому иду в гости (команда "<имя в телефонной книге> адрес", при условии, что поле адреса заполнено, естесственно)

        Эти сценарии оказываются более быстрыси/удобными с использованием голоса, остальные - нет.


      1. FrolVII
        08.02.2022 03:03
        +1

        В основном в авто пользуюсь через CarPlay. Звоню с помощью голосового помощника (отвечать на текстовые сообщения получается криво - все время что-то идет не так). Прошу строить маршруты (в основном из записанных). Еще очень удобно в поездках между городами получать инфу о погоде на маршруте не отвлекаясь от вождения, два раза это оказалось особенно полезно:

        1. Как-то попал в сильный снегопад (ночью) и регулярный мониторинг погоды на маршруте помог принять решение о своевременной остановке в гостинице (М4 в тот раз знатно завалило, мне повезло, что не поехал дальше).

        2. Ехал еще на летней резине в межсезонье, дорога была мокрая (после дождя) а температура вертелась в районе +2 градусов (тоже ночь была). Постоянно интересовался а что там дальше в городах, через которые проходил маршрут. В случае дальнейшего понижения температуры тоже остановился бы до улучшения погодных условий.

        Еще вспомнилось. Один раз (так же в авто) тщетно пытался воспользоваться поиском, дабы определить что за тварь (большой паук) вылезла на переднюю панель моего авто, а потом не дав себя убить резво умчалась куда-то в ее недра. Ехал с юга, были некоторые подозрения, что это не совсем безобидное насекомое. Но поиск с помощью Siri из CarPlay, как оказалось, практически не работает - и остаток пути я провел в абсолютном неведении относительно того, может ли меня "сожрать" мой попутчик, или он не из таких. Морально помогали периодические обстукивания панели в непосредственной близости от себя, в надежде что тварь спрячется куда подальше. Не знаю, кто придумал ограничить поиск в CarPlay и Android Auto - иногда он мог бы спасти клиентам жизнь, мне кажется.


        1. Earthsea
          08.02.2022 10:03
          +1

          может ли меня "сожрать" мой попутчик, или он не из таких

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

          Пытаться давить их (и ос тоже) не стоит, они довольно крепкие. Запросто могут выжить и в ответ напасть.

          В России смертельно опасный (причем далеко не на 100%) только один, каракурт, не узнать его сложно - черный с красными пятнами.

          Есть еще несколько ядовитых видов, которые могут вызывать отеки, нарывы, недомогание, некроз тканей. Одного такого видел и близко рассматривал, это был сумочный паук (мешочник). В гостинице поздно вечером прямо на двери номера сидел со стороны улицы (у каждого номера свой вход). Прогонять или что-то с ним делать не было смысла, наверняка где-то рядом еще десяток таких же. Вообще не парился. Правда, я тогда не знал что они могут быстро бегать и резко прыгать. Если бы знал, то может быть не стал бы фотографировать бы его с расстояния 5-10 см. Он вообще не шевелился, со вспышкой хорошо получился.


  1. dmitryredkin
    07.02.2022 17:04

    MQTT есть из коробки, или надо свой плагин шаманить?


    1. janvarev Автор
      07.02.2022 17:15
      +1

      Нету (я вообще с умным домом особо не работал). Но плагин написать по идее можно + под Питон должны быть библиотеки для работы с MQTT.


  1. alexzeed
    07.02.2022 19:22

    Попробовал поставить по инструкции, система — Ubuntu 20.04 LTS.
    1. Кроме зависимостей из requirements.txt потребовалось еще 2 библиотеки в саму систему:
    apt install portaudio19-dev espeak
    2. Не взлетел русский язык в TTS, Ирина отвечает на клингонском :) Ну т.е. вообще какие-то странные звуки издает. Видимо надо копать в русификацию espeak.
    Но сам факт, что оно вообще завелось и меня понимает — несказанно радует.


    1. janvarev Автор
      07.02.2022 19:26
      +1

      О, прикольно, спасибо!

      По-видимому, не заработал TTS. Дефолтный TTS использует pyttsx, должен завестись под Убунту. Очень вероятно, что надо поставить корректный sysId в options/plugin_tts_pyttsx.json — под Виндой он 0, у вас не знаю какой. Надо глянуть pyttsx док, наверное.

      Еще, как вариант, переставить TTS на Silero — но тогда туда тоже надо копать.

      UPD: Глянул, pyttsx опирается на espeak вроде, да.


      1. alexzeed
        07.02.2022 20:02
        +1

        Поковырял чуть подробнее, заменил espeak на espeak-ng, вытащил из pyttsx список голосов. Выяснил что espeak использует не числовые id, а строковые. Пока заменил строку в плагине на хардкод core.ttsEngine.setProperty(«voice», 'russian').
        Услышал «И тьебье прьивьет» :)
        Но на espeak хороший русский и не обещают, он там в зачаточном состоянии.
        Думаю, будет чуть времени — на апельсинке попробую. Или на роутере. Или попробую прикрутить другой синтезатор, говорят что rhvoice лучше говорит.
        В общем, да, спасибо за проект! Давно хотелось чего-то такого детерминированного, чтобы могло выполнять ограниченный набор команд.


        1. janvarev Автор
          07.02.2022 20:09

          Спасибо!
          Только что залил свежий апдейт — TTS плагин для RHVoice, можно попробовать, может, будет лучше.


          1. alexzeed
            07.02.2022 20:49
            +1

            Сходу не взлетело — установленный из вот этого ппа launchpad.net/~linvinus/+archive/ubuntu/rhvoice не дружит с rhvoice-wrapper, RuntimeError: RHVoice: engine initialization error. При этом сам RHvoice заработал, и произношение конечно же не сравнимо с espeak, намного лучше.
            А вот rhvoice-wrapper-bin удалось побороть, хотя и не сразу, а после гугления выдаваемых ошибок. Нужны обязательно
            apt install libspeechd-dev
            pip3 install scons lxml
            В общем, заработало с RHvoice, еще раз спасибо!


    1. nebularia
      07.02.2022 19:41

      Espeak звучит очень плохо, вполне возможно, что он у вас всё-таки работает... Как может. Лучше правда RHVoice попробовать.


      1. janvarev Автор
        07.02.2022 20:11
        +1

        Только что залил свежий апдейт на Github — TTS плагин для RHVoice :)


  1. yAndre
    07.02.2022 19:33
    +3

    Установилось без проблем. ????

    Первое впечатление - с гарнитуры распознает хорошо.

    Мне более важно, чтобы в небольшой комнате со спикерфона работало. Завтра/послезавтра надеюсь прикрутить для управления переговоркой в офисе и погонять.

    MQTT сервер уже есть, может получится что интересное...

    ТС, спасибо! Будем пробовать ✌


    1. janvarev Автор
      07.02.2022 19:37
      +1

      Очень прикольно слышать, что всё работает. Спасибо! :)


  1. AigizK
    07.02.2022 21:39

    Эх, сделал бы кто саму колонку, чтоб туда установить свой помощник. А то с микрофоном, колонками беда


    1. alexzeed
      07.02.2022 22:00
      +1

      Нужен открытый проект колонки на raspberry pi zero.


  1. vitalvas
    08.02.2022 04:22
    +1

    Было бы интересно взглянуть на то что @bobuk сделал и сравнить....


  1. anzay911
    08.02.2022 07:18

    Где можно почитать про расстановку ударений в словах в TTS?


    1. nebularia
      08.02.2022 08:52

      Думаю, зависит от движка. У RHVoice есть словарь с довольно-таки удобным синтаксисом:

      https://github.com/RHVoice/RHVoice/blob/master/config/dicts/Russian/example.txt


  1. falke2
    08.02.2022 10:13
    +2

    Для Ubuntu 20.04 пришлось установить:

    sudo apt-get install libportaudio2 espeak

    Так же не обрабатывался requirements.txt и пришлось каждый пакет устанавливать отдельно.

    При выполнении команд мужской голос говорит какую-то абракадабру :) Я совсем не питонист, но очень интересно :) Так же заинтересовало и ввело в недоумение мою жену Ирину, поскольку я до этого никогда не просил ее включить таймер :)


    1. janvarev Автор
      08.02.2022 11:38
      +1

      :))))
      По поводу голоса — гляньте апдейт по Линукс установке: github.com/janvarev/Irene-Voice-Assistant/blob/master/LINUX_INSTALL.md

      Я порекомендую 2 вариант, установить RHVoice — там качество правда сильно лучше.


      1. falke2
        08.02.2022 11:45

        Да, спасибо. Возникла проблема с RHVoice (ошибка с libRHVoice_core.so.5), установил из внешнего репозитория: https://github.com/RHVoice/RHVoice/blob/master/doc/en/Packaging-status.md

        Теперь другая ошибка, с libRHVoice_core.so.6:

        OSError: libRHVoice_core.so.6: cannot open shared object file: No such file or directory


        1. alexzeed
          08.02.2022 13:43
          +2

          Я там отписывал выше — даже, если побороть cannot open shared object file симлинком libRHVoice_core.so -> libRHVoice_core.so.6 — то оно все равно падает. Нужно поставить rhvoice-wrapper-bin, он сам качает и собирает из исходников RHVoice и позволяет rhvoice-wrapper-у его использовать.
          Но я согласен с nebularia, нужно делать плагин для speech-dispatcher, через него любой движок в линуксе можно выбрать. Модуль в питоне есть, import speechd.


          1. falke2
            08.02.2022 14:01
            +1

            Спасибо, заработало!


      1. nebularia
        08.02.2022 12:32

        По-хорошему, работать именно с RHVoice это не очень хороший вариант. Как на Windows есть SAPI, так на Linux есть speech-dispatcher. Если работать именно с ним, то привязки к конкретному TTS не будет - будет использоваться системный. Кроме всяких Silero, которые законченным продуктом по сути не являются.


        1. janvarev Автор
          08.02.2022 12:52

          Если вдруг кто-нибудь может, пожалуйста, сделайте TTS плагин для speech-dispatcher с нужными настройками.
          У меня просто винда, проверять вообще неудобно.

          Тот же RHVoice интеграция у меня заняла 45 строчек — так что должно быть несложно, просто надо место для тестирования.


          1. alexzeed
            08.02.2022 14:01
            +1

            Я попробую в ближайшее время. Вроде и правда должно быть несложно. Пока у меня вчерашние эксперименты с русификацией сломали установленный в систему RHVoice.


            1. janvarev Автор
              08.02.2022 14:48

              Буду очень признателен :)
              Только сделайте, наверное, своим Github-проектом, не надо мне в реквесты. Я не планирую поддерживать, т.к. не могу тестировать. А ссылку я размещу (или можно самому запостить в github.com/janvarev/Irene-Voice-Assistant/issues/1 )


              1. Aldrog
                08.02.2022 16:03

                На гитхабе можно иметь публично редактируемую вики. Может, лучше там страничку с плагинами сделать?
                В Issues, если проект будет иметь активное коммьюнити, со временем будет всё сложнее ориентироваться.


                1. janvarev Автор
                  08.02.2022 16:24

                  Я вики вроде открыл, но там надо разбираться с правами на редактирование.
                  А так — issues/1 зарезервировано под постинг собственных проектов с плагинами.


  1. foxairman
    08.02.2022 11:16

    @janvarev Круто, спасибо! Я тоже после статьи EnjiRouz на хабре захотел себе такого ассистента сделать. А что делаете если команда распознается неправильно? Есть ли коррекция или попытка угадать что хотел сделать пользователь? Я пробовал vosk, он хорошо работает, но иногда проглатывает некоторые буквы. Для синтеза голоса брал silerio.


    1. janvarev Автор
      08.02.2022 11:42
      +1

      :)
      Не, угадать не пытаюсь. Там довольно простой командный алгоритм — если не нашли слово, то на выход.
      Правда, например, тех же имен Ирины по умолчанию несколько: «voiceAssNames»: «ирина|ирины|ирину» — потому что vosk может да, немного по-разному распознавать.

      Вариант с «угадыванием» не хочу брать, потому что сложно прогнозировать поведение плагинов в таких условиях — та команда, не та, порог уверенности… По моему видению всё должно строиться на добавлении новых плагинов.

      Кстати по синтезу — silero у меня подтормаживал как-то (несколько секунд на генерацию). Хотя TTS-плагин для него в Ирине есть, мне больше понравился pyttsx.


  1. Tontu
    08.02.2022 11:44
    +1

    Интересно, поковырял. Для себя доделал реакцию на одиночное произнесённое имя, чтобы ассистент сказал вообще что жив и работает, вместо "не поняла" на имя реагирует "да я слушаю". Мелочь, а приятнее стало. И заметил маленькую особенность - в plugin_mediacmds.py в команде пауза используется "space", что по-моему не очень верно. Там лучше "playpause". Так работает даже если свернуть проигрыватель.


    1. nebularia
      08.02.2022 12:37
      +1

      Думаю, автору был бы приятен такой pull request


      1. Tontu
        08.02.2022 13:36

        Не уверен что эта фича прям так нужна в основном проекте


        1. janvarev Автор
          08.02.2022 13:44

          plugin_mediacmds.py переделал, да. Добавил команду «пробел» — он у меня кое-где работает лучше (в браузере, да)
          На одиночное имя — да, не знаю, может и не особо нужно. Но если будет реквест + фраза в конфиге, могу слить, наверное.


  1. Un_ka
    08.02.2022 11:45
    +1

    Если брать ребенка, то мне бы хотелось, чтобы он учился командовать компьютером, а не болтать с ним;

    Золотые слова.

    Попробую запустить на Raspberry pi (4 или 0?).


    1. Un_ka
      08.02.2022 20:05
      +1

      Итак, не без танцев с бубнами, заключающимися в установке пакетов, запускаем на Raspberry pi zero w и обнаруживаем, что не хватило памяти (ОЗУ 512 МБ, но у меня есть только ~390МБ, т.к. 128МБ выделено на видеопамять).

      JAA PLUGIN ERROR: plugin_mediacmds error on load: [Errno 12] Cannot allocate memory

      Прейдётся попробовать на Raspberry pi 4.


      1. Jury_78
        08.02.2022 20:15
        +1

        А файл подкачки?


        1. Un_ka
          08.02.2022 21:17

          Попробую. Но разве частые перезаписи sd карты не приводят к выводу из строя карты?


          1. Jury_78
            08.02.2022 21:30

            Все тлен... :) Не такие они дорогие уже...


      1. alexzeed
        08.02.2022 20:44
        +2

        А нельзя у видеопамяти ОЗУ совсем отобрать, ну т.е. деактивировать полностью видеоадаптер, чтобы не мешался?


      1. janvarev Автор
        08.02.2022 21:02
        +1

        Может, попробовать выключить какие-то плагины?
        mediacmds тянет pyautogui, может, он тяжелый?


        1. Un_ka
          09.02.2022 10:28

          Выключил плагины: mediacmds, plugin_mpchcmult.py, plugin_yandex_rasp.py. Расширил swap до 300 МБ. Теперь памяти хватает. А путь к устройству микрофона надо ли куда-нибудь прописывать?


          1. janvarev Автор
            09.02.2022 10:34

            Да вроде нет, у меня vosk сам тянет. Но я тестировал только на винде.


            1. alexzeed
              09.02.2022 11:53

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


  1. AlexanderS
    08.02.2022 12:29

    Если вы в первом приближении разделяете часть моих мотиваций...

    Руками и ногами за! Хотел плюс в карму загнать, но оказалось что уже когда-то это делал) В данном случае у меня лапки, но хоть могу стать постоянным пользователем. Желаю проекту очень больших успехов и неспешного, но качественного развития.

    С одним помещением всё понятно. А если в каждой комнате разместить USB радиомикрофоны? Работать с «многомикрофонностью» как будет?


    1. janvarev Автор
      08.02.2022 12:57

      Спасибо! :)
      Насчет многомикрофонности — неожиданно прямо сегодня ночью (версия 3.x) сделал возможность мультимашинной инсталляции. Центральный сервер с Ириной (FastAPI — REST/JSON), и клиенты, на которых идет только распознавание звука.

      Не знаю, как это конкретно интегрировать с многомикрофонностью, но потенциально вполне возможно.


    1. janvarev Автор
      08.02.2022 14:45

      Доп инфа по многомикрофонности:
      — либо винда всё сведет в единый микрофон — тогда вообще никаких проблем не будет

      — если же нет — можно попробовать при запуске любого vosk-проекта указать параметр командной строки что-то типа --device=1 (номер девайса). Список девайсов выводится по -l (можно в коде посмотреть).
      Т.е. как вариант:
      — запускаем Ирину сервером
      — запускаем несколько vosk-клиентов, каждый из которых слушает свой микрофон
      Но это я не тестил, конечно.


      1. Aldrog
        08.02.2022 16:16

        Для многомикрофонности есть интересный юзкейс в виде учёта локации: чтобы, например, команда «включить свет» включала его в той комнате, где находится микрофон, уловивший команду.


        Сведение всего в один микрофон для этого очевидно не годится, а в клиент-серверной схеме необходимо, чтобы плагин на сервере мог знать, с какого клиента пришла команда.


        1. janvarev Автор
          08.02.2022 16:25

          Да, можно. Но есть более простой вариант — отредактировать клиент, чтобы он посылал дополнительный элемент команды, и обрабатывать его плагином. Т.е. можно сделать без залезания в код ядра.


  1. Kabron287
    08.02.2022 15:43

    Результат предсказуем:

    import sounddevice as sd
    ModuleNotFoundError: No module named 'sounddevice'


    1. janvarev Автор
      08.02.2022 16:26

      pip install -r requirements.txt
      нет? должен установить sounddevice


      1. Kabron287
        08.02.2022 17:04

        Значит не устанавливает.

        Только ручками


  1. Kabron287
    08.02.2022 15:50

    небо работают ирина привет параллельно сотни людей придумывают способы снижать прививки


  1. Kabron287
    08.02.2022 16:27

    Input (cmd): ирина прогноз погоды задержанного ранее седьмого гражданина сотрудники венера знаешь


  1. Kabron287
    08.02.2022 17:03

    Единственно, что работает - регулировка громкости в ТВ тюнере

    Погодный кей стоит - ноль эффекта


  1. SkyWheel
    09.02.2022 03:39

    Скажите, а вы видели проект Open Assistant? Просто очень похож на ваш проект.

    Также есть голосовой помощник для Андроида Dicio, также доступный через F-Droid


    1. janvarev Автор
      09.02.2022 10:07

      Нет, не видел, но проекты интересные.
      У OpenAssistant видео старое, а вот Гитхаб свежий почему-то. И по исходникам там совсем другая архитектура + кое-что уже не работает вроде (смотрел как погода сделана).

      Dicio интересен, но я не под Андроид. Но, кстати, используя его код, можно сделать клиента для Ирины под Андроид (в клиент-серверном варианте).


      1. SkyWheel
        09.02.2022 10:25
        +1

        Если честно, не пробовал Open Assistant, просто привёл для сравнения.

        А Dicio, да, пользуюсь. Очень многообещающий проект от автора NewPipe.

        Вообще было бы интересно пощупать клиент для Ирины под Андроид. Конечно если будет доступен пакет (жутко не люблю компиллировать, стараюсь этого избегать до последнего).


  1. DsideSPb
    09.02.2022 14:46
    +1

    Вам, возможно, приглянется проект Rhasspy, возникший из похожих мотиваций, но не поддерживающий Windows напрямую (только через WSL) и пока не имеющий распространяемых пакетов команд. Есть ещё более "костлявая" его версия — voice2json, которая скорее набор конструкторных деталей для работы с голосом.

    Проект ощутимо так разросся, хорошо распознаёт ограниченный корпус русского языка (формируется из описанной грамматики команд) и даже натренировал свою систему TTS Larynx. У которой с русским языком есть некоторые странности ("шесть" произносит как "шос"), но в остальном звучит неплохо.