Улучшение речи на GPU: шумоподавление и сепарация
Задача страницы. Практический гид по построению сервисов speech enhancement на GPU: шумоподавление (denoise), подавление эха (AEC), дереверберация (dereverb) и разделение источников (source separation) в real‑time и батч‑режимах. Дадим пайплайны (стриминг и офлайн), sizing по профилям 24/48/80 ГБ, конфиги (Docker/K8s/YAML), метрики (RTF/TTFA/p95), экономику и траблшутинг. Рекомендуется локальный NVMe‑кэш, режимы On‑Demand и Interruptible, контейнеризация и стриминг через SSE/WebSocket.
TL;DR
- **Два режима: On‑Demand — интерактивная обработка микрофона/звонков/стримов (низкая латентность, буфер 200–500 мс). Interruptible — пакетная очистка больших архивов (чанк ≤ 120 с, ретраи, merge).
- Пайплайн: AEC → Beamforming (multi‑mic) → VAD → Denoise/Dereverb → [опц.] Separation (N спикеров) → Post‑process → (ASR/TTS/VC). Смежные решения: https://cloudcompute.ru/solutions/asr-whisper/, https://cloudcompute.ru/solutions/tts/, https://cloudcompute.ru/solutions/voice-conversion/
- Модели/алгоритмы (классы): спектральные (mask‑U‑Net‑класс, Wiener), временные (Conv‑TasNet‑класс, DPRNN), демиксеры (Demucs‑класс), AEC‑класс, WPE‑класс (dereverb), MVDR/GEV (beamforming).
- Ключевые метрики: RTF_enh (GPU_sec/audio_sec), TTFA_enh, p50/p95 латентности, SNRi, SI‑SDR, PESQ, STOI, drop‑rate.
- Тюнинг: FP16/BF16, фьюзинг, pinned/zero‑copy, overlap‑add, микробатчинг в батче. См. https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/fp8-bf16/, https://cloudcompute.ru/solutions/throughput-vs-latency/
- Экономика: Cost_per_min = (c_gpu * RTF_enh / U) / 60; при разделении: RTF_total ≈ RTF_denoise + N_speakers × RTF_sep. Калькулятор: https://cloudcompute.ru/solutions/cost-planner/
- Наблюдаемость: p95 RTF_enh, GPU util/HBM, underruns/overflow, quality‑метрики. См. https://cloudcompute.ru/solutions/monitoring-logging/, https://cloudcompute.ru/solutions/llm-inference/observability/
Сценарии (когда это нужно)
- Звонки/контакт‑центры/видеоконференции: подавление фонового шума, клавиатуры, кондиционеров, эха помещений.
- Медиа‑продакшен/подкасты: офлайн очистка дорожек, дереверберация, выравнивание громкости.
- ASR‑препроцессинг: повышение точности распознавания на сложном фоне (см. https://cloudcompute.ru/solutions/asr-whisper/).
- Разделение источников: выделение голоса диктора от музыки/шумов; извлечение N спикеров для дальнейшей обработки/диаризации.
- Edge/мультимик: кардиоидные массивы, beamforming (MVDR/GEV) перед нейронным denoise.
Архитектуры и пайплайны 1) Real‑time enhancement (низкая латентность, SSE/WebSocket)
Audio In (Mic/WebRTC/RTSP)
└─> AEC (опц, ref from device)
└─> Beamforming (опц, multichannel)
└─> VAD (pad=100–200 ms)
└─> Ring Buffer (200–500 ms)
└─> GPU: Denoise + Dereverb (FP16/BF16)
└─> [Optional] GPU: Separation (N speakers)
└─> Post-process (AGC/loudness)
└─> Stream Out (PCM/Opus via SSE/WebSocket)
Особенности: TTFA_enh ≤ 150–300 мс, стабильный RTF_enh < 1, кросс‑фейд 5–10 мс между блоками, backpressure и drop‑политики.
2) Батчи (массовая очистка/сепарация)
Object Storage ─┬─> Sharder (≤120 s, overlap 0.2–0.5 s)
├─> Work Queue (prio, retries, idempotency)
└─> N x GPU Workers:
├─> AEC/Beamform (опц.)
├─> Denoise + Dereverb
├─> [Optional] Separation (N)
└─> Merge (de-dup overlap, loudness)
└─> Writer (WAV/FLAC + JSON stems)
└─> Object Storage / DB
Особенности: NVMe‑кэш для временных WAV/спектрограмм/эмбеддингов; идемпотентные ключи; отчеты по качеству (PESQ/STOI/SI‑SDR).
3) Интеграция с ASR/TTS/VC
Enhancement Service ─> Clean audio ─┬─> ASR
├─> TTS (ре‑синтез)
└─> Voice Conversion
Сборка конвейера — через сервисную шину/очереди. См. хабы: https://cloudcompute.ru/solutions/, https://cloudcompute.ru/solutions/gradio-fastapi/
GPU‑профили и ориентиры
Диапазоны для одновременных real‑time потоков при RTF_enh ≈ 0.3–0.6 (denoise/dereverb) и RTF_sep ≈ 0.2–0.5 на спикера; U≈0.7. Для батчей — масштабирование по формуле в «Экономике».
| **Профиль GPU** | **Память** | **Типичные стеки** | **Real‑time потоки\*** | **Батчи (параллель)** | **Комментарии** |
| 24 ГБ (Compact) | 24 ГБ | Mask‑U‑Net‑класс denoise + лёгкий dereverb | 1–3 | 2–6 | Базовая очистка звонков/микрофона, SR 16–24 кГц. |
| 48 ГБ (Balanced) | 48 ГБ | Denoise + dereverb + **Separation (2ch)** | 3–6 | 6–12 | Баланс качества/латентности; устойчивые p95. |
| 80 ГБ (HQ) | 80 ГБ | Demucs‑класс / Conv‑TasNet‑класс + HQ dereverb | 6–12 | 12–24 | Высокое качество, многоканальность, N≥2 спикеров. |
* Зависит от частоты дискретизации, каналов, силы шума/реверберации, включённой сепарации и пост‑процесса. Тюнинг: https://cloudcompute.ru/solutions/performance-tuning/, https://cloudcompute.ru/solutions/fp8-bf16/, https://cloudcompute.ru/solutions/throughput-vs-latency/
Конфиги и скелеты кода
Docker Compose (real‑time + batch)
version: "3.9"
x-common-env: &env
MODELS_DIR: /models
CACHE_DIR: /var/cache/enh
SAMPLE_RATE: "24000"
FRAME_MS: "20"
PRECISION: "fp16" # bf16|fp16
STREAM_CODEC: "pcm_s16le" # или opus
ENABLE_AEC: "false"
ENABLE_BEAMFORM: "false"
ENABLE_SEPARATION: "false" # true для N спикеров
N_SPEAKERS: "2"
services:
enh-realtime:
image: cloudcompute/speech-enhancement:latest
environment:
<<: *env
SERVICE_MODE: "realtime"
TTFA_TARGET_MS: "200"
deploy:
resources:
reservations:
devices: [{ capabilities: ["gpu"] }]
ports: ["8070:8070"]
volumes:
- /nvme/models:/models
- /nvme/enh-cache:/var/cache/enh
command: ["python", "serve_realtime.py", "--host=0.0.0.0", "--port=8070"]
enh-batch:
image: cloudcompute/speech-enhancement:latest
environment:
<<: *env
SERVICE_MODE: "batch"
MAX_CHUNK_SECONDS: "120"
OVERLAP_SECONDS: "0.3"
deploy:
resources:
reservations:
devices: [{ capabilities: ["gpu"] }]
volumes:
- /nvme/models:/models
- /nvme/enh-cache:/var/cache/enh
- /mnt/audio-in:/data/in
- /mnt/audio-out:/data/out
command: ["python", "run_batch.py", "--input=/data/in", "--output=/data/out"]
K8s (1 GPU/под)
apiVersion: apps/v1
kind: Deployment
metadata:
name: enh-realtime
spec:
replicas: 2
selector: { matchLabels: { app: enh-realtime } }
template:
metadata:
labels: { app: enh-realtime }
spec:
containers:
- name: enh
image: cloudcompute/speech-enhancement:latest
ports: [{ containerPort: 8070 }]
env:
- { name: PRECISION, value: "fp16" }
- { name: SAMPLE_RATE, value: "24000" }
- { name: FRAME_MS, value: "20" }
- { name: ENABLE_SEPARATION, value: "false" }
volumeMounts:
- { name: models, mountPath: /models }
- { name: cache, mountPath: /var/cache/enh }
resources:
limits:
nvidia.com/gpu: 1
memory: "24Gi"
cpu: "4"
volumes:
- name: models
hostPath: { path: /nvme/models }
- name: cache
hostPath: { path: /nvme/enh-cache }
Конфиг пайплайна (YAML)
pipeline:
input:
sample_rate: 24000
channels: 1
aec:
enabled: false
tail_ms: 128
beamforming:
enabled: false
method: mvdr # mvdr|gev|cardioid
vad:
enabled: true
threshold: 0.6
pad_ms: 150
denoise:
model: "mask_unet_like"
precision: "fp16"
strength: 0.7 # 0..1
dereverb:
enabled: true
method: "wpe_like"
strength: 0.5
separation:
enabled: false
type: "demucs_like" # или conv_tasnet_like
speakers: 2
post:
agc: true
loudness_target_lufs: -23.0
output:
codec: "pcm_s16le"
stream_chunk_ms: 40
formats: [wav, stems_json]
FastAPI: стриминг очищенного аудио (SSE + base64 фреймы)
from fastapi import FastAPI, Body
from sse_starlette.sse import EventSourceResponse
import base64, asyncio
app = FastAPI()
async def enhance_stream(audio_iter, cfg):
async for frame in process_blocks(audio_iter, cfg): # 20–40 мс PCM16LE
yield base64.b64encode(frame).decode("ascii")
@app.post("/enh/stream")
async def enh_stream_endpoint(payload: dict = Body(...)):
cfg = payload.get("config", {})
async def event_gen():
async for b64_chunk in enhance_stream(audio_source(), cfg):
yield {"event": "audio", "data": b64_chunk}
yield {"event": "done", "data": "{}"}
return EventSourceResponse(event_gen())
# Заглушка источника аудио:
async def audio_source():
while True:
frame = await next_pcm_frame_or_none()
if frame is None:
break
yield frame
Overlap‑Add для батчей (псевдокод)
import numpy as np
def split_with_overlap(x, sr, win_s=1.2, hop_s=1.0):
win = int(win_s * sr); hop = int(hop_s * sr)
windows = [x[i:i+win] for i in range(0, max(len(x)-win, 0)+1, hop)]
return windows, win, hop
def overlap_add(chunks, win, hop):
out = np.zeros(hop*(len(chunks)-1)+win, dtype=chunks[0].dtype)
window = np.hanning(win)
for idx, c in enumerate(chunks):
i = idx*hop
out[i:i+win] += c[:win] * window
return out
``` **Наблюдаемость/метрики/алерты**
**Метрики (Prometheus‑стиль):**
- **RTF\_enh**: enh\_rtf{mode=rt|batch} — t\_proc / t\_audio. Цель p95 < 0.7 для интерактива.
- **TTFA\_enh**: enh\_ttfa\_seconds{mode=rt} — время до первого аудиофрейма (p95 ≤ 0.3 с).
- **Latency**: enh\_latency\_seconds{phase=aec|beamform|denoise|dereverb|separation|post} (p50/p95).
- **Quality**: enh\_pesq, enh\_stoi, enh\_sisdr, enh\_snri.
- **Stability**: enh\_jitter\_ms, enh\_buffer\_underrun\_total, enh\_drop\_rate.
- **GPU**: enh\_gpu\_utilization, enh\_gpu\_memory\_bytes, enh\_gpu\_mem\_peak\_bytes.
- **I/O**: enh\_nvme\_read\_mb\_s, enh\_nvme\_write\_mb\_s, hit‑rate кэша.
**Алерты (примеры):**
- enh\_ttfa\_p95 > 0.5s — увеличить ring‑buffer, уменьшить stream\_chunk\_ms, включить подогрев модели.
- enh\_rtf\_p95 > 0.8 — деградация; снизить силу эффектов/частоту дискретизации/сложность сепарации.
- enh\_sisdr\_p50 < 8 dB или enh\_snri\_p50 < 5 dB — качество ниже целевого; пересобрать профиль/модель.
- gpu\_mem\_peak / HBM > 0.9 — уменьшить размер блоков, включить offload, снизить число параллельных потоков.
Подробнее: <https://cloudcompute.ru/solutions/monitoring-logging/> • <https://cloudcompute.ru/solutions/llm-inference/observability/>
## **Экономика и формулы**
Обозначения: c\_gpu — цена GPU/час, U — целевая загрузка, RTF\_enh — t\_proc / t\_audio, RTF\_sep — на каждого спикера.
- **Сколько GPU для стриминга:
GPU\_count = ceil( (Σ (RTF\_enh + N\_speakers×RTF\_sep) ) / U )
Пример: 8 потоков, RTF\_enh=0.35, RTF\_sep=0.25, N=2, U=0.7 →
ceil( 8×(0.35+0.5)/0.7 ) = ceil( 8×0.85/0.7 ) = ceil(9.71) = 10 GPU.
- **Стоимость минуты аудио:
Cost\_per\_min = (c\_gpu × (RTF\_enh + N\_speakers×RTF\_sep) / U) / 60.
- **Батчи (время партии):
T\_batch ≈ ( (RTF\_enh + N\_speakers×RTF\_sep) × L\_audio\_total ) / (GPU\_count × U ).
Оптимизация расходов: микс профилей (24/48/80 ГБ) под разную сложность, offload тяжелых стадий, батчирование и кэширование. См. <https://cloudcompute.ru/solutions/cost-planner/> и <https://cloudcompute.ru/solutions/throughput-vs-latency/>
**Безопасность/политики**
- **PII/биометрия:** логируйте только агрегаты/метрики; не храните сырые дорожки без необходимости.
- **Ретеншн:** временные WAV/чанки/спектры — авто‑очистка по TTL; артефакты — на NVMe.
- **Ключи/токены:** только Secret‑хранилища/переменные окружения; ротация.
- **Изоляция:** раздельные GPU‑пулы по тенантам/профилям; доступ к бакетам по ролям.
- **Потоки/стримы:** защита каналов, ограничение доступа к «референс‑треку» для AEC.
См. также:[ https://cloudcompute.ru/solutions/security/](https://cloudcompute.ru/solutions/security/) • <https://cloudcompute.ru/solutions/storage-data/>
**Траблшутинг**
<table><tbody><tr><td>**Симптом**
</td><td>**Возможная причина**
</td><td>**Решение**
</td></tr><tr><td>«Металл/пампинг» после denoise
</td><td>Слишком агрессивные маски/низкий SR
</td><td>Снизить strength, повысить SR до 24 кГц, мягкий пост‑фильтр
</td></tr><tr><td>Щелчки/швы между блоками
</td><td>Несогласованные границы блоков
</td><td>Кросс‑фейд 5–10 мс, увеличить pad\_ms, корректный overlap‑add
</td></tr><tr><td>Высокий TTFA
</td><td>Ленивая инициализация
</td><td>Подогрев моделей, увеличить ring‑buffer, уменьшить stream\_chunk\_ms
</td></tr><tr><td>RTF\_enh ≈ 1 и выше
</td><td>Перегрузка GPU/включена сепарация
</td><td>FP16/BF16, отключить HQ‑dereverb, уменьшить N спикеров или добавить GPU
</td></tr><tr><td>Плохая разборчивость (низкий STOI)
</td><td>Удаление полезной речи с шумом
</td><td>Снизить силу denoise, донастройка VAD/beamforming
</td></tr><tr><td>Эхо не уходит
</td><td>Нет/неверный AEC ref
</td><td>Подключить правильный reference, увеличить tail\_ms
</td></tr><tr><td>Дубли/фантомы в разделении
</td><td>Недостаточный контекст/плохой merge
</td><td>Увеличить окно, улучшить post‑merge, калибровать модели
</td></tr><tr><td>VRAM OOM
</td><td>Большие блоки/много потоков
</td><td>Уменьшить размер блоков, включить offload, разделить сервисы по пулам
</td></tr><tr><td>Underruns в стриме
</td><td>Низкий буфер/нет backpressure
</td><td>Ring‑buffer 300–500 мс, контроль скорости выдачи, закрепление потоков
</td></tr></tbody></table>
См. также: <https://cloudcompute.ru/solutions/interruptible-patterns/> • <https://cloudcompute.ru/solutions/performance-tuning/>
**Как запустить в cloudcompute.ru**
1. Откройте **Шаблоны запусков**: <https://cloudcompute.ru/solutions/templates/>
Выберите **Speech Enhancement (Real‑time)** или **Speech Enhancement (Batch)**.
2. Выберите профиль GPU: **24/48/80 ГБ** — в зависимости от включенных стадий (dereverb/separation) и SLA.
3. Подключите диски: /nvme/models, /nvme/enh-cache; для батчей — /mnt/audio-in, /mnt/audio-out.
4. Настройте переменные окружения по docker-compose.yml (AEC/beamforming, сила denoise/dereverb, включение separation, частоты).
5. Для продакшна: автоскейл по U/RTF, раздельные пулы low‑latency и HQ, мониторинг/алерты и канареечный деплой.
Дополнительно:
[ https://cloudcompute.ru/solutions/triton-inference-server/](https://cloudcompute.ru/solutions/triton-inference-server/) — сервинг через Triton/ONNX/TensorRT.
[ https://cloudcompute.ru/solutions/gradio-fastapi/](https://cloudcompute.ru/solutions/gradio-fastapi/) — быстрый UI/эндпойнты/демо.
[ https://cloudcompute.ru/solutions/containers-ci-cd/](https://cloudcompute.ru/solutions/containers-ci-cd/) — сборка и выкладка.
**Чек‑лист перед продом**
- Замерены TTFA\_enh p50/p95, RTF\_enh/RTF\_sep p50/p95, jitter.
- Определены целевые **PESQ/STOI/SI‑SDR/SNRi** и проверки качества на корпусе.
- Выбран профиль GPU, запас по U ≥ 0.2; протестирован автоскейл.
- NVMe‑кэш подключен; настроен overlap‑add и merge без швов.
- Настроены алерты по TTFA/RTF/HBM/underruns/quality.
- Политики PII/ретеншна внедрены; логи без сырого аудио.
- Interruptible‑джобы идемпотентны; чанк ≤ 120 с; ретраи.
- Нагрузочный прогон ≥ 30 мин с целевыми p95.
**Навигация**
- Хаб «Решения»: <https://cloudcompute.ru/solutions/>
- ASR (Whisper/WhisperX): <https://cloudcompute.ru/solutions/asr-whisper/>
- TTS: <https://cloudcompute.ru/solutions/tts/>
- Voice Conversion: <https://cloudcompute.ru/solutions/voice-conversion/>
- Планирование стоимости: <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-сервер