Tentang proyek
Tumpukan teknologi
Struktur file
Memulai
Hasil dan demo
Pekerjaan di masa depan
Kontributor
Ucapan Terima Kasih dan Sumber Daya
Lisensi
Kebisingan yang perlu dihapus yang secara alami diinduksi seperti noise non lingkungan yang dihilangkan dengan sinyal denoising. Merujuk dokumentasi ini juga blog ini tentang pengurangan noise ai
Perpustakaan Librosa untuk manupulasi audio digunakan.
Untuk sinyal audio kami menggunakan scipy
Matplotlib digunakan untuk memanipulasi data dan memvisualisasikan sinyal.
Sisanya tidak bagus untuk operasi matematika, gelombang untuk operasi pada file gelombang.
Noise Reduction ├───docs ## Documents and Images │ └───Input Audio file ├─── Project Details │ | │ ├─── │ │ ├───Research papers │ │ ├───Linear Algebra │ │ ├───Neural networks & Deep Learning │ │ ├───Project Documentation │ │ ├───AI Noise Reduction Blog │ │ ├───AI Noise Reduction Report │ │ └───Code Implementation │ │ ├───AI Noise Reduction.py │ │ ├───audio.wav │ │ ├───Resources
Diuji pada windows
git clone https://github.com/dhriti03/noise-reduction.gitcd reduction noise
Di buku catatan Anda Instal perpustakaan tertentu
Pip Instal Wave Pip Instal Librosa Pip Instal Scipy.io Pip Instal matplotlib.pyplot
*Ini adalah file audio asli * *Setelah penambahan kebisingan *
*Sinyal audio akhir setelah menghapus noise *
*Diagram alur untuk proyek *
Saat memanipulasi kode sesuai dengan kebutuhan Anda, Anda dapat menggunakannya untuk mengontrol sebagian besar tanda audio. ##Teori
FFT dihitung di atas klip audio kebisingan
Statistik dihitung melalui FFT dari noise (dalam frekuensi)
Ambang batas dihitung berdasarkan statistik kebisingan (dan sensitivitas yang diinginkan dari algoritma)
Topeng ditentukan dengan membandingkan sinyal FFT ke ambang batas
Topeng dihaluskan dengan filter di atas frekuensi dan waktu
Topeng diterapkan pada FFT dari sinyal, dan terbalik
impor ipython dari scipy.io impor wavfileImport scipy.signalimport numpy sebagai npimport matplotlib.pyplot sebagai librosaimport gelombang librosaimport%matplotlib inline
Di sini kami mengimpor perpustakaan seperti Ipython Lib yang digunakan untuk menciptakan lingkungan yang komprehensif untuk komputasi interaktif dan eksplorasi.
Dari perpustakaan Scipy.io digunakan untuk memanipulasi data dan visualisasi data menggunakan berbagai perintah python.
Numpy berisi struktur data array dan matriks multi-dimensi. Ini dapat digunakan untuk melakukan sejumlah operasi matematika pada array seperti rutinitas trigonometri, statistik, dan aljabar dengan demikian merupakan perpustakaan yang sangat berguna.
MATPLOTLIB.PYPLOT Library membantu untuk memahami sejumlah besar data melalui visualisasi yang berbeda.
Librosa digunakan ketika kami bekerja dengan data audio seperti dalam generasi musik (menggunakan LSTM), pengenalan suara otomatis. Ini menyediakan blok bangunan yang diperlukan untuk membuat sistem pengambilan informasi musik.
%matplotlib inline untuk mengaktifkan plot inline, di mana plot/grafik akan ditampilkan tepat di bawah sel tempat perintah plot Anda ditulis. Ini memberikan interaktivitas dengan backend di frontend seperti jupyter notebook.
wav_loc = r '/home/noise_reduction/download/wave/file.wav'rate, data = wavfile.read (wav_loc, mmap = false)
Di sini kami mengambil lokasi jalur file waw dan kemudian membaca file waw itu dengan modul WaveFile yang berasal dari perpustakaan scipy.io . dengan parameter (fileName - string atau buka pegangan file yang merupakan file input wav.) Kemudian (mmap: bool, opsional di mana apakah akan membaca data sebagai memori memetakan (default: false).
def fftnoise (f): f = np.array (f, dtype = "complex") np = (len (f) - 1) // 2phases = np.random.rand (np) * 2 * np.piphases = np .cos (fase) + 1j * np.sin (fase) f [1: np + 1] * = fase [-1: -1 -np: -1] = np.conj (f [1: np + 1] ) return np.fft.ifft (f) .real
Di sini kita pertama -tama mendefinisikan fungsi kebisingan FFT secara singkat, transformasi Fourier cepat (FFT) adalah algoritma yang menghitung transformasi Fourier diskrit (DFT) dari suatu urutan, atau invers (IDFT). Analisis Fourier mengubah sinyal dari domain aslinya (seringkali waktu atau ruang) menjadi representasi dalam domain frekuensi dan sebaliknya. DFT diperoleh dengan menguraikan urutan nilai menjadi komponen frekuensi yang berbeda.
Menggunakan Fast Fourier Transform dan mendefinisikan fungsi kompleks tipe data dan akhirnya menghitung bagian nyata dari fungsi. Dalam hal ini freqencies berkisar antara frekuensi minimum dan frekuensi maks ditetapkan ke 1 dan istirahat yang tidak diinginkan diabaikan.
Memberikan lokasi file
Membaca file WAV
-32767 hingga +32767 adalah audio yang tepat (menjadi simetris) dan 32768 berarti bahwa audio terpotong pada saat itu
WAV-File adalah bilangan bulat 16 bit, kisarannya adalah [-32768, 32767], sehingga dibagi dengan 32768 (2^15) akan memberikan kisaran pelengkap twos yang tepat dari [-1, 1]
def band_limited_noise (min_freq, max_freq, sampel = 1024, samplerate = 1): freqs = np.abs (np.fft.fftfreq (sampel, 1 / samplerate)) f = np.zeros (sampel) f [np.logical_ander (freqs > = min_freq, freqs <= max_freq)] = 1Return fftnoise (f)
Fungsi atau rangkaian waktu yang transformasi Fouriernya terbatas pada rentang frekuensi atau panjang gelombang yang terbatas.
mendefinisikan freq dengan freq standar dengan batas min dan max.
noise_len = 2 # detikSnoise = band_limited_noise (min_freq = 4000, max_freq = 12000, sampel = len (data), samplerate = rate)*10noise_clip = noise [: rate*noise_len] audio_clip_band_limited = data+noise
Blok white noise terbatas pita menentukan spektrum dua sisi, di mana unitnya adalah Hz.
di mana maksimal 12000 dan min freq 4000 dibandingkan dengan noise dan data yang disediakan.
Di sini kita memotong sinyal noise dengan memiliki produk laju dan len dari sinyal noise.
dengan demikian menambahkan kebisingan dan data yang diberikan
Akibatnya, menambahkan noise memperluas ukuran dataset pelatihan.
Noise acak ditambahkan ke variabel input yang membuatnya berbeda setiap kali terpapar pada model.
Menambahkan noise ke sampel input adalah bentuk sederhana dari augmentasi data.
Menambahkan noise berarti bahwa jaringan kurang mampu menghafal sampel pelatihan karena mereka berubah sepanjang waktu,
menghasilkan bobot jaringan yang lebih kecil dan jaringan yang lebih kuat yang memiliki kesalahan generalisasi yang lebih rendah.
Impor Timefrom Datetime Impor TimeDelta sebagai TD
Waktu Impor Modul ini menyediakan berbagai fungsi terkait waktu. Untuk fungsionalitas terkait, lihat juga modul datetime dan kalender. kelas datetime.timedelta
Durasi yang menyatakan perbedaan antara dua tanggal, waktu, atau instance datetime ke resolusi mikrodetik.
def _stft (y, n_fft, hop_length, win_length): return librosa.stft (y = y, n_fft = n_fft, hop_length = hop_length, win_length = win_length)
Transformasi Fourier waktu pendek dapat digunakan untuk mengukur perubahan frekuensi sinyal nonstasioner dan konten fase dari waktu ke waktu.
Panjang hop harus merujuk pada jumlah sampel di antara frame berturut -turut. Untuk analisis sinyal, panjang hop harus kurang dari ukuran bingkai, sehingga frame tumpang tindih.
Parameter ynp.ndarray [bentuk = (n,)], sinyal input bernilai nyata
n_fftint> 0 [Scalar]
Panjang sinyal berjendela setelah bantalan dengan nol. Jumlah baris dalam matriks STFT D adalah (1 + n_fft/2) . Nilai default, n_fft = 2048 sampel, sesuai dengan durasi fisik 93 milidetik pada laju sampel 22050 Hz, yaitu laju sampel default di librosa. Nilai ini diadaptasi dengan baik untuk sinyal musik. Namun, dalam pemrosesan bicara, nilai yang disarankan adalah 512, sesuai dengan 23 milidetik pada laju sampel 22050 Hz. Bagaimanapun, kami merekomendasikan pengaturan N_FFT ke kekuatan dua untuk mengoptimalkan kecepatan algoritma Fast Fourier Transform (FFT).
hop_lengthint> 0 [skalar]
Jumlah sampel audio antara kolom STFT yang berdekatan.
Nilai yang lebih kecil meningkatkan jumlah kolom di D tanpa mempengaruhi resolusi frekuensi STFT.
Jika tidak ditentukan, default ke win_length // 4 (lihat di bawah).
win_lengthint <= n_fft [skalar]
Setiap bingkai audio berjendela berdasarkan jendela panjang win_length dan kemudian diisi dengan nol agar sesuai dengan N_FFT .
Nilai -nilai yang lebih kecil meningkatkan resolusi temporal STFT (yaitu kemampuan untuk membedakan impuls yang berjarak dekat dalam waktu) dengan mengorbankan resolusi frekuensi (yaitu kemampuan untuk membedakan nada murni yang berjarak dekat dengan frekuensi). Efek ini dikenal sebagai trade-off lokalisasi frekuensi waktu dan perlu disesuaikan sesuai dengan sifat-sifat sinyal input y.
Jika tidak ditentukan, default ke win_length = n_fft .
return librosa.istft (y, hop_length, win_length)
Inverse Short-Time Fourier Transform (ISTFT) .Converts Spectrogram yang bernilai kompleks STFT_MATRIX menjadi seri-time y dengan meminimalkan kesalahan kuadrat rata-rata antara STFT_MATRIX dan STFT Y seperti yang dijelaskan dalam
Secara umum, fungsi jendela, panjang lompatan dan parameter lainnya harus sama seperti di STFT, yang sebagian besar mengarah pada rekonstruksi sinyal yang sempurna dari STFT_MATRIX yang tidak dimodifikasi.
def _amp_to_db (x): return librosa.core.amplitude_to_db (x, ref = 1.0, amin = 1e-20, top_db = 80.0)
1. Konversi spektrogram amplitudo ke spektrogram-skala DB. Ini setara dengan power_to_db (s ** 2), tetapi disediakan untuk kenyamanan.
return librosa.core.db_to_amplitude (x, ref = 1.0)
Konversi spektrogram skala DB ke spektrogram amplitudo.
Ini secara efektif membalikkan amplitude_to_db:
db_to_amplitude (s_db) ~ = 10.0 (0.5* (s_db + log10 (ref)/10)) **
def plot_spectrogram (sinyal, judul): gbr, ax = plt.subplots (figsize = (20, 4)) cax = ax.matshow (sinyal, asal = "lebih rendah", aspek = "auto", cmap = plt.cm. seismik, vmin = -1 * np.max (np.abs (sinyal)), vmax = np.max (np.abs (sinyal)), )
Plot spectogram dengan sinyal sebagai input.
Kelas Axes berisi sebagian besar elemen gambar: sumbu, centang, line2d, teks, poligon, dll., Dan mengatur sistem koordinat.
Ini menyediakan beberapa peta warna di matplotlib yang dapat diakses melalui fungsi ini .o Temukan representasi yang baik di ruang warna 3D untuk kumpulan data Anda.
fig.colorbar (cax) ax.set_title (judul)
Cara terbaik untuk melihat apa yang terjadi, adalah dengan menambahkan colorbar (plt.colorbar (), setelah membuat plot pencar). Anda akan mencatat bahwa nilai keluar Anda antara 0 dan 10000 semuanya berada di bawah bagian terendah dari bar, di mana semuanya berwarna hijau yang sangat ringan.
Secara umum, nilai di bawah Vmin akan diwarnai dengan warna terendah, dan nilai di atas Vmax akan mendapatkan warna tertinggi.
Jika Anda mengatur Vmax lebih kecil dari Vmin, secara internal mereka akan ditukar. Meskipun, tergantung pada versi yang tepat dari Matplotlib dan fungsi yang tepat yang disebut, Matplotlib mungkin memberikan peringatan kesalahan. Jadi, sebaiknya mengatur Vmin selalu lebih rendah dari Vmax.
def plot_statistics_and_filter( mean_freq_noise, std_freq_noise, noise_thresh, smoothing_filter): fig, ax = plt.subplots(ncols=2, figsize=(20, 4))plt_std, = ax[0].plot(std_freq_noise, label="Std. power kebisingan ") plt_std, = ax [0] .plot (noise_thresh, label = "noise threshold (dengan frekuensi)") ax [0] .set_title ("ambang batas untuk mask") AX [0] .LEGEND () CAX = AX [1] .MATSHOW (smoothing_filter, asal = "lebih rendah") gbr.colorbar (cax) ax [1] .set_title ("Filter untuk Smoothing Mask")
Plot statistik dasar pengurangan kebisingan.
Rasio Signal-to-Noise (SNR atau S/N) adalah ukuran yang digunakan dalam sains dan teknik yang membandingkan tingkat sinyal yang diinginkan dengan tingkat kebisingan latar belakang.
SNR didefinisikan sebagai rasio daya sinyal terhadap daya noise, sering dinyatakan dalam desibel.
Rasio lebih tinggi dari 1: 1 (lebih besar dari 0 dB) menunjukkan lebih banyak sinyal daripada noise.
Menyiapkan frekuensi ambang untuk menutupi noise.
Ambang masking mengacu pada proses di mana satu suara dianggap tidak terdengar karena adanya suara lain.
Jadi ambang masking adalah tingkat tekanan suara dari suara yang diperlukan untuk membuat suara terdengar di hadapan kebisingan lain yang disebut "masker"
dengan demikian menambahkan ambang batas.
Sinyal noise blur dengan berbagai filter low pass
Terapkan filter buatan khusus untuk gambar (konvolusi 2D)
Def removenoise ( # ke rata-rata sinyal (tegangan) dari bagian-lereng positif (rise) dari gelombang segitiga untuk mencoba menghilangkan sebanyak mungkin noise. Audio_clip, # klip ini adalah parameter yang digunakan di mana kami akan melakukan masing-masing masing-masing Operasi noise_clip, n_grad_freq = 2, # berapa banyak saluran frekuensi yang harus dihaluskan dengan mask.n_grad_time = 4, # berapa banyak saluran waktu yang harus diperhalus dengan mask.n_fft = 2048, # angka audio bingkai antara kolom stft.win_length = 2048 2048, # Setiap bingkai audio berjendela oleh `window ()`. n_std_thresh = 1.5, # berapa banyak standar deviasi yang lebih keras dari rata -rata db noise (pada setiap level frekuensi) dianggap sinyalprop_decrease = 1.0, # ke sejauh mana Anda harus mengurangi noise (1 = semua, 0 = tidak ada) verbose = false , # flag memungkinkan Anda untuk menulis ekspresi reguler yang terlihat presentableVisual = false, # Apakah untuk memplot langkah -langkah algoritma):
Def removenoise ( untuk rata-rata sinyal (tegangan) dari bagian-lereng positif (rise) dari gelombang segitiga untuk mencoba menghilangkan kebisingan sebanyak mungkin.
audio_clip,
Klip ini adalah parameter yang digunakan di mana kami akan melakukan operasi masing -masing
noise_clip, n_grad_freq = 2 Berapa banyak saluran frekuensi yang harus dihaluskan dengan topeng.
N_GRAD_TIME = 4, berapa banyak saluran waktu untuk menghaluskan dengan topeng.
n_fft = 2048
Nomor audio frame antara kolom STFT.
win_length = 2048, setiap bingkai audio berjendela oleh window()
. Jendela akan panjangnya win_length
dan kemudian empuk dengan nol untuk mencocokkan n_fft
..
hop_length = 512, angka audio frame antara kolom STFT.
n_std_thresh = 1.5 Berapa banyak standar deviasi yang lebih keras dari rata -rata db noise (pada setiap tingkat frekuensi) untuk dianggap sebagai sinyal
prop_decrease = 1.0, sejauh mana Anda harus mengurangi noise (1 = semua, 0 = tidak ada)
verbose = false,
Bendera memungkinkan Anda untuk menulis ekspresi reguler yang terlihat rapi visual = false, #Apakah untuk memplot langkah -langkah algoritma):
noise_stft = _stft (noise_clip, n_fft, hop_length, win_length) noise_stft_db = _amp_to_db (np.abs (noise_stft)))
Stft over noise
Konversi ke DB
rata -rata_freq_noise = np.mean (noise_stft_db, axis = 1) std_freq_noise = np.std (noise_stft_db, axis = 1) noise_thresh = mean_freq_noise + std_freq_noise * n_std_thresh
Hitung statistik atas kebisingan
Di sini kita untuk noise thresh kita menambahkan rata -rata dan noise standar dan noise n_std.
sig_stft = _stft (audio_clip, n_fft, hop_length, win_length) sig_stft_db = _amp_to_db (np.abs (sig_stft)))
STFT Over Sinyal
mask_gain_db = np.min (_amp_to_db (np.abs (sig_stft))))
Hitung nilai untuk menutupi db
smoothing_filter = np.outer (np.concatenate ( [np.linspace (0, 1, n_grad_freq + 1, endpoint = false), np.linspace (1, 0, n_grad_freq + 2), ] ) [1: -1], np.concatenate ( [np.linspace (0, 1, n_grad_time + 1, endpoint = false), np.linspace (1, 0, n_grad_time + 2), ] ) [1: -1], ) smoothing_filter = smoothing_filter / np.sum (smoothing_filter)
Buat filter perataan untuk topeng dalam waktu dan frekuensi
db_thresh = np.repeat (np.reshape (noise_thresh, [1, len (mean_freq_noise)]), np.shape (sig_stft_db) [1], axis = 0, ).T
Hitung ambang batas untuk setiap nampan frekuensi/waktu
sig_mask = sig_stft_db <db_thresh
Topeng untuk sinyal
sig_mask = scipy.signal.fftconvolve (sig_mask, smoothing_filter, mode = "sama") sig_mask = sig_mask * prop_decrease
Konvolusi topeng dengan filter smoothning
# Topeng Signalsig_stft_db_masked = (sig_stft_db * (1 - sig_mask)+ np.ones (np.shape (mask_gain_db)) * mask_gain_db * sig_mask) # 1MMAG_MAG_MAG_MASKED = np.imag _to_amp (sig_stft_db_masked) * np.sign (sig_stft)) + (1j * sig_imag_masked)
Topeng sinyal
# Pulihkan sinyalrecovered_signal = _istft (sig_stft_amp, hop_length, win_length) pulih_spec = _amp_to_db (np.abs (_stft (pulih_signal, n_fft, hop_length, win_length))) )
memulihkan sinyal
Jadi terapkan mask jika sinyal berada di atas ambang batas
Convolve the Mask dengan filter smoothing
Menerapkan algorithum reduksi noise untuk file WAV yang sudah diunduh.
Menerapkan FFT melalui perekaman langsung dari sinyal audio.
Implementasi AI yang lebih dalam untuk pembatalan kebisingan.
Menerapkan algorithum reduksi noise untuk berbagai format file audio.
Sinyal audio langsung dengan mikrofon dan ESP32 dan dengan demikian akan mendapatkan file WAV untuk perhitungan lebih lanjut dan pemrosesan sinyal.
Dhriti Mabian
Priyal Awankar
*SRA VJTI_EKLAVYA 2021
Shreyas Atre
Shah yang keras
Kenekatan
Metode pembatalan kebisingan
Mengambil boilerplate dari Martin Heinz
Tim Sainburg
Lisensi