Вышла 12 версия русского опенсорс голосового помощника Ирина (900+ звезд Гитхаб)

Всем привет! Я уже писал про своего голосового помощника Ирину статьи на Хабре: раз, два и три; первый раз был аж 3.5 года назад.

Самое главное — опенсорспроект жив. А если опенсорс жив в течение 3.5 лет — значит, он дошел до какой‑то точки зрелости. А если у него 900 звезд на Гитхабе — значит, им кто‑то пользуется, и даже успешно :)

О функциональности:

Ключевые принципы

Напомню ряд принципов из первой статьи с Хабра, которыми я руководствовался при написании проекта, т. к. они мне близки:

Пример плагина (30 строк):

import random
from vacore import VACore

# функция на старте
def start(core:VACore):
    manifest = { # возвращаем настройки плагина - словарь
        "name": "Рандом", # имя
        "version": "1.0", # версия
        "require_online": False, # требует ли онлайн?

        "description": "Демонстрационный плагин\n"
                       "Голосовая команда: подбрось монетку",

        "commands": { # набор скиллов. Фразы скилла разделены | . Если найдены - вызывается функция
              "подбрось монетку|брось монетку": play_coin,
            }
        }
    }
    return manifest

def play_coin(core:VACore, phrase: str): # в phrase находится остаток фразы после названия скилла,
                                              # если юзер сказал больше
                                              # в этом плагине не используется
    arrR = [
        "Выпал орел",
        "Выпала решка",
    ]
    core.play_voice_assistant_speech(arrR[random.randint(0, len(arrR) - 1)])

Плагины по дефолту

Есть из наиболее интересного:

Оптимальные настройки STT (Speech-to-Text) и TTS (Text-to-Speech)

Работа голосового помощника очень сильно зависит от настройки STT и TTS — она может быть как наиболее точной и долгой, так и быстрой и менее точной (и с менее качественной озвучкой)

Мне важна максимальная отзывчивость, поэтому я использую связку «стриминговый STT от VOSK» с Windows TTS (pyttsx). Такая конфигурация начинает озвучивать ответ менее чем за 1 секунду после окончания произнесения команды (при возможности локальной обработки, например, если нужно что‑то загуглить, время будет больше).

Чуть менее оптимальной, но возможной на всех системах (не только Win), является рекомендуемая связка «стриминговый STT от VOSK» с Vosk TTS. Нейросетевой Vosk TTS очень на уровне, и при этом значительно быстрее, например, Silero, который тоже качественный. (Другой вариант для быстрого TTS — RHVoice, но его может быть немного проблемно ставить)

Для желающих максимального качества TTS — есть плагины для онлайн‑решений: Elevenlabs и OpenAI TTS (последний поддерживает настройку интонаций говорящего и доступен в России через VseGPT). Но онлайн всегда будет помедленнее.

Поддержка устройств

Лично я запускаю Ирину на старом домашнем ноутбуке, но знаю, что комьюнити допилило разные варианты для девайсов. Сам не ставил, но укажу:

Использование LLM

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

Сейчас существует плагин «болталка», который позволяет общаться или запрашивать справку у LLM по OpenAI‑совместимому API. По умолчанию он настроен на поддерживаемый мною же сервис VseGPT, который позволяет получать доступ к самым разным топовым нейросетям по OpenAI API; но при желании его легко, путем замены baseURL, можно перенаправить на нужный вам сервис, или на локальный инференс LLM типа LMStudio или Ollama.

В плагине поддерживается две команды:

..но «болталки» народу было мало, поэтому читаем далее — про версию 12.

Версия 12 Ирины — с поддержкой распознавания команд через LLM

Долгое время в Телеграм‑группе Ирины были пожелания «а можно сделать так, чтобы команды распознавались произвольно, а не по формату? Например „выключить свет во всем доме“.

Пожелания, конечно, полезные — но лично я использую Ирину у себя под пару простых кейсов, и реализовывать мне было особо недосуг. Я желал авторам посмотреть в сторону интеграции с ChatGPT, и при желании прислать результат мне, чтобы можно было встроить в ядро.

Но в конечном счете я занялся этим сам :) в частности, потому что понял, что из комьюнити, возможно, лучше многих понимаю в протоколах LLM.

Итак, в 12 версии сделана следующая функциональность: поддерживаются как классические плагины Ирины (команда + параметры), так и новые ИИ‑плагины (поддержка и тех и других — настройка уровня ядра)

ИИ‑плагины опираются на так называемую поддержку tools по OpenAI‑совестимому интерфейсу. Поддерживаются они не только OpenAI, сейчас это стандарт для всех, их поддерживают и Anthropic Claude, и Google Gemini, и опенсорс‑сети (DeepSeek, Qwen и пр.) — так что можно использовать почти любые сети. Работает это так:

Пример ИИ‑плагина:

Первое — определение tool в манифесте плагина (самое нудное, тут в промте надо описать все детали)

  "ai_tools": {
    "set_timer": {
        "v": "1", # версия описания AI Tool.
        # В зависимости от неё будет по-разному обрабатываться доп параметры
        "function": set_timer,
        "manifest": {
            "type": "function",
            "function": {
                # "name": "set_timer",
                # name будет автоматически присвоено на основании базового ключа словаря
                "description": "Set timer for specific time. "
                               "You must specify hours, minutes and seconds for it. All must be integers."
                               "If no specifications, set timer for 5 minutes, 0 hours, 0 seconds."
                               "Если указывается, например, на \"полминуты\", сконвертируй их в integer величины."
                               "Например, полминуты будет 30 секунд, полчаса - 30 минут.",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "hours": {
                            "type": "integer",
                            "description": "Количество часов, на которое ставится таймер",
                        },
                        "minutes": {
                            "type": "integer",
                            "description": "Количество минут, на которое ставится таймер",
                        },
                        "seconds": {
                            "type": "integer",
                            "description": "Количество секунд, на которое ставится таймер",
                        },

                    },
                    "required": ["hours", "minutes", "seconds"],
                },
            },
        }
    }
}

А теперь сама функция, самое простое :)

def set_timer(core:VACore, hours:int, minutes:int, seconds:int):
    txt = "" # вычисляем текст, который надо будет произнести при установке таймера
    if hours > 0:
        txt += num_to_text.num2text(hours, male_units_hour)+" "
    if minutes > 0:
        txt += num_to_text.num2text(minutes, female_units_min)+" "
    if seconds > 0:
        txt += num_to_text.num2text(seconds, female_units_sec)+" "

    set_timer_real(core, hours*3600+minutes*60+seconds, txt)

def set_timer_real(core:VACore, num:int, txt:str):
    core.set_timer(num,(after_timer, txt))
    core.play_voice_assistant_speech("Ставлю таймер на "+txt)

Вызов «Ирина, поставь таймер на полчаса» выливается в «Ставлю таймер на 30 минут».

В общем, получается очень удобно.

Из минусов — при каждом вызове ИИ‑плагина надо делать запрос к LLM, что увеличивает задержку ответа.

Плюс, данная функциональность появилась только весной 2025 года, и поэтому плагинов с её использованием не очень много.

Заключение

Проект «Ирина» даже продолжает жить и немного развиваться, подстраиваясь под современные реалии. Если захотите вдруг сделать себе голосового помощника — мне кажется, проще настроить Ирину и что‑то дописать, чем делать все самому.

Надеюсь, было полезно.

Гитхаб проекта

@janvarev
29.07.2025 17:40 UTC
Первоисточник

Комментарии

@
29.07.2025 12:56 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@janvarev
29.07.2025 12:57 UTC
+25

Простите но заголовок выглядит как "горячий одинокий голосовой помощник, жаждет общения, в 3 км от вас. Жми что бы познакомиться"

А вы другие заголовки на Хабре видели? ))))

29.07.2025 13:20 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
30.07.2025 11:25 UTC
+3

А вы другие заголовки на Хабре видели? ))))

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

А то и: "Объелся резиновых мишек, обделался не добежав до туалета, теперь зарабатываю миллиарды на ортопедических креслоунитазах".

P.S. Спасибо за публикацию.

@AlexZino
30.07.2025 11:02 UTC
0

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

30.07.2025 11:03 UTC
+1

Вроде да, но смотрите документацию по VOSK STT и TTS - я к Андроид реализации отношения не имею.

@JordanCpp
29.07.2025 15:01 UTC
+2

Когда запилят Галину?:)

@Stanislavvv
29.07.2025 17:46 UTC
+11

Когда потребуется что-нибудь отменять :-)
"Галя, у нас отмена!"

@Awesome_T
01.08.2025 19:06 UTC
+3

Ларису Ивановну хочу 😄😁

@avshkol
29.07.2025 19:55 UTC
+3

Не увидел требований к железу…

@janvarev
30.07.2025 05:23 UTC
+3

При запуске в автономном рекомендуемом варианте (VOSK STT + VOSK TTS) нужно чуть меньше 1 Гб оперативки (около 900 Мб). По процессору затрудняюсь сказать, что-то недостаточно медленное нужно. На ноуте 2013 года работает без особых проблем.

Если только STT + RHVoice, то нужно около 500-600 Мб наверное.

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

@otchgol
30.07.2025 04:16 UTC
+2

Голосовой помощник на винде, независимо от качества исполнения, видится менее полезным нуждающейся в постоянном интернете колонки. Даже home assistant предлагает разной степени кривости решения этой задачи на железе микрокомпьютеров. Было бы интересно на уровне микроконтроллеров, но доступные из них слишком слабы для такой задачи. Может потому частично оффлайновые колонки так дороги пока.

@GamePad64
31.07.2025 10:47 UTC
+1

Уже появляются мощные микроконтроллеры, типа esp32-p4. Там даже какие-то ai-инструкции есть

@TheMrWhite
30.07.2025 11:17 UTC
+1

Ирина, ну *б твою мать! наконец-то так можно разговаривать с компьютером))

@arozhankov
31.07.2025 03:30 UTC
0

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

@janvarev
31.07.2025 07:56 UTC
0

Не знаю, я не по железу.

@Bayram_dev
31.07.2025 09:42 UTC
-1
@crewsycrews
01.08.2025 05:33 UTC
0

tools это ведь про MCP речь, я правильно понимаю?

@janvarev
01.08.2025 08:51 UTC
0

Нет, неверно. tools - это механизм, позволяющий спрашивать ЛЛМ, какую функцию вызвать. MCP является известным механизмом, опирающимся на tools и позволяющим подключать конкретные разные инструменты для деклараций tools и их обработки.

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

@
01.08.2025 14:34 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@janvarev
01.08.2025 18:16 UTC
+1

Добрый день!
Я Докер уже не поддерживаю, устал (там очень старая), рекомендую брать версию от автора в комьюнити https://github.com/janvarev/Irene-Voice-Assistant/blob/master/docs/INSTALL_DOCKER.md (Ivan Firefly)

https требовалось для микрофона, без него браузер не разрешает слушать микрофон клиента.

02.08.2025 00:08 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
02.08.2025 08:12 UTC
0

В браузере телефона пишет разборчиво, что я говорю(значит распарсил мой разговор правильно), но Ирина текстом отвечает, что ничего не поняла.

Отслеживайте, что команда корректная. "Ирина дата" например

Еще непонятка, что как я понимаю, все завязано на Винду. В конфиге, пути к медиа вида C:\Program Files\....., а у меня Линукс. Куда мне этот MPCHC приткнуть и нужно ли мне оно вообще?

Ничего не завязано, один плагин на MPC-HC (делал под себя), все остальное независимо.

Если через телефон, есть ли Андроид приложение или только в браузере телефона запускать ссылку на сервер, вида https://IP:5003/mic_client или /webapi_client?

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

 И для чего у Ivan Firefly в докере порт 5004 тоже задействуется?

Не знаю, все вопросы по Докеру не ко мне.

02.08.2025 15:34 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
02.08.2025 16:08 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
02.08.2025 17:06 UTC
0

А как просто спросить что нибудь отвлеченное?

Ирина справка курс доллара к рублю (справка)

Ирина поболтаем (болталка)

нужен будет ключ VseGPT или другой конннект к ЛЛМ

02.08.2025 17:22 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
03.08.2025 08:07 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
03.08.2025 11:33 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
03.08.2025 12:22 UTC
0

Не знаю, могу предложить issue Гитхаба.

03.08.2025 19:47 UTC
0
НЛО прилетело и опубликовало эту надпись здесь