2.4 ML — STT, Ollama, модели
Обновлено: 09 Октябрь 2026
Версия: 2.4.0
Документ описывает компоненты распознавания записей совещаний и локального LLM после установки по 2.2 Установка. Технические детали пайплайна — в репозитории ASK: ml_services/STT_PIPELINE.md, ml_services/models/README.md.
Зачем это нужно
| Компонент | Назначение |
|---|---|
| ffmpeg / ffprobe | Видео/аудио (.webm, .mp4, …) → WAV 16 кГц mono перед STT |
| GigaAM-v3 RNNT | Primary ASR (русский) |
| faster-whisper large-v3 | Fallback ASR на «подозрительных» интервалах |
| pyannote | Диаризация (разделение спикеров) |
| Ollama + Qwen3-4B | Саммари протокола и генерация черновиков статей KB |
Celery очередь stt |
Тяжёлые задачи transcribe_stt_result, compute_voice_embedding |
| HF_TOKEN | Доступ к gated-моделям Hugging Face (см. ниже) |
Включение функции в UI: Настройки → Задачи → «Распознавание записей совещаний» (MEETING_RECORDING_SUMMARY_ENABLED, по умолчанию выключено).
Требования к серверу
Для STT на CPU рекомендуется не менее 16 ГБ RAM. На 4 ГБ VPS загрузка GigaAM/Whisper приводит к OOM (нужен swap и concurrency=1, но работа будет медленной). Диск: модели Whisper + pyannote + GigaAM ckpt + GGUF Qwen — порядка десятки ГБ свободного места в /var/www/ml_models/ и /var/lib/ask-ollama.
Системные пакеты
sudo apt-get install -y ffmpeg
ffmpeg -version
ffprobe -version
Без ffmpeg Celery логирует No such file or directory: 'ffmpeg' и падает на load_waveform_tensor: ожидается WAV, получен .webm.
Python / PyTorch
Устанавливайте одинаковые CPU-колёса:
pip install torch==2.10.0 torchaudio==2.10.0 --index-url https://download.pytorch.org/whl/cpu
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
Смешение CUDA-torchaudio и CPU-torch ломает импорт. Пакет GigaAM в requirements.txt не pin'ится:
git clone --depth 1 https://github.com/salute-developers/GigaAM.git /var/www/GigaAM
pip install -e "/var/www/GigaAM[torch]"
Каталог моделей должен принадлежать пользователю Celery (например askprodadmin):
sudo mkdir -p /var/www/ml_models/gigaam
sudo chown -R askprodadmin:www-data /var/www/ml_models
Hugging Face токен — зачем он?
Это не «токен РФ» и не ключ лицензии АСК. Это персональный access token Hugging Face.
Нужен, потому что:
- Диаризация использует gated-модель
pyannote/speaker-diarization-community-1(нужно принять лицензию на странице модели и скачать веса вml_models/pyannote-speaker-diarization-community-1/). - GigaAM
transcribe_longformвызывает VAD на базеpyannote/segmentation-3.0. Без токена (и без локального кэша) longform падает с ошибкой Model … was not found locally, and no HF_TOKEN was provided — пайплайн откатывается на chunked GigaAM.
Если модели уже лежат локально и longform не критичен, токен можно не задавать. Рекомендуется прописать в /var/www/ask/.env:
HF_TOKEN=hf_...
HUGGINGFACE_TOKEN=hf_...
Django/ml_services нормализуют оба имени: GigaAM читает именно HF_TOKEN. После изменения .env перезапустите Celery.
Ollama и модель саммари
sudo bash /var/www/ask/ml_services/scripts/setup_ollama.sh
Скрипт ставит только qwen3_4b_instruct_2507_q4_k_m (устаревшая qwen2_5_7b_instruct_q8 больше не используется в деплое ASK).
| Путь | Назначение |
|---|---|
/var/lib/ask-ollama |
Runtime blobs Ollama (user ollama; не кладите в /home/... с правами 750) |
/var/www/ml_models/qwen3_4b_instruct_2507_q4_k_m/ |
GGUF + Modelfile |
Проверка:
systemctl status ollama --no-pager
curl -s http://127.0.0.1:11434/api/tags
ollama list
Переменные (опционально): OLLAMA_BASE_URL, OLLAMA_SUMMARY_MODEL, OLLAMA_KB_MODEL, OLLAMA_EXTRACT_MODEL — по умолчанию имя модели выше.
Celery
Два воркера (создаёт deploy.sh, см. также ручной шаг в 2.2 Установка):
| Программа | Очередь | concurrency | Потоки BLAS/OpenMP | Примечание |
|---|---|---|---|---|
celery |
celery |
2 (на слабом VPS — 1) | 1 | Короткие/I-O задачи |
celery-stt |
stt |
1 | 6 на 8 vCPU (OMP_*, MKL_*, OPENBLAS_*, DIARIZATION_OMP_THREADS) |
nice -n 5, --prefetch-multiplier=1 |
celerybeat |
— | — | 1 | Планировщик |
Зачем так: один тяжёлый STT-процесс может занять до ~6 ядер (диаризация/PyTorch), два ядра остаются Django/PostgreSQL/Redis и обычному Celery. Обычный воркер не слушает stt, STT-воркер не слушает celery — иначе короткие задачи и распознавание дерутся за CPU/память.
Маршруты в config/settings.py (CELERY_TASK_ROUTES):
ml_services.tasks.transcribe_stt_result→sttml_services.tasks.compute_voice_embedding→stt
Без программы celery-stt задачи распознавания остаются в pending.
stopwaitsecs=600 у celery-stt — длинная транскрибация не должна обрываться при restart. На VPS с менее чем 12 ГБ RAM или менее чем 4 vCPU в deploy.sh для STT выставляется OMP=1.
Логи: /var/log/celery/worker.log, worker-stt.err, beat.log.
Каталог моделей (кратко)
/var/www/
ask/
ask_env/
ml_models/
faster-whisper-large-v3/
pyannote-speaker-diarization-community-1/
gigaam/ # ckpt v3_rnnt (скачивается при первом запуске)
qwen3_4b_instruct_2507_q4_k_m/
GigaAM/ # исходники editable install
Скачивание Whisper/pyannote — см. ml_services/models/README.md в репозитории.
Включение в продукте
- Убедиться, что ffmpeg, модели, GigaAM, Ollama и воркеры
celery+celery-sttна месте (supervisorctl status). - Настройки → Задачи → «Распознавание записей совещаний» = включено.
- На карточке совещания загрузить запись и запустить обработку.