Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Инструкция описывает развёртывание сервера распознавания речи openai-whisper-asr-webservice (образ onerahmet/openai-whisper-asr-webservice) на GPU через Docker Compose и его подключение к AI Anki, где он используется для голосовых ответов на карточки, в AI-собеседованиях и на экзаменах.
Сервис принимает аудиофайл (webm, ogg, mp3, wav и др.) и возвращает распознанный текст через HTTP API /asr. Публичный адрес в нашей инфраструктуре — https://asr.webmastermsk.ru (за обратным прокси), внутри сети — порт 9890.
Важное замечание: изначально сервер работал на модели base. Она маленькая и плохо понимает русскую речь: технические термины превращались в обычные слова («SQL» → «Эсквель», «база данных» → «база донных»). Рекомендуемая конфигурация ниже — движок faster_whisper с моделью large-v3-turbo.
large-v3-turbo (около 1,5 ГБ в режиме int8).
Итоговый вариант 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 (проверить: есть только в новых версиях образа, в старых игнорируется) |
| Модель | Видеопамять (float16, примерно) | Русская речь | Когда выбирать |
|---|---|---|---|
base | ~1 ГБ | плохо, путает термины | не рекомендуется |
small | ~1,5 ГБ | средне | очень слабая видеокарта |
medium | ~3 ГБ | хорошо | если turbo недоступна |
large-v3-turbo | ~2–3 ГБ | очень хорошо | рекомендуется |
large-v3 | ~4–5 ГБ | лучше всего, но медленнее | много свободной видеопамяти |
Для замены модели у существующего приложения: Apps → whisper-server → Edit → поменять environment → Save. Контейнер пересоздастся.
cd /путь/к/compose docker compose up -d docker logs -f whisper-server
При первом запросе модель скачивается в том whisper-models. Распознавание станет доступно через 1–2 минуты (зависит от скорости интернета).
Документация API (Swagger) открывается в браузере:
http://<IP-сервера>:9890/docs
Тестовое распознавание с консоли:
curl -s -X POST \ -F "audio_file=@test.webm" \ "http://<IP-сервера>:9890/asr?task=transcribe&language=ru&output=json&encode=true"
Ответ содержит поле text с распознанной фразой. Загрузку GPU и использование памяти можно посмотреть так:
nvidia-smi
| Параметр | Пример | Назначение |
|---|---|---|
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 автоматически передаёт в нём текст текущего вопроса и английские термины из него.
https://asr.webmastermsk.ru (или http://<IP>:9890 внутри сети);Кнопка «Голосом» появится в учебной сессии (текстовые карточки), в 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://<IP>:9890/asr?task=transcribe&language=ru&output=json&encode=true"