====== Whisper ASR: сервер распознавания речи (GPU) ======
===== Введение =====
Инструкция описывает развёртывание сервера распознавания речи **openai-whisper-asr-webservice** (образ ''onerahmet/openai-whisper-asr-webservice'') на GPU через Docker Compose и его подключение к [[:truenas:application:ai_anki|AI Anki]], где он используется для голосовых ответов на карточки, в AI-собеседованиях и на экзаменах.
Сервис принимает аудиофайл (webm, ogg, mp3, wav и др.) и возвращает распознанный текст через HTTP API ''/asr''. Публичный адрес в нашей инфраструктуре — ''https://asr.webmastermsk.ru'' (за обратным прокси), внутри сети — порт **9890**.
**Важное замечание:** изначально сервер работал на модели ''base''. Она маленькая и плохо понимает русскую речь: технические термины превращались в обычные слова («SQL» → «Эсквель», «база данных» → «база донных»). Рекомендуемая конфигурация ниже — движок **faster_whisper** с моделью **large-v3-turbo**.
===== Требования =====
* Видеокарта NVIDIA и Docker с поддержкой GPU (NVIDIA Container Toolkit).
* Свободно ~2–3 ГБ видеопамяти для ''large-v3-turbo'' (около 1,5 ГБ в режиме int8).
* Свободный порт **9890** (или любой другой).
* Доступ в интернет при первом запуске — модель (~1,6 ГБ) скачивается автоматически.
===== Шаг 1: Docker Compose конфигурация =====
Итоговый вариант ''docker-compose.yml'':
services:
whisper-server:
container_name: whisper-server
deploy:
resources:
reservations:
devices:
- capabilities:
- gpu
count: 1
driver: nvidia
environment:
- ASR_ENGINE=faster_whisper
- ASR_MODEL=large-v3-turbo
- ASR_DEVICE=cuda
- ASR_QUANTIZATION=float16
- ASR_MODEL_PATH=/data/whisper
- MODEL_IDLE_TIMEOUT=300
volumes:
- whisper-models:/data/whisper
image: onerahmet/openai-whisper-asr-webservice:latest-gpu
ports:
- '9890:9000'
restart: unless-stopped
volumes:
whisper-models:
^ Параметр ^ Значение и зачем ^
| ''ASR_ENGINE'' | ''faster_whisper'' — тот же Whisper, но быстрее в несколько раз и экономнее по видеопамяти. Также есть ''openai_whisper'' и ''whisperx'' |
| ''ASR_MODEL'' | ''large-v3-turbo'' — качество близко к ''large-v3'' при гораздо большей скорости, хорошо понимает русский |
| ''ASR_DEVICE'' | ''cuda'' — распознавание на GPU |
| ''ASR_QUANTIZATION'' | ''float16'' — стандарт для GPU. При нехватке видеопамяти — ''int8'' (проверить ''int8_float16'' в вашей версии образа) |
| ''ASR_MODEL_PATH'' + том | модель скачивается один раз и не перекачивается при пересоздании контейнера |
| ''MODEL_IDLE_TIMEOUT'' | выгрузка модели из видеопамяти после N секунд простоя — полезно, если GPU общий с Ollama **(проверить: есть только в новых версиях образа, в старых игнорируется)** |
==== 1.1. Выбор модели ====
^ Модель ^ Видеопамять (float16, примерно) ^ Русская речь ^ Когда выбирать ^
| ''base'' | ~1 ГБ | плохо, путает термины | не рекомендуется |
| ''small'' | ~1,5 ГБ | средне | очень слабая видеокарта |
| ''medium'' | ~3 ГБ | хорошо | если turbo недоступна |
| ''large-v3-turbo'' | ~2–3 ГБ | очень хорошо | **рекомендуется** |
| ''large-v3'' | ~4–5 ГБ | лучше всего, но медленнее | много свободной видеопамяти |
===== Шаг 2: Развёртывание =====
==== 2.1. Через веб-интерфейс TrueNAS ====
- **Apps** → **Discover Apps** → **Custom App** (или **Install via YAML**).
- Вставьте конфигурацию из Шага 1.
- **Save** → **Deploy**.
Для замены модели у существующего приложения: **Apps** → ''whisper-server'' → **Edit** → поменять ''environment'' → **Save**. Контейнер пересоздастся.
==== 2.2. Через SSH ====
cd /путь/к/compose
docker compose up -d
docker logs -f whisper-server
При первом запросе модель скачивается в том ''whisper-models''. Распознавание станет доступно через 1–2 минуты (зависит от скорости интернета).
===== Шаг 3: Проверка =====
Документация API (Swagger) открывается в браузере:
http://:9890/docs
Тестовое распознавание с консоли:
curl -s -X POST \
-F "audio_file=@test.webm" \
"http://:9890/asr?task=transcribe&language=ru&output=json&encode=true"
Ответ содержит поле ''text'' с распознанной фразой. Загрузку GPU и использование памяти можно посмотреть так:
nvidia-smi
==== 3.1. Параметры запроса /asr ====
^ Параметр ^ Пример ^ Назначение ^
| ''task'' | ''transcribe'' | распознать (''translate'' — перевести на английский) |
| ''language'' | ''ru'' | язык речи; без него Whisper определяет язык сам и чаще ошибается |
| ''output'' | ''json'' | формат ответа (''txt'', ''vtt'', ''srt'', ''tsv'', ''json'') |
| ''encode'' | ''true'' | перекодировать вход через ffmpeg (нужно для webm/ogg из браузера) |
| ''initial_prompt'' | ''Термины: SQL, JOIN, PHP'' | подсказка: контекст и правильное написание терминов |
| ''vad_filter'' | ''true'' | вырезать тишину (faster_whisper) |
**Примечание:** параметр ''initial_prompt'' сильно улучшает распознавание терминов. AI Anki автоматически передаёт в нём текст текущего вопроса и английские термины из него.
===== Шаг 4: Подключение к AI Anki =====
- Войдите в AI Anki под **администратором**.
- **Настройки** → раздел **«Сервер»**:
* **ASR URL (Whisper)** — ''https://asr.webmastermsk.ru'' (или ''%%http://:9890%%'' внутри сети);
* **ASR логин / пароль** — если прокси требует Basic-авторизацию, иначе оставить пустыми.
- **Сохранить**.
- В разделе **«Обучение»** каждый пользователь может включить или выключить **«Исправлять распознанную речь с помощью ИИ»**. Модель поправит неверно услышанные термины, не меняя смысл ответа.
Кнопка **«Голосом»** появится в учебной сессии (текстовые карточки), в AI-собеседовании и на экзамене.
===== Проблемы и решения =====
^ Проблема ^ Причина ^ Решение ^
| Термины распознаются как обычные слова («Эсквель», «база донных») | слабая модель ''base'', нет контекста | ''large-v3-turbo'' + ''initial_prompt'' (AI Anki передаёт его сам) |
| ''HTTP 500'' на записи из браузера | формат webm/opus без перекодирования | передавать ''encode=true'' |
| Первый запрос очень долгий | модель скачивается | дождаться загрузки, смотреть ''docker logs whisper-server'' |
| Ollama стал медленным после смены модели | Whisper и Ollama делят видеопамять одной видеокарты, LLM уходит на CPU | ''ASR_QUANTIZATION=int8'', ''MODEL_IDLE_TIMEOUT'', проверить ''nvidia-smi'' |
| ''401'' из AI Anki | прокси требует авторизацию | указать ASR логин и пароль в настройках AI Anki |
| ''CUDA out of memory'' в логах | не хватает видеопамяти | модель меньше (''medium'', ''small'') или ''int8'' |
===== Шпаргалка =====
# логи сервиса
docker logs -f whisper-server
# перезапуск
docker restart whisper-server
# занятость видеопамяти
nvidia-smi
# тест распознавания
curl -s -X POST -F "audio_file=@test.webm" \
"http://:9890/asr?task=transcribe&language=ru&output=json&encode=true"