Локальный ИИ · обучение · голос
Голосовой локальный ИИ-репетитор без Интернета: Whisper, LLM и TTS
Ребёнок говорит в микрофон, локальная система распознаёт речь, ИИ понимает контекст урока, задаёт следующий вопрос и отвечает вслух. Такой голосовой репетитор уже можно собрать без обязательного облака. Но хороший результат зависит не от одного «голосового режима», а от четырёх частей: STT, LLM, учебной логики и TTS.
Это не тот же голосовой ассистент, что для умного дома
На Electrikman уже есть отдельный материал про локальный голосовой ассистент Home Assistant: там задача — быстро распознать команду, определить intent и включить свет, климат или сцену. Для ИИ-репетитора логика другая.
«Включи свет на кухне» → распознать → выполнить → коротко подтвердить.
«Я не понимаю дроби» → уточнить пробел → объяснить → спросить → проверить понимание.
Поэтому система должна оптимизироваться не только на точность распознавания и скорость ответа, но и на качество учебного хода: что спросить дальше, когда дать подсказку и когда замолчать, чтобы ученик подумал сам.
Архитектура голосового ИИ-репетитора
Все блоки заменяемые. Например, можно оставить одну и ту же LLM, но перейти с whisper.cpp на faster-whisper или сменить Piper на Silero. Это удобнее, чем строить монолит, где распознавание, логика и голос жёстко связаны.
Что происходит за один голосовой ход
- Ребёнок начинает говорить.Кнопка записи или VAD открывает новый голосовой ход.
- Аудио передаётся в STT.Локальная модель превращает речь в текст.
- Текст попадает в учебный сценарий.Система знает предмет, тему, уровень помощи и состояние задания.
- LLM формирует короткий ответ.Например, не решение, а один уточняющий вопрос или одну подсказку.
- Ответ отправляется в TTS.Чем раньше начинается озвучивание законченной фразы, тем естественнее диалог.
- После ответа снова включается слушание.Начинается следующий учебный ход.
Что выбрать для распознавания речи
| Вариант | Плюсы | Когда выбирать |
|---|---|---|
| Open WebUI Local Whisper | Уже встроен; не нужен отдельный STT-сервис; можно выбрать Whisper model и VAD. | Самый простой старт с Open WebUI. |
| whisper.cpp | Локальный C/C++ runtime; удобен на CPU и для самостоятельной интеграции. | Нужен лёгкий отдельный сервис или приложение. |
| faster-whisper | CTranslate2, VAD, word timestamps, GPU/CPU и удобный Python API. | Собственная серверная логика и более гибкий pipeline. |
| Self-hosted OpenAI-compatible STT | Интерфейс не зависит от конкретного движка. | Хотите менять STT без изменений фронтенда. |
Open WebUI поддерживает встроенный Local Whisper по умолчанию, а также внешний self-hosted STT через OpenAI-compatible endpoint. Для домашнего прототипа это удобно: интерфейс записи уже готов, а backend можно усложнять позже.
Local Whisper, browser STT и self-hosted провайдеры.
GITHUBwhisper.cppЛокальный Whisper runtime на C/C++.
GITHUBfaster-whisperCTranslate2, VAD и гибкий Python pipeline.
Нужно ли ставить самый большой Whisper
Нет. Более тяжёлая модель может улучшить распознавание сложной речи, но одновременно увеличивает нагрузку и задержку. Для голосового урока важно найти баланс на конкретном компьютере и конкретном ребёнке.
Правильный тест — записать 30–50 реальных коротких фраз: ответы по математике, пересказ, русские имена, числа, школьные термины. После этого сравнить, какая модель даёт приемлемое качество с комфортной скоростью.
Open WebUI Voice Mode — самый короткий путь к прототипу
В актуальном Open WebUI голосовые функции собраны в разделе Audio. Voice Mode работает пошагово: пользователь говорит, STT распознаёт реплику, модель отвечает, TTS читает ответ, после чего микрофон снова готов к следующему ходу.
У Voice Mode есть отдельный system prompt. Для ИИ-репетитора это особенно полезно: текстовый профиль учителя может давать подробное объяснение, а голосовой prompt — отвечать кратко.
- Говори максимум 1–3 короткими предложениями за один ход.
- Задавай только один вопрос за раз.
- Не сообщай готовый ответ до попытки ученика.
- Если ученик ошибся — сначала задай наводящий вопрос.
- После объяснения попроси сформулировать правило своими словами.
- Не читай длинные списки голосом — показывай их на экране.
Open WebUI также умеет использовать OpenAI-compatible STT/TTS endpoints. Это позволяет оставить интерфейс прежним, но вынести распознавание и синтез речи в отдельные локальные контейнеры или сервисы.
Что выбрать для русского голоса
Для русскоязычного домашнего репетитора в первую очередь стоит смотреть на Silero и актуальный Piper. Они решают одну задачу — локальный синтез речи, но отличаются архитектурой и интеграцией.
В текущей ветке Silero есть русская модель v5.5_ru, несколько голосов, автоматические ударения и обработка омографов. Подходит, когда важен именно русский голос и нужен локальный Python/PyTorch pipeline.
GitHub →Актуальная разработка находится в OHF-Voice/piper1-gpl. Есть русский ru_RU, ONNX voices, Python API, CLI и собственный HTTP server.
GitHub →Piper и Open WebUI: важная деталь
Open WebUI умеет работать с OpenAI-compatible TTS endpoint /audio/speech.
У собственного HTTP server Piper другой API: синтез выполняется через /synthesize.
Поэтому для прямого подключения Piper к Open WebUI обычно нужен небольшой adapter/wrapper,
который преобразует OpenAI-compatible запрос в вызов Piper.
OpenAI-compatible TTS backend и настройки Audio.
DOCSPiper HTTP APIЛокальный server Piper и endpoint /synthesize.
DOCSSilero TTSРусские v5-модели, голоса и варианты запуска.
Откуда берётся задержка в разговоре
Пользователь воспринимает не «скорость модели», а паузу между своей фразой и первым звуком ответа. Она складывается из нескольких компонентов.
Система должна понять, что ребёнок закончил реплику.
Распознать записанный фрагмент речи.
Дождаться первых токенов ответа.
Синтезировать первый кусок голоса.
Поэтому апгрейд только видеокарты для LLM не обязательно уберёт ощущение медлительности. Иногда главная пауза появляется из-за слишком долгого ожидания VAD или TTS, который сначала ждёт весь ответ целиком.
Как сделать из голосового чата именно учителя
Голос усиливает главную проблему обычного AI-чата: готовый ответ становится ещё проще получить. Ребёнку даже не нужно копировать текст — можно просто спросить: «Скажи ответ».
Пример нормального голосового диалога
Я не понимаю, как из 42 вычесть 17.
Хорошо. Начнём с единиц. Можно ли из 2 сразу вычесть 7?
Нет.
Верно. Что можно сделать с одним десятком из числа 42?
Такой диалог медленнее, чем «42 − 17 = 25», но именно это и есть цель учебного режима.
Какие голосовые режимы имеет смысл сделать
Ученик задаёт вопрос. ИИ объясняет короткими фрагментами и проверяет понимание.
ИИ задаёт вопросы по теме и фиксирует ответы без немедленного показа решения.
Разговор по роли, уровню и словарю с переключением языка только при необходимости.
Ребёнок пересказывает изученный материал, а система проверяет ключевые мысли.
Никаких подсказок во время ответа. Анализ и разбор только после завершения.
Отдельный pipeline проверяет чтение вслух и передаёт результат голосовому учителю.
Голосовому учителю нужна память не о разговорах, а о навыках
Полная история аудио и чатов сама по себе мало помогает обучению. Лучше хранить структурированное состояние: какая тема сейчас изучается, где ребёнок ошибался и сколько помощи потребовалось.
Перед новым голосовым ходом эти данные можно компактно передавать LLM. Это полезнее, чем каждый раз отправлять ей часовой transcript разговора.
Кнопка «говорить» или постоянно включённый микрофон
Для первого домашнего варианта разумнее push-to-talk: нажал кнопку, сказал ответ, отпустил. Такой интерфейс проще отлаживать, меньше ошибочных срабатываний и понятнее с точки зрения приватности.
Предсказуемо, просто, минимальные проблемы с VAD и посторонней речью.
VAD определяет конец фразы, ответ озвучивается, после него микрофон снова активируется.
Wake word для репетитора обычно не нужен. Он полезен, если устройство постоянно стоит в комнате как отдельный голосовой терминал. На ноутбуке или планшете кнопка проще.
Что проверить, чтобы система действительно была локальной
Какое железо нужно
Голосовая система добавляет нагрузку поверх LLM, но компоненты не обязательно должны одновременно занимать одну и ту же видеокарту. Например, TTS можно оставить на CPU, а GPU отдать LLM и STT.
Конкретный выбор зависит от размеров моделей и желаемой задержки. Поэтому лучше не дублировать таблицы памяти из других материалов, а измерить весь pipeline на собственном ПК.
Как собрать первый рабочий MVP
- Запустить локальную LLM.Например, через Ollama и профиль ИИ-репетитора.
- Поднять Open WebUI.Он даст готовый чат, микрофон, Voice Mode и настройки Audio.
- Сначала использовать встроенный Local Whisper.Не усложнять архитектуру отдельным STT-сервисом раньше времени.
- Создать отдельный voice system prompt.Короткие реплики, один вопрос за раз, запрет на готовые решения.
- Подключить локальный русский TTS.Silero или Piper через подходящий API/adapter.
- Начать с push-to-talk.Сначала качество диалога, потом автоматический VAD и hands-free.
- Замерить задержки отдельно.STT, LLM TTFT и TTS first audio — разные места оптимизации.
- Проверить на реальном учебном сценарии.Реальные мини-сессии полезнее синтетического benchmark.
# STT: встроенный Local Whisper
AUDIO_STT_ENGINE=
WHISPER_MODEL=small
WHISPER_LANGUAGE=ru
WHISPER_VAD_FILTER=true
# LLM: локальный Ollama / другой local backend
# настраивается отдельно в Open WebUI
# TTS: локальный OpenAI-compatible adapter
AUDIO_TTS_ENGINE=openai
AUDIO_TTS_OPENAI_API_BASE_URL=http://LOCAL-TTS:PORT/v1
AUDIO_TTS_OPENAI_API_KEY=local-key
AUDIO_TTS_MODEL=local-tts
AUDIO_TTS_VOICE=teacher
Это не готовый универсальный docker-compose, а схема настроек. Конкретные имя модели, endpoint и voice зависят от выбранного локального TTS-сервера.
Типичные ошибки при сборке
Частые вопросы
Можно ли сделать голосового ИИ-репетитора полностью без Интернета?
Да. Локальными могут быть запись, STT, LLM, RAG, память ученика и TTS. Интернет понадобится в основном для первоначальной загрузки программ и моделей.
Open WebUI умеет голосовой диалог?
Да. В актуальной документации есть Voice Mode: голос пользователя распознаётся, ответ модели озвучивается, затем микрофон снова готов к следующей реплике. STT и TTS настраиваются отдельно.
Что лучше для русского TTS — Piper или Silero?
Оба подходят локально. Silero интересен актуальными русскими v5-моделями с автоударениями и омографами. Piper удобен как лёгкий ONNX-движок и имеет ru_RU voices. Выбор лучше делать после прослушивания голосов и теста задержки.
Нужен ли wake word?
Не обязательно. Для учебного приложения push-to-talk обычно проще. Wake word имеет смысл для отдельного постоянно работающего голосового устройства.
Можно ли сделать разных преподавателей с разными голосами?
Да. Один профиль может быть математиком с одним TTS voice, другой — преподавателем английского с другим system prompt, базой знаний и голосом.
Нужна ли видеокарта только ради голоса?
Нет. Некоторые STT/TTS-сценарии нормально работают на CPU. GPU чаще нужен для ускорения тяжёлой LLM или более крупного Whisper. Проверять нужно весь pipeline на конкретном железе.
Источники и проекты
- Open WebUI: Voice, speech and audio
- Open WebUI: Configure Speech-to-Text
- Open WebUI: Self-Hosted Speech-to-Text
- Open WebUI: OpenAI-compatible Text-to-Speech
- GitHub: ggml-org/whisper.cpp
- GitHub: SYSTRAN/faster-whisper
- GitHub: snakers4/silero-models
- GitHub: OHF-Voice/piper1-gpl
- Piper: supported voices and Russian ru_RU
Продолжить про локальный ИИ для обучения
Следующий уровень домашнего ИИ