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()