Voice Input — голосовой интерфейс для AI-воронок
Пакет: Voice
Полное имя компонента: Common.Voice.VoiceInput
Что это
Voice Input — это высокоуровневый компонент Metabot для приёма и обработки голосовых сообщений внутри сценариев.
Он позволяет использовать голос как полноценный пользовательский ввод:
-
принять voice / video note / audio;
-
дождаться сообщения пользователя;
-
проверить stop-фразы и ограничения;
-
получить ссылку на аудиофайл от мессенджера;
-
отправить файл в speech-to-text провайдер;
-
вернуть распознанный текст обратно в сценарий;
-
продолжить логику как обычный flow Metabot.
Проще говоря, VoiceInput — это не просто “распознавание речи”.
Это голосовой middleware для conversational runtime.
Зачем нужен Voice Input
Большинство сценариев в ботах до сих пор строятся вокруг текста:
-
кнопки,
-
короткие ответы,
-
поля ввода,
-
ручной набор.
Но в живом использовании это часто неудобно.
Пользователь:
-
идёт по улице;
-
едет в машине;
-
держит телефон одной рукой;
-
не хочет долго печатать;
-
хочет объяснить мысль быстро и по-человечески.
И здесь голосовой ввод даёт очень сильное преимущество.
Что меняется с голосом
Когда человек печатает:
-
мысль дробится;
-
ответы укорачиваются;
-
детали теряются;
-
поток рвётся.
Когда человек говорит:
-
ответ становится быстрее;
-
в нём больше контекста;
-
появляется больше нюансов;
-
сценарий получает более “живой” материал для анализа.
Именно поэтому VoiceInput — это не просто удобство.
Это другой тип интерфейса.
Почему голос — это не просто удобство
Если вы ещё не используете голосовой ввод в сценариях, вы упускаете один из самых сильных интерфейсов взаимодействия с пользователем.
Речь — это не просто альтернатива тексту.
Это другой уровень скорости и качества мышления.
Скорость
-
🎙 Речь: 120–160 слов в минуту
-
⌨️ Печать: 25–60 слов в минуту
То есть голос в среднем быстрее печати примерно в 3–5 раз.
Но дело не только в скорости.
Что реально меняется
Когда человек печатает:
-
он подгоняет мысль под форму;
-
упрощает ответ;
-
сокращает детали;
-
тратит усилия на набор.
Когда человек говорит:
-
мысль идёт непрерывно;
-
смысл разворачивается естественно;
-
формулировка рождается “на ходу”;
-
система получает более плотный контекст.
Для AI-сценариев это особенно важно:
чем богаче вход, тем точнее можно:
-
интерпретировать ответ;
-
строить профиль;
-
определять intent;
-
извлекать структуру;
-
формировать полезный результат.
Что это даёт сценаристу и продуктологу
VoiceInput открывает другой класс сценариев.
С ним можно строить не только:
-
анкеты;
-
текстовые квизы;
-
меню и кнопки;
но и:
-
голосовые интервью;
-
профилирование пользователей;
-
глубокую квалификацию;
-
сценарии поддержки “на ходу”;
-
AI-собеседования;
-
входные воронки, где человек говорит свободно.
То есть сценарист перестаёт строить только “дерево ответов”
и начинает строить интерфейс мышления.
Где используется Voice Input
Компонент особенно полезен там, где:
-
пользователь должен отвечать развернуто;
-
неудобно печатать руками;
-
важна скорость ввода;
-
нужно получить больше смысла, чем помещается в короткий текст;
-
дальше ответ будет анализироваться через
LLMQuery.
Типовые кейсы:
-
голосовое профилирование;
-
onboarding в экосистему;
-
support-сценарии;
-
intake-интервью;
-
сбор обратной связи;
-
сценарии диагностики;
-
AI-ассистенты в Telegram;
-
мобильные интерфейсы с минимальным трением.
Где находится компонент
Компонент находится в пакете Voice и подключается как обычный плагин Metabot:
const VoiceInput = require("Common.Voice.VoiceInput")
Как работает Voice Input
VoiceInput работает как многошаговый голосовой pipeline, в котором участвуют:
-
сценарий;
-
callback от мессенджера;
-
системный processor script;
-
внешний STT-провайдер;
-
callback с готовым распознанным текстом.
Это важнее, чем кажется.
Если LLMQuery — это двухфазный асинхронный AI-запрос,
то VoiceInput — это уже голосовой pipeline из нескольких фаз, потому что здесь нужно сначала дождаться аудиосообщения, потом получить файл, а потом ещё отдельно дождаться результата распознавания.
Общая схема работы
Сценарий
→ VoiceInput.expect()
→ ожидание голосового сообщения
→ callback от мессенджера
→ получение ссылки на файл
→ отправка в STT
→ callback от STT
→ сохранение текста
→ переход в successScript
Фазы выполнения
Фаза 1. Сценарий включает ожидание голосового ввода
В обычной команде Run JavaScript сценарий вызывает:
VoiceInput.expect({...})
На этом этапе компонент:
-
принимает конфигурацию;
-
сохраняет её как активный voice input;
-
переводит сценарий в режим ожидания;
-
отправляет управление в processor script.
Фаза 2. Пользователь отправляет голосовое сообщение
Дальше processor script через callback-команду ждёт ввод пользователя.
На этом этапе компонент:
-
проверяет, не пришла ли stop-фраза;
-
проверяет тип сообщения;
-
валидирует длительность и размер файла;
-
получает file_id;
-
запрашивает у Telegram ссылку на файл;
-
сохраняет ссылку в
sourceAttr.
То есть в этой фазе мы ещё не распознаём текст.
Мы только:
-
понимаем, что пришёл допустимый голосовой артефакт;
-
получаем ссылку на файл;
-
подготавливаем его к отправке в STT.
Фаза 3. Аудио отправляется в speech-to-text
Во второй команде processor script запускается асинхронный API-вызов к STT-провайдеру.
На этом этапе:
-
файл уже известен;
-
компонент формирует STT-запрос;
-
использует провайдера и модель из конфигурации;
-
показывает пользователю сообщение вроде
✅ Принято. Обрабатываю…; -
уходит в ожидание callback с распознанным текстом.
Фаза 4. Текст возвращается в сценарий
Когда STT-провайдер возвращает результат:
-
текст сохраняется в
targetAttr; -
дополнительные атрибуты из
extraAttrsустанавливаются в lead; -
внутреннее состояние очищается;
-
сценарий переводится в
successScript.
После этого распознанный текст можно использовать:
-
как обычный lead-атрибут;
-
передать в
LLMQuery; -
сохранить в профиль;
-
подставить в другой шаг сценария.
Обязательное условие использования
Чтобы VoiceInput работал, в боте должен существовать системный processor script, через который проходят оба callback-цикла.
По умолчанию это скрипт с кодом:
VoiceInput_Processor
Без него компонент работать не будет.
Причина в том, что VoiceInput не ограничивается одним вызовом.
Ему нужен отдельный системный контур, который:
-
обрабатывает callback от мессенджера;
-
потом обрабатывает callback от STT-провайдера.
Как устроен processor script
Processor script должен содержать две команды.
Команда 1. Callback от мессенджера
Тип команды:
Run JavaScript Callback
Код:
const VoiceInput = require("Common.Voice.VoiceInput")
return VoiceInput.onCallback({ lead, isFirstImmediateCall })
Эта команда:
-
ждёт пользовательский ввод;
-
проверяет stop-фразы;
-
определяет, пришёл ли voice / video_note / audio;
-
получает ссылку на файл;
-
сохраняет runtime-контекст для следующего шага.
Команда 2. Callback от STT-провайдера
Тип команды:
Run asynchronous API-request
Код:
const VoiceInput = require("Common.Voice.VoiceInput")
return VoiceInput.onSTT({ lead, isFirstImmediateCall })
Эта команда:
-
инициирует запрос на speech-to-text;
-
ждёт async callback от STT;
-
получает распознанный текст;
-
сохраняет его в
targetAttr; -
переводит сценарий в
successScript.
Что важно понимать про processor script
VoiceInput.expect() сам по себе не завершает всю работу.
Он только:
-
включает режим ожидания;
-
сохраняет конфигурацию;
-
передаёт управление в processor script.
Вся дальнейшая механика:
-
ожидание голоса,
-
получение файла,
-
отправка в STT,
-
получение текста
происходит именно через этот системный скрипт.
Поэтому если вы импортируете готовую конфигурацию, processor script уже должен быть внутри.
Если вы собираете решение вручную — его нужно создать обязательно.
Что нужно настроить перед использованием
Перед тем как использовать VoiceInput, нужно убедиться, что настроены:
-
канал,
-
processor script,
-
инфраструктурные атрибуты бота,
-
ключ STT-провайдера.
1. Настройки канала: реакция на аудио и голосовые
Это обязательная настройка.
В канале нужно включить:
-
Реакция на аудио:
Штатная (NLP и меню) -
Реакция на голосовые сообщения:
Штатная (NLP и меню)
Иначе голосовые сообщения будут игнорироваться или не будут корректно попадать в сценарий.
Пример
Реакция на аудио:
Штатная (NLP и меню)
Реакция на голосовые сообщения:
Штатная (NLP и меню)
Сейчас компонент ориентирован прежде всего на Telegram-контур.
В дальнейшем этот слой может расширяться и на другие каналы.
2. Инфраструктурные атрибуты бота
Как и в случае с LLMQuery, для callback-механики должны быть настроены:
-
METABOT_API_TOKEN -
METABOT_SERVER_DOMAIN
Они нужны, потому что callback от внешнего STT-провайдера возвращается обратно в Metabot через внешний процессор.
3. Ключ провайдера speech-to-text
Сам ключ STT обычно передаётся через tokenKey в конфигурации компонента.
Например:
stt: {
provider: "openai",
options: { model: "whisper-1", language: "ru" },
asyncResponse: true,
tokenKey: "OPENAI_API_KEY"
}
То есть:
-
ключ хранится в атрибуте бота;
-
имя этого атрибута указывается в
tokenKey.