Диааризация на GPU: метрики и пайплайны

Задача страницы. Инженерный гид по построению диааризации (кто говорил и когда) на GPU: real‑time для звонков/совещаний и батч‑диааризация архивов, поддержка перекрывающейся речи (OSD), оценка качества (DER/JER), экономическая модель и операционные метрики. Ориентир: локальный NVMe‑кэш, режимы On‑Demand и Interruptible, контейнеризация и стриминг (SSE/WebSocket), интеграция с ASR/энхансментом.

TL;DR

  • **Режимы:

  • On‑Demand (реал‑тайм): слайдинг‑окна, онлайн‑кластеризация, OSD; буфер 200–500 мс, минимальная задержка.

  • Interruptible (батчи): сегментация→эмбеддинги→кластеризация (AHC/VBx/PLDA)→ресегментация→отчёты.

  • Пайплайн: AEC/денойз (опц.) → VAD → сегментация (win/hop) → эмбеддинги спикера (GPU)кластеризация → [OSD/ресегментация] → пост‑процесс → JSON/RTTM.

  • Метрики качества: DER = Miss + False Alarm + Confusion; JER; параметры оценки: collar (обычно 0.2–0.5 с), учёт overlap.

  • Ключевые латентные/производственные метрики: RTF_diar, TTFA_diar, p50/p95 latency, speaker‑turn latency, overlap coverage, GPU util/HBM.

  • Экономика: Cost_per_min = (c_gpu × RTF_diar / U) / 60; RTF_diar ≈ RTF_vad + RTF_embed + RTF_cluster + RTF_osd.

  • Тюнинг: FP16/BF16 для эмбеддеров, pinned/zero‑copy, кэш сегментов/эмбеддингов на NVMe, микробатчинг в батче. См. https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/fp8-bf16/, https://cloudcompute.ru/solutions/throughput-vs-latency/

  • Интеграции: ASR (слова + спикеры), энхансмент/сепарация до эмбеддингов. См. https://cloudcompute.ru/solutions/asr-whisper/, https://cloudcompute.ru/solutions/speech-enhancement/

Сценарии (когда это нужно)

  • Колл‑центры/контроль качества: кто говорит, длительность, перерывания, перекрытия, доли времени по ролям.
  • Совещания/протоколы: автоматическая расклейка реплик по спикерам, интеграция с ASR и саблайнами.
  • Медиа/архивы: батч‑диааризация выпусков/подкастов/лекций, подготовка для поиска по спикерам.
  • Комплаенс/безопасность: контроль один‑на‑один/много участников, детект перекрытий и «фоновых» голосов.
  • Предобработчик пайплайнов: улучшение точности ASR/VC/TTS за счёт чистых спикерских интервалов.

Архитектуры и пайплайны 1) Реал‑тайм диааризация (низкая латентность, SSE/WebSocket)

Audio In (Mic/WebRTC/RTSP)
 └─> [Optional] AEC/Denoise ─┐
 └─> VAD (pad 100–200 ms) ├─> Segmenter (win 1.5 s, hop 0.5 s)
 └─> GPU: Speaker Embedder (FP16/BF16)
 └─> Online Clustering (centroid/adapt PLDA)
 └─> OSD (overlap speech detect)
 └─> Post (hysteresis/smoothing)
 └─> Stream Out (SSE/WebSocket JSON)

Особенности: speaker‑turn latency управляется длиной окна/хопа и сглаживанием; OSD для разметки одновременных спикеров; бэктрек‑коррекции в пределах 1–2 окон.

2) Батч‑диааризация (качество, отчётность)

Object Storage ─┬─> Preprocess (resample, enh)
 ├─> Segmentation (win/hop, VAD thresholds)
 ├─> GPU Embeddings (batch)
 ├─> Clustering (AHC/VBx/PLDA thresholds)
 ├─> Resegmentation (Viterbi/HMM, overlap handling)
 └─> Writer (RTTM/JSON, per‑speaker WAV)
 └─> Metrics (DER/JER) + QA reports

Особенности: overlapped‑aware ресегментация; параметризация порогов под домен; отчёты DER/JER по корпусам.

3) ASR + Диааризация (слово‑точные подписи спикеров)

Clean Audio ─> Diarization (segments) ─┬─> ASR (words + ts)
 └─> Alignment Mapper
 └─> Speaker‑labeled words (JSON/SRT/VTT)

Интеграция с ASR‑гайдом: https://cloudcompute.ru/solutions/asr-whisper/

Профили GPU и ориентиры

Одновременные real‑time потоки при U≈0.7, win=1.5 с/hop=0.5 с, OSD включён. Для батчей масштабируйте по «Экономике».

**Профиль GPU** **Память** **Типичные стеки** **Real‑time потоки\*** **Батчи (параллель)** **Комментарии**
24 ГБ (Compact) 24 ГБ VAD + эмбеддер (ECAPA/SSL‑класс) + онлайн‑кластер 3–8 6–16 Базовый контакт‑центр/митинги, моно 16–24 кГц.
48 ГБ (Balanced) 48 ГБ Усиленные эмбеддеры + OSD + ресегментация 8–16 16–32 Баланс скорости/качества, устойчивый p95.
80 ГБ (HQ) 80 ГБ Мультиканал/beamforming + OSD HQ + VBx 16–32 32–64 Сложные домены/перекрытия, длинные сессии.

* Зависит от частоты/канальности, доли перекрытий, сложности OSD/ресегментации и I/O. Тюнинг и профилировка: https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/throughput-vs-latency/, https://cloudcompute.ru/solutions/fp8-bf16/

Конфиги и скелеты кода

Docker Compose (real‑time + batch)

version: "3.9"
x-common-env: &env
 MODELS_DIR: /models
 CACHE_DIR: /var/cache/diar
 SAMPLE_RATE: "16000"
 FRAME_MS: "20"
 EMBED_PRECISION: "fp16" # bf16|fp16
 WIN_S: "1.5"
 HOP_S: "0.5"
 VAD_THRESHOLD: "0.6"
 OSD_ENABLE: "true"
 CLUSTER_METHOD: "online" # online|ahc|vbx
 CLUSTER_THRESHOLD: "0.35"
services:
 diar-realtime:
 image: cloudcompute/diarization:latest
 environment:
 <<: *env
 SERVICE_MODE: "realtime"
 TTFA_TARGET_MS: "300"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 ports: ["8040:8040"]
 volumes:
 - /nvme/models:/models
 - /nvme/diar-cache:/var/cache/diar
 command: ["python", "serve_realtime.py", "--host=0.0.0.0", "--port=8040"]
 diar-batch:
 image: cloudcompute/diarization:latest
 environment:
 <<: *env
 SERVICE_MODE: "batch"
 MAX_CHUNK_SECONDS: "120"
 OVERLAP_SECONDS: "0.3"
 CLUSTER_METHOD: "vbx"
 deploy:
 resources:
 reservations:
 devices: [{ capabilities: ["gpu"] }]
 volumes:
 - /nvme/models:/models
 - /nvme/diar-cache:/var/cache/diar
 - /mnt/audio:/data/in
 - /mnt/labels:/data/out
 command: ["python", "run_batch.py", "--input=/data/in", "--output=/data/out"]

K8s (скелет, 1 GPU/под)

apiVersion: apps/v1
kind: Deployment
metadata:
 name: diar-realtime
spec:
 replicas: 2
 selector: { matchLabels: { app: diar-realtime } }
 template:
 metadata:
 labels: { app: diar-realtime }
 spec:
 containers:
 - name: diar
 image: cloudcompute/diarization:latest
 ports: [{ containerPort: 8040 }]
 env:
 - { name: EMBED_PRECISION, value: "fp16" }
 - { name: WIN_S, value: "1.5" }
 - { name: HOP_S, value: "0.5" }
 - { name: OSD_ENABLE, value: "true" }
 volumeMounts:
 - { name: models, mountPath: /models }
 - { name: cache, mountPath: /var/cache/diar }
 resources:
 limits:
 nvidia.com/gpu: 1
 memory: "24Gi"
 cpu: "4"
 volumes:
 - name: models
 hostPath: { path: /nvme/models }
 - name: cache
 hostPath: { path: /nvme/diar-cache }

Конфиг пайплайна (YAML)

pipeline:
 input:
 sample_rate: 16000
 channels: 1
 preprocess:
 denoise: false
 aec: false
 vad:
 threshold: 0.6
 pad_ms: 150
 segmentation:
 win_s: 1.5
 hop_s: 0.5
 min_speech_s: 0.3
 min_silence_s: 0.2
 embeddings:
 model: "ecapa_like" # или ssl_spk_like
 precision: "fp16"
 l2_normalize: true
 batch_size: 128 # для батча
 osd:
 enabled: true
 overlap_min_s: 0.2
 clustering:
 method: "vbx" # online|ahc|vbx
 threshold: 0.35
 max_speakers: 8
 resegmentation:
 enabled: true
 hysteresis_ms: 200
 smoothing_ms: 150
 output:
 formats: [json, rttm]

FastAPI: стриминг спикерских смен (SSE)

from fastapi import FastAPI
from sse_starlette.sse import EventSourceResponse
import json, asyncio
app = FastAPI()
async def diar_stream(audio_iter):
 async for turn in online_diarize(audio_iter):
 # turn: {"spk":"SPEAKER_01","ts_start":12.34,"ts_end":13.80,"overlap":["SPEAKER_02"]}
 yield json.dumps(turn)
@app.post("/diar/stream")
async def diar_stream_endpoint():
 async def event_gen():
 async for evt in diar_stream(audio_source()):
 yield {"event": "turn", "data": evt}
 yield {"event": "done", "data": "{}"}
 return EventSourceResponse(event_gen())

Ресегментация и сглаживание (псевдокод)

def smooth_and_hysteresis(segments, hys_ms=200, smooth_ms=150):
 # объединяет короткие "микро-реплики" и стабилизирует границы
 ...
def overlap_infer(segments, osd_events):
 # помечает перекрывающуюся речь на основе OSD
 ...
def finalize(segments):
 segments = smooth_and_hysteresis(segments)
 segments = overlap_infer(segments, osd_events=[])
 return segments
``` **Наблюдаемость/метрики/алерты**

**Latency/Perf:**

- diar\_ttfa\_seconds{mode=rt} — время до первой разметки (p95 ≤ 0.3–0.5 с).
- diar\_rtf — t\_proc / t\_audio (real‑time цель p95 &lt; 0.7).
- diar\_turn\_latency\_seconds — задержка реакции на смену спикера.
- diar\_gpu\_utilization, diar\_gpu\_mem\_peak\_bytes, diar\_nvme\_read\_mb\_s.

**Quality:**

- diar\_der (общий/по сессиям), diar\_jer, diar\_miss, diar\_fa, diar\_confusion.
- diar\_overlap\_coverage — доля корректно размеченной перекрывающейся речи.
- diar\_speakers\_estimate\_error — ошибка оценки числа спикеров.

**Ops:**

- diar\_segments\_count, diar\_avg\_segment\_len, diar\_cluster\_switch\_rate.
- Версионирование: diar\_model\_version, diar\_threshold\_profile.

**Алерты (примеры):**

- diar\_der\_p95 &gt; target — калибровать пороги/ресегментацию, улучшить VAD/OSD/денойз (см. <https://cloudcompute.ru/solutions/speech-enhancement/>).
- diar\_turn\_latency\_p95 &gt; SLA — уменьшить hop\_s, увеличить буфер, упростить OSD.
- gpu\_mem\_peak/HBM &gt; 0.9 — уменьшить batch/окна, FP16/BF16, разделить сервисы.

Дополнительно: <https://cloudcompute.ru/solutions/monitoring-logging/> • <https://cloudcompute.ru/solutions/llm-inference/observability/>

## **Экономика и формулы**

Обозначения: c\_gpu — цена/час, U — целевая загрузка GPU, RTF\_diar = t\_proc / t\_audio.

- **Сколько GPU для онлайна:
 GPU\_count = ceil( (Σ RTF\_diar\_streams) / U ).
- **Стоимость минуты аудио:
 Cost\_per\_min = (c\_gpu × RTF\_diar / U) / 60.
- **Декомпозиция RTF:
 RTF\_diar ≈ RTF\_vad + RTF\_embed + RTF\_cluster + RTF\_osd (+ RTF\_preproc).
- **Батчи (время партии):
 T\_batch ≈ (RTF\_diar × L\_audio\_total) / (GPU\_count × U).

Подходы к минимизации стоимости: кэш эмбеддингов на NVMe, микробатчинг, профили **24/48/80 ГБ** под сложность, агрегация коротких записей. См. <https://cloudcompute.ru/solutions/cost-planner/> • <https://cloudcompute.ru/solutions/throughput-vs-latency/>

**Безопасность/политики**

- **Биометрия/PII:** спикер‑эмбеддинги — чувствительные данные; хранение с шифрованием «на диске» и «в канале», доступ по ролям.
- **Минимизация:** храните эмбеддинги и метки, сырое аудио — по строгому TTL; логи без аудио.
- **Версионирование:** фиксируйте версии эмбеддера/кластера/порогов в метаданных.
- **Изоляция:** раздельные GPU‑пулы и бакеты по тенантам/регионам; контроль копирования/экспорта.

Подробнее: <https://cloudcompute.ru/solutions/security/> • <https://cloudcompute.ru/solutions/storage-data/>

**Траблшутинг**

<table><tbody><tr><td>**Симптом**

</td><td>**Возможная причина**

</td><td>**Решение**

</td></tr><tr><td>Завышенный DER за счёт Miss

</td><td>Жёсткий VAD/слишком длинный hop

</td><td>Понизить VAD\_THRESHOLD, уменьшить hop\_s, включить ресегментацию

</td></tr><tr><td>Много False Alarm

</td><td>Шум/эхо/нет энхансмента

</td><td>Включить денойз/AEC, поднять VAD\_THRESHOLD, добавить пост‑фильтры

</td></tr><tr><td>Частые «дребезги» спикеров

</td><td>Нет гистерезиса/слишком мелкие окна

</td><td>hysteresis\_ms ≥ 150–250, win\_s ≥ 1.5, сглаживание границ

</td></tr><tr><td>Путает спикеров (Confusion)

</td><td>Слабые эмбеддинги/порог кластера

</td><td>Усиленный эмбеддер, тюнинг CLUSTER\_THRESHOLD, VBx/PLDA

</td></tr><tr><td>Плохая работа на overlap

</td><td>OSD отключён/порог высок

</td><td>Включить OSD, калибровать overlap\_min\_s, использовать overlap‑aware ресег

</td></tr><tr><td>Высокая turn‑latency

</td><td>Крупный hop/буфер

</td><td>Уменьшить hop\_s до 0.25–0.5 с, баланс с качеством/RTF

</td></tr><tr><td>VRAM OOM

</td><td>Большие батчи/много потоков

</td><td>FP16/BF16, уменьшить batch, разделить сервисы по пулам

</td></tr><tr><td>Нестабильный DER между релизами

</td><td>Дрифт моделей/порогов

</td><td>Версионирование, канареечный деплой, контрольные корпуса/пороговые тесты

</td></tr></tbody></table>

См. также: <https://cloudcompute.ru/solutions/interruptible-patterns/> • <https://cloudcompute.ru/solutions/performance-tuning/>

**Как запустить в cloudcompute.ru**

1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/>
 Выберите **Diarization (Real‑time)** или **Diarization (Batch)**.
2. Профиль GPU: **24/48/80 ГБ** — по частоте/перекрытиям/канальности и SLA.
3. Диски/кэш: смонтируйте /nvme/models, /nvme/diar-cache; для батчей — /mnt/audio и /mnt/labels.
4. Настройте параметры пайплайна по docker-compose.yml: WIN\_S/HOP\_S, VAD\_THRESHOLD, CLUSTER\_METHOD/THRESHOLD, OSD/ресегментация.
5. Для продакшна: автоскейл по U/RTF/queue, дашборды и алерты (DER/JER/turn‑latency/GPU HBM), канареечный деплой.

Дополнительно:
[ https://cloudcompute.ru/solutions/asr-whisper/](https://cloudcompute.ru/solutions/asr-whisper/) — слово‑точные подписи по спикерам.
[ https://cloudcompute.ru/solutions/speech-enhancement/](https://cloudcompute.ru/solutions/speech-enhancement/) — очистка аудио перед эмбеддингами.
[ https://cloudcompute.ru/solutions/triton-inference-server/](https://cloudcompute.ru/solutions/triton-inference-server/) — сервинг моделей.
[ https://cloudcompute.ru/solutions/gradio-fastapi/](https://cloudcompute.ru/solutions/gradio-fastapi/) — быстрые эндпойнты/демо.
[ https://cloudcompute.ru/solutions/containers-ci-cd/](https://cloudcompute.ru/solutions/containers-ci-cd/) — сборка/выкладка.

**Чек‑лист перед продом**

- Замерены TTFA\_diar p50/p95, RTF\_diar p50/p95, **turn‑latency**.
- Целевые **DER/JER** достигнуты на контрольном корпусе; пороги зафиксированы.
- Включён OSD и overlap‑aware ресегментация при необходимости.
- Выбран профиль GPU (24/48/80 ГБ) с запасом по U ≥ 0.2.
- NVMe‑кэш и каталоги примонтированы; прогрев эмбеддеров.
- Настроены алерты: DER/JER/turn‑latency/GPU HBM/queue length.
- Политики PII/биометрии и ретеншна внедрены; шифрование и роли.
- Interruptible‑джобы идемпотентны; чанк ≤ 120 с; ретраи.
- Нагрузочный прогон ≥ 30 мин на целевом профиле с реальными звонками.

**Навигация**

- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- ASR (Whisper/WhisperX): <https://cloudcompute.ru/solutions/asr-whisper/>
- Улучшение речи (denoise/dereverb/сепарация): <https://cloudcompute.ru/solutions/speech-enhancement/>
- Аудио‑эмбеддинги: <https://cloudcompute.ru/solutions/audio-embeddings/>
- Музыкальные модели: <https://cloudcompute.ru/solutions/music-ml/>
- Планирование стоимости: <https://cloudcompute.ru/solutions/cost-planner/>
- Производительность и тюнинг: <https://cloudcompute.ru/solutions/performance-tuning/>
- Throughput vs Latency: <https://cloudcompute.ru/solutions/throughput-vs-latency/>
- FP8/BF16: <https://cloudcompute.ru/solutions/fp8-bf16/>
- Multi‑GPU: <https://cloudcompute.ru/solutions/multi-gpu/>
- Хранилище и данные: <https://cloudcompute.ru/solutions/storage-data/>
- Безопасность: <https://cloudcompute.ru/solutions/security/>
- Мониторинг и логи: <https://cloudcompute.ru/solutions/monitoring-logging/>
- Наблюдаемость инференса: <https://cloudcompute.ru/solutions/llm-inference/observability/>
- Interruptible‑паттерны: <https://cloudcompute.ru/solutions/interruptible-patterns/>
- Triton Inference Server: <https://cloudcompute.ru/solutions/triton-inference-server/>
- Gradio + FastAPI: <https://cloudcompute.ru/solutions/gradio-fastapi/>
- CI/CD контейнеров: <https://cloudcompute.ru/solutions/containers-ci-cd/>

Готовы запустить?

Запустить GPU-сервер