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

Проблема, из-за которой всё началось

Классическая история: школа плюс пара курсов (udemy, какие-то "рекомендуемые" учебники), времена и артикли более-менее в голове, тест на грамматику прохожу без труда. EF даже дал С2 в тесте, но конечно же это совсем не помогает говорить - открываешь рот в разговоре - и... зависаешь. Не потому что не знаешь правило, а потому что вспомнить его за полсекунды и одновременно строить фразу - это два разных навыка, и второй никто не тренирует.

Приложений для грамматики казалось бы полно, для разговорной практики еще больше. А вот стыка между «знаю правило» и «сказал вслух и не облажался» почти ни у кого нет. Я решил сделать именно этот стык.

Так появился Vervo - ИИ-репетитор английской грамматики для русскоязычных, https://vervo.live плюс бот в Telegram (+PWA, +miniApp).

Что это, в двух словах

Не чат-бот «давай сразу поговори со мной на английском» (не будем показывать пальцем), а цикл из пяти шагов:

  1. Урок - короткая страница на 3-4 минуты, объясняет одно правило. Она же в тренажере в виде выдвижного ящичка. Разные уровни, постарался кратко и не нудно.

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

  3. Слова - каждая ошибка размечается и всплывает снова по расписанию (spaced repetition - на FSRS). Выстраданный модуль, размеченные по CEFR слова с частотными характеристиками и скошенное нормальное распределение с разными коэффициентами в зависимости от уровня. Пытается подобрать слова к твоему уровню по уровню/частотам и немножечко вокруг него. Единственный модуль, которым люди реально пользуются. Он бесплатный (для меня почти тоже - только инфра).

  4. Ролевая игра - тот же грамматический паттерн и та же лексика, но уже в диалоге под уровень и недавние ошибки. Там же можно обсудить недавние новости из мира (не политика), и тоже напомнят про ошибки и слова.

  5. Сегодня - не меню, а диспетчер: сам решает, что слабое (повторить) и что новое (пройти), и не показывает одно и то же десять дней подряд. Пока кажется самое слабое звено, но понять что нужно пока не могу.

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

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

Как устроено внутри

Пара решений, которые могут быть интересны техническим людям.

Разделение моделей по ролям. Генерация/оценка - Gemini Flash 3.1 Lite (через OpenRouter). Пробовал Haiku - не справляется вообще. Казалось бы, перевод или простые предложения, но предложения вроде "Мама купила машину завтра" (что, черт побери ты несешь?) постоянно проявлялись. В других своих проектах по переводу тоже сталкивался с таким же поведением. Может быть я просто не умею его готовить. Но хотя бы кэшируется большая часть запроса. В кэш попадает контекст урока (правило, примеры, вокабуляр, слабые звуки, история), и вся сессия ученика бьёт в один и тот же кэш, насколько это возможно в OpenRouter.

Guarded generation. LLM время от времени выдаёт правдоподобную, но неверную коррекцию - это самый опасный класс багов в обучающем продукте: ученик запоминает неправильное правило и доверяет ему. Решение - второй, отличный от генератора (Deepseek v4 flash) критик-модель проверяет задание/предположительный ответ перед показом. Если критик не согласен, есть заранее подготовленный fallback-ответ вместо сырого вывода первой модели. Не панацея, но от "купила завтра" спасает.

Голос - не просто STT -> LLM -> TTS. Распознавание речи через Azure Speech Api (с фолбэком на OpenRouter), для анализа приходится гонять 2 раза - первый раз "угадай, что сказал этот человек" и второй - "оцени как это сказал" (разные api с разными выводами). Даёт оценку на уровне фонем - конкретно какой звук не получился. Правда пришлось еще разобраться как разбирать графемы до фонем, чтобы совместить результаты с буквами. Тот еще квест получился (и не факт, что получился). Есть разговорный режим - реалтайм с голосовой активацией и адаптивным таймаутом тишины вместо кнопки «зажать, чтобы говорить». TTS тоже в Ажур, что бы не искать другого провайдера. Опять же SSML поддерживается и очень живенько (часто сшилком живенько, но это ограничения SSML - слишком малый диапазон) говорит.

Инфраструктура. GCP Cloud Run (изначально выбрал GCP, т.к. есть scale-to-zero, к проду убрал), Firestore, TTS-кэш в GCS по sha256 от текста (один раз озвучили фразу для произношения - второй раз отдаём из кэша бесплатно). Считал экономику так, чтобы бесплатный пилот не разорил меня раньше, чем даст понятный сигнал, нужен ли продукт вообще.

Оплата - кредиты. Подписка чуть дешевле, но можно просто пакетами. Текстовое задание - 1 кредит, голосовое - дороже (голос это STT + TTS + фонемный анализ, очень уж дорого для меня выходит). Идея в том, чтобы сделать максимально честно для пользователя. Маржа маленькая, но вроде как делал для себя вообще не с прицелом на деньги.

Онбординг это вообще отдельная история. Почитал статьи на тему оценки уровня вокабуляра и грамматики и понял, что адаптивную грамматику еще как-то можно сделать с разумным количеством примеров, а вот вокабуляр очень неочевиден (просто потому, что нельзя измерить его прямым способом и сравнить с моделью). К примеру интересный факт, что в научных исследованиях 20% слов были ненастоящими. Я даже думал включить пасхалку с такими же предложениями вроде fake English, раз у меня TTS/SSML, но пока людей и так отпугивать есть чем.

Где это сейчас

Публичный пилот. При авторизации 100 кредитов (100 текстовых ответов или 40 голосовых). Соло-разработка, без команды, без денег на маркетинг - только на инфраструктуру и API.

Вот тут помощь бы не помешала

Много раз пытался обсуждать это с Opus/Fable - результатов почти нет. Предлагают маленькие оптимизации, а не фундаментальные изменения продукта. А мне кажется, что либо позиционирование неверное (неправильно продаю / неправильно объяснил что это), либо вообще никому кроме меня не нужно. Тут явно нужен человеческий глаз (и возможно рот).

Поэтому есть некоторое желание обратиться к технической аудитории. Буду благодарен за:

  • Прогон по продукту. Зайти, пройти пару уроков голосом и текстом, сказать, где споткнулись, что запутало, где хотелось бросить.

  • Критику архитектуры. Разделение моделей по ролям, guarded generation через критика, подбор слов, механика поддержки ошибок, кредитная модель вместо подписки с условным безлимитом - где я неправ или усложнил то, что можно было сделать проще?

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

Ссылки: https://vervo.live (+PWA) и бот https://t.me/Vervolive_bot (+miniApp)

Буду читать и отвечать на все комментарии.