5. Winer denoise audio filter

[1]:
import matplotlib.pyplot as plt
import torch

import cutcutcodec

5.1. Read, Denoise and Write

In a Winer filter, the noise profile has to be ergodic.

[ ]:
FILE = cutcutcodec.utils.get_project_root().parent / "media" / "audio" / "winer.wav"
RATE = 44100

# read the signal
with cutcutcodec.read(FILE) as noisy_container:

    # extract the noise
    noise_container = noisy_container.apply_audio_subclip(25.0, 30.0)

    # denoised with winer
    denoised_container = (noise_container | noisy_container).apply_audio_wiener(level=0.95, band=4.0)

    # plot signals
    noisy_stream = noisy_container.out_streams[0]
    denoised_stream = denoised_container.out_streams[0]
    noisy_signal = noisy_stream.snapshot(0, RATE, int(RATE*noisy_stream.duration))
    denoised_signal = denoised_stream.snapshot(0, RATE, int(RATE*denoised_stream.duration))

    # save signal
    cutcutcodec.write(denoised_container.out_streams, "/tmp/denoised_winer.flac", streams_settings=[{"encodec": "flac", "rate": RATE}])

5.2. Plot spectrograms

[ ]:
# display noisy frame
plt.title("Spectogram of the noisy signal")
plt.xlabel("time (s)")
plt.ylabel("frequency (Hz)")
plt.specgram(noisy_signal[0], Fs=RATE, NFFT=2048)
plt.show()

# display denoised frame
plt.title("Spectogram of the denoised signal")
plt.xlabel("time (s)")
plt.ylabel("frequency (Hz)")
plt.specgram(denoised_signal[0], Fs=RATE, NFFT=2048)
plt.show()

5.3. Plot temporal signals

[ ]:
# signal in temporal domains
plt.title("Winer filtering in temporal domain.")
plt.plot(torch.arange(noisy_signal.shape[1]) / RATE, noisy_signal[0], label="noisy signal")
plt.plot(torch.arange(denoised_signal.shape[1]) / RATE, denoised_signal[0], label="denoised signal")
plt.xlabel("time (s)")
plt.legend()
plt.show()