«Лама... Альпака...Чатгпт...» — раздавалась в уютненьком чатике по Ирине.  Хабр был не лучше — статьи по работе с GPT множились как грибы, а в комментах раздавались возгласы в духе «Дайте мне голосового помощника, с которым можно болтать!» Если честно, еще в первой статье про Ирину я говорил, что небольшой фанат именно общения с виртуальным помощником. Помощник должен выполнять команды, казалось мне. Тем не менее, и меня заинтересовало, насколько весело будет именно болтать с GPT, но самому в коде и платном API‑доступе разбираться не хотелось. Но сегодня утром меня снабдили и примером, и ключиком...  --- Это продолжение моих статей о разработке голосового помощника Ирины, не зависящего от крупных корпораций. В нём есть: Полностью оффлайн SpeechToText и TextToSpeech. Поддержка плагинов. Готовые команды «таймер», «погода» и ряд прочих. Поддержка HomeAssistant. Поддержка работы в клиент‑серверном режиме — сервер + куча микрофонов + Телеграм‑клиент, например. Расскажу, что улучшилось за прошедший год с момента прошлой статьи.  TL;DR> Добавлен плагин для общения с GPT-3 нейросетью. Сделан пакет упрощенной установки под Windows — «скачай и запусти». Сделано два веб‑клиента — один распознает слова прям в браузере (тяжелый), другой отправляет весь звуковой поток на сервер (легкий) — так что можно запускать клиенты, например, на смартфоне. Добавлен TTS Silero v3 — имхо, лучшее озвучивание доступное в открытом доступе. Сделан докер‑образ для быстрого запуска Ирины без установки зависимостей. Добавлено нечеткое распознавание фраз. Обновлена VOSK‑модель распознавания голоса на специально натренированную для Ирины.  Благодаря коллеге, который поделился кодом и ключом доступа, я сделал небольшой плагин‑болталку. Запускается по ключевой фразе «поболтаем», и дальше сохраняет контекст разговора. Все, что идет в разговоре, отправляется в OpenAI сеть text‑davinci-003, результат озвучивается пользователю. (UPD: вот вариант болталки, которая работает с gpt3.5-turbo, т.е. с ChatGPT) Честно, получилось как минимум забавно. Я спросил как дела. Спросил про новости; получил некий общий ответ про Россию, США и Китай. Попросил сочинить сказку — выдалась долгая история про дедка и бабку; смысла в ней было немного, но связность присутствовала. (Естественно, интеграция сделана отдельным плагином, который можно включить или отключить.) Под давлением общественности, которая не хочет ставить Python, GIT, качать и ставить зависимости, я нашел, как сделать готовый переносной вариант Python и GIT и запускать все одним BAT-файлом. Собственно, теперь в релизах есть версия для Windows, которую можно просто скачать и запустить. Ну, поскольку Ирина в режиме сервера и так начала предоставлять Webapi, возник вопрос — а чего бы не запилить не только Python‑клиент, но и веб‑интерфейс. Собственно, сказано — сделано.  Получилось два варианта. Один — когда я нашел где‑то онлайн‑вариант VOSK, и прикрутил туда распознаватель. Такая конфигурация распознает звук прямо в браузере (тяжелая штука), но отсылает на сервер только распознанный текст. Над вторым вариантом пришлось помучаться, но он легче для исполнения в браузере. Там браузер устанавливает сокет‑соединение с сервером, и гоняет ему весь WAV‑поток данных, а VOSK на сервере распознает. Самым сложным было около года назад найти простую библиотеку, которая бы позволила не просто записывать звук, а гнать его на сервер в потоковом режиме. Я использовал opus‑recorder, но пришлось вручную дописать фрагмент, чтобы WAV отправлялся кусками (ну не фронтендер, извините). Зато заработало. Оба варианта сейчас доступны, один по адресу /webapi_client, другой по /mic_client На Хабре был анонс очень классного открытого синтезатора текста от Silero. Из хорошего — крайне быстро работает на CPU. Собственно, сабж был прикручен к Ирине, и теперь при желании можно наслаждаться качественными голосами. (Только процессор, если это ставить, рекомендуется помощнее) Честно говоря, я не очень большой фанат Докера, но люди просили, и я сделал. Ирину в виде webapi теперь можно запустить через Докер. Так же я не до конца разобрался с arm‑вариантом докера (его нет), а он нужен для Raspberry. Так что если есть желающий поддерживать периодические релизы Ирины в формате Докера — буду очень рад.  Понятно, что не всегда звук распознается точно, и можно улучшить выполнение команд, применяя нечеткое сравнение распознанного текста с имеющимися вариантами. Также очевидно, что вариантов нечеткого сравнения много, и желательно давать пользователю выбор, каким именно пользоваться Соответствующий API появился в Ирине с версии 7.5.1 — можно написать плагин, который будет осуществлять нечеткое сравнение в определенном контексте (поиск наиболее подходящего варианта команды). Сейчас доступны два варианта: Мой на базе пакета thefuzz — сравнения строк на основе дистанции Левенштейна. Плагин от modos189, который работает на сравнении через scikit‑learn. Я в основном пользуюсь своим же thefuzz — могу сказать, что распознает команды теперь лучше. Вообще, распознаватель VOSK можно дотренировать на конкретных наборах фраз; но неспециалисту вроде меня это было сделать не так просто. Но тут повезло — на нас вышел один из разработчиков VOSK, и предложил сформировать набор фраз, которые мы часто используем, чтобы дотренировать модель на более лучшее распознавание.  Собственно, в телеграм‑канале мы обсудили, что это за фразы должны быть (имена помощника, «таймер», «погода», числительные и пр.), а затем отправили готовый список. Коллега очень быстро закинул нам уже оптимизированную модель (спасибо!), которая сейчас уже залита на Гитхаб. ---- В общем, понемногу‑понемногу Ирина обрастает новыми функциями, и чем дальше, тем ей проще пользоваться. Также удалось сохранить основные идеи проекта  опенсорс реализация голосового помощника, где всё можно запустить оффлайн, без привязки к облакам простоту реализацию плагинов — желающие действительно дописывают свои плагины, и даже ими делятся; да и у меня на реализацию плагина‑болталки с GPT ушло что‑то около часа. И это лично меня — радует. Конечно, хотелось бы доработать документацию, чтобы она была попонятнее, но до всего, увы, руки не доходят:) Github проекта    Когнитивист, предприниматель, Senior Python dev