Introduzione all’Apprendimento Automatico Audio

Introduzione all'Apprendimento Automatico Audio' (Introduction to Audio Machine Learning)

Attualmente sto sviluppando un sistema di riconoscimento vocale audio, quindi ho avuto bisogno di rinfrescare le mie conoscenze sulle basi relative ad esso. Questo articolo è il risultato di ciò.

Introduzione all’audio

Indice

  1. Introduzione

Suono —

  • Il suono è un segnale continuo e ha valori di segnale infiniti
  • I dispositivi digitali richiedono array finiti e quindi è necessario convertirli in una serie di valori discreti
  • AKA Rappresentazione digitale
  • Potenza del suono — Tasso di trasferimento dell’energia (Watt)
  • Intensità del suono — Potenza del suono per unità di area (Watt/m**2)

Formati file audio —

  1. .wav
  2. .flac (free lossless audio codec)
  3. .mp3

I formati dei file si differenziano per il modo in cui comprimono la rappresentazione digitale del segnale audio

Passaggi di conversione —

  • Il microfono cattura un segnale analogico.
  • L’onda sonora viene quindi convertita in un segnale elettrico.
  • Questo segnale elettrico viene quindi digitalizzato da un convertitore analogico-digitale.

Campionamento

  • È il processo di misurazione del valore di un segnale a intervalli di tempo fissi
  • Una volta campionato, la forma d’onda campionata è in un formato discreto
Immagine di Author
Immagine di Author

Frequenza di campionamento

  • Numero di campioni presi al secondo
  • ad esempio, se vengono presi 1000 campioni al secondo, allora la frequenza di campionamento (SR) = 1000
  • UNA FREQUENZA DI CAMPIONAMENTO PIÙ ALTA -> MIGLIORE QUALITÀ AUDIO
Immagine di Author

Considerazioni sulla frequenza di campionamento

  • Frequenza di campionamento = (Frequenza più alta che può essere catturata da un segnale) * 2
  • Per l’orecchio umano, la frequenza udibile è di 8 KHz, quindi possiamo dire che la frequenza di campionamento (SR) è di 16 KHz
  • Anche se una frequenza di campionamento più alta offre una migliore qualità audio, non significa che dovremmo continuare ad aumentarla.
  • Dopo la linea richiesta, non aggiunge alcuna informazione e aumenta solo il costo di calcolo
  • Inoltre, una bassa frequenza di campionamento può causare una perdita di informazioni

Punti da ricordare —

  • Mentre si addestrano tutti i campioni audio ad avere la stessa frequenza di campionamento
  • Se si utilizza un modello pre-addestrato, il campione audio deve essere campionato nuovamente per corrispondere alla frequenza di campionamento (SR) dei dati audio su cui è stato addestrato il modello
  • Se vengono utilizzati dati con frequenze di campionamento diverse, allora il modello non si generalizza bene

Ampiezza —

  • Il suono è prodotto da una variazione nella pressione dell’aria a frequenze udibili dall’orecchio umano
  • Ampiezza — livello di pressione sonora in quel momento misurato in dB (decibel)
  • L’ampiezza è una misura dell’intensità

Profondità di bit —

  • Descrive quanto precisione può essere descritta
  • Quanto più alta è la profondità di bit, tanto più simile la rappresentazione digitale somiglierà all’onda sonora continua originale
  • Valori comuni della profondità di bit sono 16 bit e 24 bit

Quantizzazione —

Inizialmente, l’audio è in forma continua, ovvero un’onda regolare. Per memorizzarlo digitalmente, è necessario suddividerlo in piccoli passaggi; eseguiamo la quantizzazione per fare ciò.

Immagine di Author

Puoi dire che la profondità di bit è il numero di passaggi necessari per rappresentare l’audio

  • L’audio a 16 bit richiede — 65536 passaggi
  • L’audio a 24 bit richiede — 16777216 passaggi
  • Questa quantizzazione induce rumore, quindi è preferibile una profondità di bit elevata
  • Anche se questo rumore non è un problema
  • L’audio a 16 e 24 bit viene memorizzato in campioni int, mentre i campioni audio a 32 bit vengono memorizzati come punti decimali
  • Il modello richiede punti decimali, quindi dobbiamo convertire quest’audio in punti decimali prima di addestrare il modello

Implementazione —

#carica la libreriaimport librosa

#la funzione load di librosa restituisce l'array audio e il tasso di campionamentoaudio, tasso_di_campionamento = librosa.load(librosa.ex('pistachio'))

import matplotlib.pyplot as pltplt.figure().set_figwidth(12)librosa.display.waveshow(audio,sr = tasso_di_campionamento)
Immagine di Author
  • l’ampiezza è stata tracciata sull’asse y e il tempo sull’asse x
  • varia nell’intervallo [-1.0, 1.0] — già un numero decimale
print(len(audio))print(tasso_di_campionamento/1e3)>>1560384>>22.05

## Spettro di frequenzaimport numpy as np# invece di concentrarsi su ogni valore discreto vediamo solo i primi 4096 valoriinput_data = audio[:4096]# DFT = trasformata di Fourier discreta# questo spettro di frequenza viene tracciato utilizzando DFTfinestra = np.hanning(len(input_data))finestra>>array([0.00000000e+00, 5.88561497e-07, 2.35424460e-06, ...,       2.35424460e-06, 5.88561497e-07, 0.00000000e+00])

dft_input = input_data * finestra

figura = plt.figure(figsize = (15,5))plt.subplot(131)plt.plot(input_data)plt.title('input')plt.subplot(132)plt.plot(finestra)plt.title('finestra di Hanning')plt.subplot(133)plt.plot(dft_input)plt.title('dft_input')# viene generato un grafico simile per ogni istanza
Immagine di Author

Trasformata di Frequenza Discreta = DFT

  • Saresti d’accordo con me se dicessi che fino ad ora abbiamo avuto dati di segnale discreti?
  • Se lo sei, allora puoi capire che fino ad ora avevamo i dati nel dominio del tempo, e adesso vogliamo convertirli nel dominio delle frequenze. Ecco perché il signor DFT è qui per aiutare
# calcola la dft - trasformata discreta di Fourierdft = np.fft.rfft(dft_input)plt.plot(dft)
Immagine dell'autore
# ampiezza ampiezza = np.abs(dft)# convertila in dBampiezza_dB = librosa.amplitude_to_db(ampiezza,ref = np.max)# a volte le persone vogliono usare lo spettro di potenza -> A**2

Perché prendere il valore assoluto?

Quando abbiamo preso l’ampiezza, abbiamo applicato la funzione abs, il motivo è il numero complesso

  • l’output restituito dopo la trasformata di Fourier è in forma complessa, e prendere il valore assoluto ci ha dato la magnitudine, quindi il valore assoluto.
print(len(ampiezza))print(len(dft_input))print(len(dft))>>2049>>4096>>2049

Perché l’array aggiornato (metà+1) dell’array originale?

Quando la DFT viene calcolata per un input puramente reale, l’output è simmetrico di Hermitian, cioè i termini a frequenza negativa sono semplicemente i complessi coniugati dei corrispondenti termini a frequenza positiva, e i termini a frequenza negativa sono quindi ridondanti. Questa funzione non calcola i termini a frequenza negativa, e la lunghezza dell’asse trasformato dell’output è quindi n//2 + 1. [fonte – documentazione]

# frequenzafrequenza = librosa.fft_frequencies(n_fft=len(input_data),sr = sampling_rate)

plt.figure().set_figwidth(12)plt.plot(frequenza, ampiezza_dB)plt.xlabel("Frequenza (Hz)")plt.ylabel("Ampiezza (dB)")plt.xscale("log")
Immagine dell'autore
  • Come detto in precedenza, dominio del tempo -> dominio delle frequenze
  • Il dominio delle frequenze è solitamente rappresentato su una scala logaritmica

Spettrogrammi —

  • mostra come la frequenza cambia rispetto al tempo
  • L’algoritmo che esegue questa trasformazione è il soft = trasformata tempo-frequenza a breve termine

Come creare uno spettrogramma —

  • gli spettrogrammi sono una pila di trasformate di frequenza, come? vediamolo
  • Per un determinato audio, prendiamo piccoli segmenti e ne troviamo lo spettro in frequenza. Dopo di che, li impiliamo lungo l’asse del tempo. Il diagramma risultante è uno spettrogramma
  • librosa.stft suddivide di default in 2048 segmenti

Spettro di Frequenza —

  • Rappresenta l’ampiezza di diverse frequenze in un singolo istante di tempo.
  • Lo spettro di frequenza è più adatto per capire le componenti di frequenza presenti in un segnale in un istante specifico. Entrambe le rappresentazioni sono strumenti preziosi per comprendere le caratteristiche dei segnali nel dominio delle frequenze.
  • AMPITUDINE vs. FREQUENZA

Spettrogramma —

  • Rappresenta i cambiamenti nel contenuto di frequenza nel tempo suddividendo il segnale in segmenti e tracciando i loro spettri di frequenza nel tempo.
  • Lo spettrogramma è particolarmente utile per analizzare e visualizzare segnali che variano nel tempo, come segnali audio o dati di serie temporali, poiché fornisce informazioni su come le componenti di frequenza si evolvono durante diversi intervalli di tempo.
  • FREQUENZA vs. TEMPO
spectogram = librosa.stft(audio)
spectogram_to_dB = librosa.amplitude_to_db(np.abs(spectogram), ref=np.max)

plt.figure().set_figwidth(12)
librosa.display.specshow(spectogram_to_dB, x_axis="time", y_axis="hz")
plt.colorbar()
Immagine di Autore

Spettrogrammi Mel —

  • Lo spettrogramma su diverse scale di frequenza.

Prima di procedere, bisogna ricordare che.

  • Alle frequenze inferiori, gli esseri umani sono più sensibili ai cambiamenti audio rispetto alle frequenze superiori
  • Questa sensibilità cambia in modo logaritmico con un aumento della frequenza
  • Quindi in termini più semplici, uno spettrogramma Mel è una versione compressa dello spettrogramma.
MelSpectogram = librosa.feature.melspectrogram(y=audio, sr=sampling_rate, n_mels=128, fmax=8000)
MelSpectogram_dB = librosa.power_to_db(MelSpectogram, ref=np.max)
plt.figure().set_figwidth(12)
librosa.display.specshow(MelSpectogram_dB, x_axis="time", y_axis="mel", sr=sampling_rate, fmax=8000)
plt.colorbar()
Immagine di Autore
  • L’esempio sopra utilizza librosa.power_to_db() poiché librosa.feature.melspectrogram() viene utilizzato per creare uno spettrogramma di potenza.

Conclusione —

Lo spettrogramma Mel aiuta a catturare caratteristiche più significative rispetto allo spettrogramma normale ed è quindi popolare.

Riferimento

Huggingface

Personal Kaggle Kernel (per la tua pratica)

Social —

LinkedIn

Kaggle

Se ti è piaciuto l’articolo, non dimenticare di apprezzarlo con un applauso. Ci vediamo nel prossimo notebook, in cui vedremo come caricare e riprodurre i dati audio.