Praca magisterska · Synteza audio · Dawid Nowak · 2026

cHiFi-GAN — Odsłuch wyników treningu

Conditional HiFi-GAN  ·  normal / murmur / extrastole  ·  SR 4 000 Hz  ·  3 s

Temat pracy

Synteza i augmentacja dźwięków serca przy użyciu warunkowych generatywnych sieci antagonistycznych (cGAN).

Celem pracy jest wytrenowanie generatora który na podstawie wektora szumu i etykiety klasy produkuje realistyczne 3-sekundowe nagrania audio bicia serca. Wygenerowane próbki mają służyć jako augmentacja datasetu — w szczególności klasy extrastole, która posiada zaledwie 64 przykłady treningowe, podczas gdy klasy normal i murmur mają ich ponad 20 000 każda.

Model warunkowy (cGAN) pozwala sterować klasą generowanego dźwięku przez embedding etykiety konkatenowany z wektorem latentnym i wstrzykiwany do każdej warstwy dyskryminatora. Docelowa miara jakości: test słuchowy — odsetek poprawnych klasyfikacji real/fake przez słuchaczy (50% = model oszukuje ludzi).

Dataset

Trzy publiczne zbiory danych, preprocessowane do jednolitego formatu: pliki WAV, 4 000 Hz, 3 sekundy, bez zero-paddingu. Pliki krótsze niż 3 s są odrzucane (MIN_DURATION=3.0).

ŹródłoNormalMurmurExtrastole
PhysioNet 2016 (sety a–e)~5 305~17 4820
PhysioNet/CirCor 202217 9874 4750
Bentley Dataset B25115964 *
Łącznie23 54322 11664

* Ze 86 oryginalnych nagrań extrastole z Bentley, 22 zostały odrzucone jako zbyt krótkie (< 3 s). Łącznie 43 056 klipów treningowych. Nierównowagę klas kompensuje WeightedRandomSampler.

Historia eksperymentów
01 cWaveGAN — 4 000 Hz, 200 epok Zakończony
Architektura: generator z ConvTranspose1d(stride=4), dyskryminator WGAN-GP.
Wynik: Generator ukończył 200 epok, pliki zostały zapisane — ale odsłuch ujawnił poważny artefakt. Wszystkie próbki normal i murmur miały wyraźny "przydzwięk" w paśmie 1 000–2 000 Hz.

Przyczyna techniczna: ConvTranspose1d(stride=4) przy SR = 4 kHz generuje aliasing przy częstotliwości 4000 / 4 = 1 000 Hz — dokładnie w centrum pasma słyszalnego. To fundamentalna wada architektury WaveGAN przy tak niskim SR.

Próby naprawy: filtr LPF 700 Hz (Chebyshev II, rząd 16) i multi-notch — obcięły artefakt, ale jednocześnie uszkodziły naturalny dźwięk. Odrzucone.
02 cWaveGAN — 16 000 Hz Porzucony
Próba podniesienia SR do 16 kHz żeby przesunąć aliasing (4 kHz) poza zakres dźwięków serca (~1 kHz).
Problem: tensory 4× większe → batch=16 powodował OOM, batch=8 cicho wieszał Metal GPU podczas backprop generatora. Jedynym stabilnym ustawieniem był batch=4, przez co każda epoka trwała ~13 godzin. Przy 200 epokach całość zajęłaby ponad 100 dni.
Obserwacja dodatkowa: spektrogramy z epok 5–30 pokazywały energię w całym paśmie 0–8 kHz, podczas gdy prawdziwe dźwięki serca mają energię niemal wyłącznie poniżej 1 kHz. Aliasing przesunął się, ale szerokopasmowy szum stał się jeszcze gorszy. Dataset usunięty.
03 cHiFi-GAN 4 kHz — bez SpectrogramDiscriminator Porzucony (~epoka 15)
Zmiana architektury upsamplingu: zamiast ConvTranspose1d użyto Upsample(nearest) + Conv1d — eliminuje aliasing bez zmiany SR.

  • Problem 1 — mode collapse: przy CLASS_EMB_DIM=16 korelacja Pearsona między próbkami normal i murmur osiągnęła +0.80 (epoka ~15). Fix: CLASS_EMB_DIM=64, restart od zera.
  • Problem 2 — discriminator dominance: loss_D spadało do ~1.08 zbyt szybko, generator nie miał z czego się uczyć. Fix: LR_D = 1e-4 (było 2e-4).
  • Problem 3 — brak feedbacku spektralnego: generator uczył się regularnych pulsów, ale ignorował kształt widma. Fix: dodano SpectrogramDiscriminator.
04 cHiFi-GAN 4 kHz + SpectrogramDiscriminator Aktualny · epoka 7+/200
Uruchomiony 25 maja 2026. Epoki 1–3 trwały ~3 godziny z powodu kompilacji shaderów Metal (jednorazowe zjawisko). Od epoki 4 stabilny czas: ~62 minuty/epokę.

Dodatkowe poprawki MPS (Apple Silicon M-series):
  • spectral_norm na pierwszym MSD → deadlock Metal → zamieniono na weight_norm
  • F.pad(mode='reflect') w PeriodDiscriminator → hang MPS → zmieniono na mode='replicate'
  • Podwójne wywołania MPD/MSD w kroku generatora → OOM → jedno wywołanie z rozpakowaniem obu wyników
  • torch.mps.empty_cache() po każdym batchu — zapobiega kumulowaniu pamięci Metal
Aktualna architektura — cHiFi-GAN
Generator
2 322 202 parametrów
Wejście: z ∈ ℝ¹²⁸ + class emb ∈ ℝ⁶⁴
Init: Linear → (256, 12)
Upsample: ×4 ×4 ×4 ×4 ×4 = ×1024
Kanały: 256 → 128 → 64 → 32 → 16 → 8
MRF kernels: 3, 7, 11 · dilations: 1,3,5
Wyjście: (1, 12 288) → trim → (1, 12 000)
Aktywacja: LeakyReLU + tanh na wyjściu
Dyskryminatory (łącznie 14 198 078 param.)
MPD — Multi-Period Disc., okresy [2, 3, 5]
MSD — Multi-Scale Disc., 3 skale
SD — SpectrogramDiscriminator (nowy)
  STFT: N_FFT=256, hop=64 → log-magnitude
  2D CNN: 32→64→128→256→1
Strata: LS-GAN + feature matching (λ=2.0) + SD (λ=1.0)
LR_G = 2e-4 · LR_D = 1e-4 · β=(0.8, 0.99)
Postęp treningu
Epokaloss_Dloss_GadvfmsdCzas
15.063611.80266.3182.7430.3643h 04m *
24.264617.17237.4384.8670.4343h 32m *
33.087923.45499.2717.0920.5663h 38m *
42.554726.701110.0368.3330.6141h 01m
52.444228.177210.2408.9690.6241h 02m
62.473329.038410.1829.4280.6071h 02m
72.467429.804010.2259.7890.6091h 05m

* Epoki 1–3 wolne z powodu jednorazowej kompilacji shaderów Metal (Apple MPS). Rosnące loss_G i fm przy malejącym loss_D świadczą o zdrowej dynamice GAN — dyskryminator nie dominuje.

Plan ewaluacji

Test słuchowy (metoda podstawowa): słuchacze (niekoniecznie medycy) odsłuchują mieszane próbki bez etykiet i próbują odróżnić prawdziwe od syntetycznych. Miara: procent poprawnych klasyfikacji — wynik 50% oznacza, że model skutecznie oszukuje ludzi.

Protokół: anchor (najlepsza prawdziwa + najgorsza syntetyczna jako punkt odniesienia), następnie ocena binarna dla próbek bez etykiet.

Alternatywna ewaluacja (rozważana z promotorem): klasyfikator ML trenowany na zbiorze real vs. real+synthetic — bardziej obiektywna miara użyteczności augmentacji do zadań downstream (np. klasyfikacja patologii).