Rimuovere il rumore da un file audio con Python
Versione italiana
Rimuovere il rumore da un file audio con Python
Ecco diversi metodi per ridurre il rumore da file audio usando Python:
1. Usando noisereduce (libreria specializzata)
import noisereduce as nr
import soundfile as sf
import numpy as np
# Carica l'audio
= sf.read("input.wav")
audio, rate
# Seleziona una porzione di solo rumore (es. primi 100ms)
= audio[:int(rate*0.1)]
noise_sample
# Riduci il rumore
= nr.reduce_noise(y=audio, y_noise=noise_sample, sr=rate)
reduced_noise
# Salva il risultato
"output_clean.wav", reduced_noise, rate) sf.write(
2. Con librosa (per elaborazione avanzata)
import librosa
import soundfile as sf
import numpy as np
# Carica l'audio
= librosa.load("input.wav", sr=None)
audio, rate
# Calcola la STFT (trasformata di Fourier)
= librosa.stft(audio)
stft
# Calcola la magnitudine e la fase
= librosa.magphase(stft)
magnitude, phase
# Crea un filtro per ridurre il rumore
= librosa.util.softmask(magnitude, 0.2 * magnitude, power=2)
mask
# Applica il filtro
= stft * mask
clean_stft
# Ricostruisci il segnale audio
= librosa.istft(clean_stft)
clean_audio
# Salva il risultato
"output_clean.wav", clean_audio, rate) sf.write(
3. Filtro passa-basso con scipy
from scipy.io import wavfile
from scipy.signal import butter, lfilter
import numpy as np
# Carica l'audio
= wavfile.read("input.wav")
rate, audio
# Crea un filtro passa-basso
def butter_lowpass(cutoff, fs, order=5):
= 0.5 * fs
nyq = cutoff / nyq
normal_cutoff = butter(order, normal_cutoff, btype='low', analog=False)
b, a return b, a
def lowpass_filter(data, cutoff, fs, order=5):
= butter_lowpass(cutoff, fs, order=order)
b, a = lfilter(b, a, data)
y return y
# Applica il filtro (es. taglia frequenze sopra 4000Hz)
= lowpass_filter(audio, 4000, rate)
clean_audio
# Salva il risultato
"output_clean.wav", rate, clean_audio.astype(np.int16)) wavfile.write(
4. Installazione delle librerie necessarie
pip install noisereduce librosa soundfile scipy numpy
Consigli per migliori risultati:
- Campione di rumore: Per noisereduce, cerca di ottenere almeno 100ms di solo rumore
- Parametri sperimentali: Modifica i parametri in base al tuo audio
- Formato WAV: Lavora sempre con file WAV non compressi per migliori risultati
- Filtri combinati: Puoi combinare più tecniche per risultati migliori
Esempio avanzato (combinazione di tecniche):
import noisereduce as nr
import librosa
import soundfile as sf
# Carica l'audio
= librosa.load("input.wav", sr=None)
audio, rate
# Riduzione rumore 1
= audio[:int(rate*0.1)]
noise_sample = nr.reduce_noise(y=audio, y_noise=noise_sample, sr=rate)
reduced
# Riduzione rumore 2 con librosa
= librosa.stft(reduced)
stft = librosa.magphase(stft)
magnitude, phase = librosa.util.softmask(magnitude, 0.3 * magnitude, power=2)
mask = stft * mask
clean_stft = librosa.istft(clean_stft)
clean_audio
# Salva il risultato finale
"output_superclean.wav", clean_audio, rate) sf.write(
English version
Removing noise from an audio file with Python
Here are several methods for reducing noise from audio files using Python:
1. Using noisereduce (specialized library)
import noisereduce as nr
import soundfile as sf
import numpy as np
# Load the audio
= sf.read("input.wav")
audio, rate
# Select a portion of noise only (e.g., first 100ms)
= audio[:int(rate*0.1)]
noise_sample
# Reduce the noise
= nr.reduce_noise(y=audio, y_noise=noise_sample, sr=rate)
reduced_noise
# Save the result
"output_clean.wav", reduced_noise, rate) sf.write(
2. With librosa (for advanced processing)
import librosa
import soundfile as sf
import numpy as np
# Load the audio
= librosa.load("input.wav", sr=None)
audio, rate
# Calculate the STFT (Fourier transform)
= librosa.stft(audio)
stft
# Calculate the magnitude and phase
= librosa.magphase(stft)
magnitude, phase
# Create a filter to reduce noise
= librosa.util.softmask(magnitude, 0.2 * magnitude, power=2)
mask
# Apply the filter
= stft * mask
clean_stft
# Reconstruct the audio signal
= librosa.istft(clean_stft)
clean_audio
# Save the result
"output_clean.wav", clean_audio, rate) sf.write(
3. Low-pass filter with scipy
from scipy.io import wavfile
from scipy.signal import butter, lfilter
import numpy as np
# Load audio
= wavfile.read("input.wav")
rate, audio
# Create a low pass filter
def butter_lowpass(cutoff, fs, order=5):
= 0.5 * fs
nyq = cutoff / nyq
normal_cutoff = butter(order, normal_cutoff, btype='low', analog=False)
b, a return b, a
def lowpass_filter(data, cutoff, fs, order=5):
= butter_lowpass(cutoff, fs, order=order)
b, a = lfilter(b, a, data)
y return y
# Apply the filter (e.g. cut frequencies above 4000Hz)
= lowpass_filter(audio, 4000, rate)
clean_audio
# Save the result
"output_clean.wav", rate, clean_audio.astype(np.int16)) wavfile.write(
4. Installing the necessary libraries
pip install noisereduce librosa soundfile scipy numpy
Tips for best results:
- Noise sample: For noisereduce, try to get at least 100ms of pure noise
- Experimental parameters: Adjust the parameters based on your audio
- WAV format: Always work with uncompressed WAV files for best results
- Combined filters: You can combine multiple techniques for better results
Advanced example (combination of techniques):
import noisereduce as nr
import librosa
import soundfile as sf
# Load audio
= librosa.load("input.wav", sr=None)
audio, rate
# Noise reduction 1
= audio[:int(rate*0.1)]
noise_sample = nr.reduce_noise(y=audio, y_noise=noise_sample, sr=rate)
reduced
# Noise reduction 2 with librosa
= librosa.stft(reduced)
stft = librosa.magphase(stft)
magnitude, phase = librosa.util.softmask(magnitude, 0.3 * magnitude, power=2)
mask = stft * mask
clean_stft = librosa.istft(clean_stft)
clean_audio
# Save the final result
"output_superclean.wav", clean_audio, rate) sf.write(
Puoi seguire anche il mio canale YouTube https://www.youtube.com/channel/UCoOgys_fRjBrHmx2psNALow/ con tanti video interessanti
I consigli che offriamo sono di natura generale. Non sono consigli legali o professionali. Quello che può funzionare per una persona potrebbe non essere adatto a un’altra, e dipende da molte variabili.
Per supportare e far crescere il canale in modo semplice, rapido e gratuito, potete fare acquisti su amazon usando il mio link di affiliazione.
Questo implica che io prenda una commissione ogni volta che qualcuno faccia un qualsiasi acquisto utilizzando il mio link di affiliazione https://amzn.to/4cgJ3Ls
Commenti
Posta un commento