Ирина, голосовой помощник — теперь и со вкусом GPT-3

«Лама... Альпака...Чатгпт...» — раздавалась в уютненьком чатике по Ирине.

Хабр был не лучше — статьи по работе с GPT множились как грибы, а в комментах раздавались возгласы в духе «Дайте мне голосового помощника, с которым можно болтать!»

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

Тем не менее, и меня заинтересовало, насколько весело будет именно болтать с GPT, но самому в коде и платном API‑доступе разбираться не хотелось. Но сегодня утром меня снабдили и примером, и ключиком...

---

Это продолжение моих статей о разработке голосового помощника Ирины, не зависящего от крупных корпораций. В нём есть:

Расскажу, что улучшилось за прошедший год с момента прошлой статьи.

TL;DR> Добавлен плагин для общения с GPT-3 нейросетью. Сделан пакет упрощенной установки под Windows — «скачай и запусти». Сделано два веб‑клиента — один распознает слова прям в браузере (тяжелый), другой отправляет весь звуковой поток на сервер (легкий) — так что можно запускать клиенты, например, на смартфоне. Добавлен TTS Silero v3 — имхо, лучшее озвучивание доступное в открытом доступе. Сделан докер‑образ для быстрого запуска Ирины без установки зависимостей. Добавлено нечеткое распознавание фраз. Обновлена VOSK‑модель распознавания голоса на специально натренированную для Ирины.

Общение с GPT-3

Благодаря коллеге, который поделился кодом и ключом доступа, я сделал небольшой плагин‑болталку. Запускается по ключевой фразе «поболтаем», и дальше сохраняет контекст разговора. Все, что идет в разговоре, отправляется в OpenAI сеть text‑davinci-003, результат озвучивается пользователю. (UPD: вот вариант болталки, которая работает с gpt3.5-turbo, т.е. с ChatGPT)

Честно, получилось как минимум забавно. Я спросил как дела. Спросил про новости; получил некий общий ответ про Россию, США и Китай. Попросил сочинить сказку — выдалась долгая история про дедка и бабку; смысла в ней было немного, но связность присутствовала.

(Естественно, интеграция сделана отдельным плагином, который можно включить или отключить.)

Упрощенная установка под Windows

Под давлением общественности, которая не хочет ставить Python, GIT, качать и ставить зависимости, я нашел, как сделать готовый переносной вариант Python и GIT и запускать все одним BAT-файлом.

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

Веб-клиенты

Ну, поскольку Ирина в режиме сервера и так начала предоставлять Webapi, возник вопрос — а чего бы не запилить не только Python‑клиент, но и веб‑интерфейс.

Собственно, сказано — сделано.

Получилось два варианта. Один — когда я нашел где‑то онлайн‑вариант VOSK, и прикрутил туда распознаватель. Такая конфигурация распознает звук прямо в браузере (тяжелая штука), но отсылает на сервер только распознанный текст.

Над вторым вариантом пришлось помучаться, но он легче для исполнения в браузере. Там браузер устанавливает сокет‑соединение с сервером, и гоняет ему весь WAV‑поток данных, а VOSK на сервере распознает. Самым сложным было около года назад найти простую библиотеку, которая бы позволила не просто записывать звук, а гнать его на сервер в потоковом режиме. Я использовал opus‑recorder, но пришлось вручную дописать фрагмент, чтобы WAV отправлялся кусками (ну не фронтендер, извините). Зато заработало.

Оба варианта сейчас доступны, один по адресу /webapi_client, другой по /mic_client

TTS Silero v3

На Хабре был анонс очень классного открытого синтезатора текста от Silero. Из хорошего — крайне быстро работает на CPU.

Собственно, сабж был прикручен к Ирине, и теперь при желании можно наслаждаться качественными голосами. (Только процессор, если это ставить, рекомендуется помощнее)

Докер образ

Честно говоря, я не очень большой фанат Докера, но люди просили, и я сделал. Ирину в виде webapi теперь можно запустить через Докер.

Так же я не до конца разобрался с arm‑вариантом докера (его нет), а он нужен для Raspberry. Так что если есть желающий поддерживать периодические релизы Ирины в формате Докера — буду очень рад.

Нечеткое распознавание команд

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

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

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

Сейчас доступны два варианта:

Я в основном пользуюсь своим же thefuzz — могу сказать, что распознает команды теперь лучше.

Специальная STT голосовая модель для Ирины

Вообще, распознаватель VOSK можно дотренировать на конкретных наборах фраз; но неспециалисту вроде меня это было сделать не так просто.

Но тут повезло — на нас вышел один из разработчиков VOSK, и предложил сформировать набор фраз, которые мы часто используем, чтобы дотренировать модель на более лучшее распознавание.

Собственно, в телеграм‑канале мы обсудили, что это за фразы должны быть (имена помощника, «таймер», «погода», числительные и пр.), а затем отправили готовый список. Коллега очень быстро закинул нам уже оптимизированную модель (спасибо!), которая сейчас уже залита на Гитхаб.

----

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

И это лично меня — радует.

Конечно, хотелось бы доработать документацию, чтобы она была попонятнее, но до всего, увы, руки не доходят:)

Github проекта

@janvarev
27.03.2023 18:44 UTC
Первоисточник

Комментарии

@PrinceKorwin
27.03.2023 15:22 UTC
+4

text‑davinci-003

Поменяйте, пожалуйста, по умолчанию на gpt 3.5 turbo. Эта модель именно та, что используется в public ChatGPT чате и стоит в 10 раз дешевле, чем выбранная вами.

@janvarev
27.03.2023 15:34 UTC
0

Попробовал - на текущем коде почему-то не работает, нужно менять на какой-то интерфейс Chat. Сейчас, сорри, разобраться не могу - если нужно, поменяйте код и пришлите апдейт.

Вообще текущий плагин делался на скорую руку, если кто-то захочет его адекватно допилить - я только за :)

27.03.2023 19:52 UTC
0

там апи чуть другой. вот тут посмотрите: https://platform.openai.com/docs/api-reference/making-requests

  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
     "model": "gpt-3.5-turbo",
     "messages": [{"role": "user", "content": "Say this is a test!"}],
     "temperature": 0.7
   }'```
@vagon333
27.03.2023 17:46 UTC
0

Тоже пробовал менять text‑davinci-003 на gpt 3.5 turbo.
ChatGPT API не распознает.


детали

Сначала пробовал (проходит):


  • self.model = "text-davinci-003"
    {
    "created": 1679938894,
    "id": "cmpl-6yl8YYE507g6U44tXQfAzMSY4dMxb",
    "model": "**text-davinci-003**",
    "object": "text_completion",
    "usage": {
    "completion_tokens": 3,
    "prompt_tokens": 38,
    "total_tokens": 41
    }
    }

    Затем (ошибка):


  • self.model = "gpt-3.5-turbo"

    InvalidRequestError Traceback (most recent call last)
    /usr/local/lib/python3.9/dist-packages/openai/api_requestor.py in _interpret_response_line(self, rbody, rcode, rheaders, stream)
    680 stream_error = stream and "error" in resp.data
    681 if stream_error or not 200 <= rcode < 300:
    --> 682 raise self.handle_error_response(
    683 rbody, rcode, resp.data, rheaders, stream_error=stream_error
    684 )



InvalidRequestError: This is a chat model and not supported in the v1/completions endpoint. Did you mean to use v1/chat/completions?
@janvarev
15.04.2023 16:17 UTC
+3
@bugman
27.03.2023 17:16 UTC
0

Крутяк! Молодцы. И большое спасибо за ссылку на Silero.

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

@Arahort
28.03.2023 06:55 UTC
+2

Самого главного в статье и нет - семплов)

@shadrap
28.03.2023 09:11 UTC
0

Расскажите про Vacore - почему он ?

@janvarev
28.03.2023 09:14 UTC
0

Что - Vacore?

@shadrap
28.03.2023 09:26 UTC
0

все , понял) это просто совпадение - название вашего класса и VACORE проект видео аналитики?

@janvarev
28.03.2023 09:48 UTC
0

А, ну да )

@popstas
08.04.2023 14:24 UTC
0

Не пробовали STT Whisper?

@janvarev
08.04.2023 14:55 UTC
0

Нет, но при желании вы можете написать коннектор )

@VokaMut
02.05.2024 12:04 UTC
0

Подскажите, а возможно как-то научить Ирину понимать, кто говорит? чтобы например некоторые команды только я и жена могли дать, но не ребенок.

@janvarev
02.05.2024 12:06 UTC
+1

Нет, это голосовая аутентификация, не предусмотрено. Разве что самому встроить в систему.

@Teemon
22.02.2025 08:39 UTC
0

Можно ли использовать блютуз колонки в качестве микрофона и озвучивателя?..

.Было бы неплохо поставить таких несколько штук и совсем уйти от яндекса...

Хочу управлять умным домом без слива в Интернет