AudioSR-LektorAI / README.md
DriiftKing's picture
No-fiddle: zaszyty łańcuch agy (mono+HPF75+LUFS-18+peak-1dB) w postproc.py; front=kroki+normalizacja; piny scipy/pyloudnorm
a6791a4 verified
|
Raw
History Blame Contribute Delete
5.39 kB
---
title: AudioSR Wzbogacanie Probek
emoji: 🎙️
colorFrom: indigo
colorTo: blue
sdk: gradio
sdk_version: 6.17.3
python_version: "3.10"
app_file: app.py
pinned: false
---
# AudioSR — wzbogacanie krótkich próbek głosu (CPU / darmowy)
Twój Space do super-rozdzielczości audio (AudioSR, k2-fsa/haoheliu): krótki klip → 48 kHz.
Próbki służą jako **referencja do klonowania głosu** (RVC/Applio + zero-shot TTS OmniVoice).
UI w kolorystyce Lektor AI. Pole do wrzucenia próbki → odtwarzacz + przycisk pobierania WAV.
## Tryb NO-FIDDLE — backend ustawiony za Ciebie
Cały „know-how" przetwarzania jest **zaszyty w backendzie** — nie ma czego dłubać.
Frontend ma **TYLKO dwie kontrolki**:
- **DDIM steps** — suwak jakość vs czas (więcej kroków = lepiej, ale wolniej).
- **Normalizuj** — przełącznik dwustopniowej normalizacji (LUFS → sufit szczytu).
Stałe backendu (hardcode, nie do ruszania): model `basic`, guidance `3.5`, seed `42`,
`latent_t_per_second = 12.8`.
## Pipeline
```
(opcjonalny zewnętrzny UVR5 de-reverb)
AudioSR (super-rozdzielczość, 48 kHz) ← AudioSR ZAWSZE przed normalizacją
przycięcie paddingu AudioSR do długości wejścia
postproc.process(...) ← czyszczenie + normalizacja (czysty DSP, testowalny)
zapis WAV 48 kHz (odtwarzacz + pobieranie)
```
### Normalizuj **WŁĄCZONE** (kolejność istotna)
1. **force-mono** — embeddery (hubert / contentvec / spin-v2) oczekują mono; stereo grozi
kasowaniem fazy.
2. **usunięcie DC** — odjęcie składowej stałej.
3. **high-pass ~75 Hz** — Butterworth rz. 2, **zero-phase** (`scipy` filtfilt) — zdejmuje
rumble/szum sieciowy, **nie rusza barwy** głosu, nie rozmywa transjentów.
4. **LUFS normalize → -18 LUFS** — wg **ITU-R BS.1770-4** (`pyloudnorm` Meter, K-weighting);
podnosi percepcyjną głośność/gęstość, by model uczył się barwy także z cichszych miejsc.
Odporny fallback dla bardzo krótkich/cichych klipów (mniejszy block_size → RMS).
5. **sufit szczytu -1 dB****wyłącznie redukcja wzmocnienia** (gain-down), gdy szczyt > -1 dB.
**Zero kompresji / limitera / clipingu** — czysta zmiana skali (nie myli embedderów).
Wynik zapisywany jako **WAV 16-bit PCM** (`subtype=PCM_16`) — sufit -1 dB istnieje właśnie po to,
by kontener nigdy nie obciął na ±1.0.
> **Kompromis LUFS ↔ szczyt (uczciwie):** przy pojedynczym głośnym transjencie (plozja, klik)
> sufit -1 dB może zejść wzmocnieniem na tyle, że cel **-18 LUFS nie zostanie dotrzymany** — bez
> limitera nie da się mieć obu naraz, a limitera świadomie NIE dodajemy (psułby barwę). W takim
> wypadku apka **wypisuje pomarańczowe ostrzeżenie** z brakującą liczbą dB (zamiast cicho udawać
> sukces) i sugeruje ręczne wyciszenie transjentu w Audacity. Na normalnej mowie cel -18 wchodzi.
### Normalizuj **WYŁĄCZONE**
force-mono → dopasowanie poziomu **RMS** wyjścia do oryginału → bezpiecznik szczytu **0.99**
(bez high-passu / LUFS). To dotychczasowe, łagodne zachowanie.
## Co ŚWIADOMIE pominięto (i dlaczego)
Backend bierze tylko **uniwersalnie bezpieczne, automatyzowalne** kroki. Pomijamy te, które
agy (red-team Gemini 3.1 Pro) sam ostrzega, że są **niebezpieczne w ciemno**:
- **Spektralna redukcja szumu** — #1 zabójca barwy; nie da się wiarygodnie auto-profilować.
- **Wycięcie rezonansu EQ** — szkodliwe na już-czystym audio.
- **UVR5 de-reverb** — narzędzie **zewnętrzne**, nie wbudowane w apkę.
- **Ręczne usuwanie klików/plozji** — nieautomatyzowalne bezpiecznie (wymaga ucha).
- **Kompresja / limiter / noise gate / boost EQ** — spłaszczają dynamikę, zabijają transjenty,
podbijają sybilanty → szkodzą jako referencja TTS/RVC.
**Warunkowy de-esser** (tnij 6–8 kHz o ≤3 dB tylko gdy pasmo gorące) jest **zaimplementowany,
ale domyślnie WYŁĄCZONY** (`postproc.DEESS_ENABLED = False`): w trybie w pełni automatycznym
de-essing w ciemno ryzykuje zmatowienie spółgłosek, które AudioSR dopiero odbudował.
> Źródło prawdy o jakości to jakość **nagrania** (cichy pokój) > każdy post-processing.
> Próbkowania **nie schodzimy** w dół — RVC sam zresampluje do 32k/40k w preprocesie Applio.
## Architektura plików
- `app.py` — UI Gradio + orkiestracja AudioSR (model cache, progress/ETA, padding trim).
- `postproc.py`**czysty DSP** (numpy/scipy/soundfile/pyloudnorm), bez gradio →
testowalny lokalnie: `python postproc.py` (samotest: DC, LUFS, sufit, krótki klip).
- `viz.py` — wykres widma (wierzchołki / góra pasma) jako `<img>`.
`scipy==1.10.1` i `pyloudnorm==0.1.1`**przypięte** pod `numpy==1.23.5`/py3.10 (koła
manylinux cp310 zweryfikowane) — bez tego resolver mógłby ściągnąć scipy zbudowane pod
numpy 2.x i wywalić build. Importy DSP są dodatkowo **miękkie**: brak scipy → pomiń HPF,
brak pyloudnorm → RMS-fallback (apka degraduje, nie pada).
## Hosting (darmowy)
- Nowy Space → SDK **Gradio**, Hardware **CPU basic (free)**, Visibility **Private**
(Twój głos zostaje u Ciebie).
- Wgraj: `app.py`, `postproc.py`, `viz.py`, `requirements.txt`, `README.md`.
- **CPU**: 1 klip ≈ ~2 min (dyfuzja). Domyślnie model **basic**, **24 kroki**.
## Uwaga
Pierwsze uruchomienie pobiera checkpointy AudioSR z HF (kilka GB) — pierwszy klip wolniejszy.