Улучшение речи на 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

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

  • Звонки/контакт‑центры/видеоконференции: подавление фонового шума, клавиатуры, кондиционеров, эха помещений.
  • Медиа‑продакшен/подкасты: офлайн очистка дорожек, дереверберация, выравнивание громкости.
  • 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 &lt; 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 &gt; 0.5s — увеличить ring‑buffer, уменьшить stream\_chunk\_ms, включить подогрев модели.
- enh\_rtf\_p95 &gt; 0.8 — деградация; снизить силу эффектов/частоту дискретизации/сложность сепарации.
- enh\_sisdr\_p50 &lt; 8 dB или enh\_snri\_p50 &lt; 5 dB — качество ниже целевого; пересобрать профиль/модель.
- gpu\_mem\_peak / HBM &gt; 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-сервер