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

A newer version of the Gradio SDK is available: 6.20.0

Upgrade
metadata
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 dBwyłą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.pyczysty 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.1przypię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.