Salta ai contenuti

Spettrogrammi e rappresentazioni tempo-frequenza

Spezzare un segnale in finestre brevi e fare una trasformata di Fourier per ciascuna trasforma il suono in un’immagine: tempo in orizzontale, frequenza in verticale, energia nel colore. È questa immagine — e specialmente la sua versione mel — che entra in quasi ogni modello di speech, TTS e audio generativo, ed è il ponte che porta l’audio dentro l’ecosistema, molto più maturo, dei modelli per immagini.

Registra un secondo di parlato a 16000 campioni al secondo e ti ritrovi con 16000 numeri. Disegnali come forma d’onda e vedrai uno scarabocchio che oscilla.

Due parole completamente diverse, “sì” e “no”, producono tracciati che a occhio nudo sono entrambi un groviglio indistinto. La forma d’onda contiene tutta l’informazione, ma in una forma che né l’occhio umano né, a lungo, le macchine sono riusciti a sfruttare bene.

Lo spettrogramma cambia la lente. Prende quella sequenza illeggibile e la dispone come un’immagine in cui la struttura del suono diventa visibile: il tempo scorre da sinistra a destra, le frequenze si impilano dal basso verso l’alto, e il colore dice quanta energia c’è a ciascuna frequenza in ciascun istante.

Improvvisamente le vocali appaiono come bande orizzontali, le consonanti come schizzi verticali, una melodia come una scaletta di righe. Il suono è diventato leggibile.

Per chi costruisce sistemi AI questo non è un dettaglio da corso di elaborazione dei segnali: è la porta d’ingresso. Whisper non vede la forma d’onda, vede uno spettrogramma. I modelli di sintesi vocale non producono direttamente un’onda, producono uno spettrogramma e poi lo convertono. I modelli musicali lavorano su rappresentazioni tempo-frequenza o su token che ne derivano.

E c’è una ragione strategica sotto a tutto questo: una volta che il suono è un’immagine, tutto l’armamentario della computer vision — strati convoluzionali, encoder pensati per le immagini — si riusa quasi pari pari. Capire come si costruisce uno spettrogramma significa capire letteralmente cosa entra in input a quei modelli, e quali manopole ne governano i limiti.

Nel 1941, nei laboratori della Bell Telephone, comincia a funzionare un prototipo rudimentale di una macchina che farà epoca: il sound spectrograph (analizzatore di spettro sonoro, poi noto come sonografo). L’idea, dovuta in larga parte a Ralph Potter (ingegnere alla Bell Labs), era far vedere il parlato: produrre un tracciato visivo che l’occhio potesse interpretare.

La ricerca si intensifica durante la Seconda guerra mondiale, spinta anche da un’esigenza militare — l’idea che si potessero identificare le voci dei radiotrasmettitori nemici dai loro spettrogrammi. La macchina viene resa pubblica nel 1946, con una serie di articoli sul Journal of the Acoustical Society of America.

Nel 1947 Potter, insieme a George Kopp e Harriet Green Kopp, pubblica il libro che diffonde l’invenzione: Visible Speech (Voce visibile, D. Van Nostrand). Il sonografo era una macchina elettromeccanica che produceva un tracciato del suono in tre dimensioni — frequenza, intensità, tempo — su carta sensibile.

Tra gli usi immaginati c’era aiutare le persone sorde a “leggere” il parlato e a controllare la propria voce con un feedback visivo. Da quel tracciato nasce anche la fonetica acustica moderna: lo spettrogramma rese le formanti (i picchi di risonanza del tratto vocale che distinguono una vocale da un’altra) visibili e misurabili per la prima volta.

Lo strumento esce presto dalla fonetica e diventa centrale in bioacustica: per studiare il canto degli uccelli — dove ogni specie lascia una “firma” spettrografica riconoscibile — e i fischi modulati dei cetacei.

È, a tutti gli effetti, lo strumento principe per chiunque debba guardare un suono invece di ascoltarlo. E quella stessa intuizione — rendere il suono un’immagine da ispezionare con l’occhio — è ciò che, decenni dopo, permetterà di darlo in pasto a modelli nati per le immagini.

Nella mappa di questa Parte, il capitolo siede subito dopo Fourier, che ha introdotto la trasformata, il principio di indeterminazione tempo-frequenza e — in forma compatta — la Short-Time Fourier Transform (STFT) e lo spettrogramma stesso. Quel capitolo ha posato le fondamenta; questo costruisce sopra.

Qui lo spettrogramma smette di essere un’idea introdotta di passaggio e diventa l’oggetto centrale: come si costruisce davvero, quali scelte di progetto lo governano, perché la sua versione mel è diventata lo standard per l’audio in machine learning, e come si chiude il cerchio che riporta da un’immagine spettrale a un suono.

Questo capitolo presuppone la lettura di Fourier: vedere frequenze invece di tempo, dove sono già spiegati: la trasformata di Fourier, la DFT, la FFT come algoritmo veloce, lo spectral leakage, le finestre di Hann e Hamming, e il principio di indeterminazione di Heisenberg-Gabor. Qui li richiamiamo senza ri-derivarli.

Lo spettrogramma si afferra bene da tre angoli complementari. Il primo è statico — lo spettrogramma come immagine, come oggetto già fatto che si impara a leggere. Il secondo è dinamico — lo spettrogramma come film della trasformata, come processo che lo costruisce un fotogramma alla volta. Il terzo è strutturale e fa da ponte verso il machine learning — lo spettrogramma come tabella di “quanto il suono somiglia, istante per istante, a ciascuna frequenza”.

Tieni tutti e tre: il primo serve a interpretarlo, il secondo a capire da dove vengono le sue proprietà e i suoi difetti, il terzo a capire perché un modello ci si trova così a suo agio.

Primo angolo: lo spettrogramma è un’immagine, e si legge

Sezione intitolata “Primo angolo: lo spettrogramma è un’immagine, e si legge”

Immagina uno spartito musicale, ma generato automaticamente da qualsiasi suono, non solo dalla musica scritta.

Sull’asse orizzontale scorre il tempo. Sull’asse verticale ci sono le frequenze, dalle gravi in basso alle acute in alto. E in ogni punto del piano, un colore dice quanta energia ha quella frequenza in quell’istante: scuro dove il suono è debole o assente, acceso (giallo, rosso, bianco) dove è forte.

Questo è lo spettrogramma. Tecnicamente è una matrice: ogni colonna è un istante, ogni riga è una banda di frequenza, e il numero in ogni cella è l’energia.

Disegnata con una mappa di colore, quella matrice è un’immagine vera e propria — ha larghezza (quanti istanti), altezza (quante bande di frequenza) e una “luminosità” per pixel (l’energia). Non è una metafora: è letteralmente un’immagine in scala di colore, e più avanti vedremo che questo fatto, apparentemente innocuo, è ciò che ha cambiato il modo di costruire i modelli audio.

Una volta capito l’asse, lo spettrogramma si legge come una mappa. Quattro forme ricorrono di continuo:

  • Bande orizzontali che persistono nel tempo sono toni stabili: una vocale tenuta, una nota di violino, il ronzio di un trasformatore. La frequenza non cambia, quindi la riga resta accesa.
  • Strisce verticali sono transienti a banda larga: un colpo secco, un battito di mani, una consonante esplosiva come la /t/ o la /p/. Durano un istante ma contengono tutte le frequenze insieme, quindi accendono una colonna intera.
  • Linee oblique sono frequenze che salgono o scendono: una sirena, un glissando di pianoforte, il fischio modulato di un delfino.
  • Pettini di righe equispaziate sono suoni armonici: la voce, gli strumenti intonati. C’è una frequenza fondamentale e poi i suoi multipli interi (le armoniche), che disegnano una scala di righe parallele.

Secondo angolo: lo spettrogramma è un film della trasformata

Sezione intitolata “Secondo angolo: lo spettrogramma è un film della trasformata”

La trasformata di Fourier vista nel capitolo precedente ha un limite vistoso: ti dice quali frequenze ci sono nel segnale, ma non quando. Per una sinusoide eterna va benissimo. Per il parlato — dove le frequenze cambiano di continuo, vocale dopo vocale, consonante dopo consonante — sapere che “nella frase c’è un po’ di tutto” è inutile: ti serve sapere a che istante entra ciascun suono.

La risposta è non trasformare tutto il segnale in un colpo solo, ma spezzarlo in tante finestre brevi e trasformare ciascuna separatamente. È come passare da una singola fotografia a lunghissima esposizione (che mescola tutto il movimento in una macchia) a un film fatto di tanti fotogrammi brevi, ciascuno nitido sul suo istante.

Ogni finestra produce uno spettro — quali frequenze ci sono in quel breve tratto — e affiancando tutti questi spettri uno accanto all’altro si ottiene lo spettrogramma. È questa, esattamente, la Short-Time Fourier Transform introdotta in Fourier: “short-time” perché ogni trasformata guarda solo un breve tratto di tempo.

L’assunzione che la trasformata classica faceva su tutto il segnale — che sia “sempre uguale a se stesso” — non viene eliminata, viene ridimensionata: si chiede solo che il segnale sia abbastanza costante dentro ciascuna finestra breve, non sull’intera registrazione.

Una vocale dura qualche centinaio di millisecondi; una finestra da 25 millisecondi ci sta comodamente dentro, e in quel tratto le frequenze sono effettivamente quasi stabili. È il compromesso che rende la STFT utile sul parlato: abbastanza corta da cogliere il cambiamento, abbastanza lunga da misurare le frequenze.

Questo secondo angolo è quello da cui discendono tutte le proprietà interessanti dello spettrogramma. La lunghezza della finestra, di quanto le finestre si sovrappongono, che forma hanno: ognuna di queste scelte lascia una traccia nell’immagine finale, e capire il processo è l’unico modo per capire perché due spettrogrammi dello stesso suono possono avere aspetti diversi.

C’è un terzo modo di leggere lo spettrogramma, ed è quello che spiega perché le reti neurali ci lavorano così bene.

In Fourier abbiamo visto che ogni coefficiente della trasformata è, in realtà, una misura di quanto il segnale somiglia a una certa sinusoide — un prodotto scalare, la stessa operazione di proiezione e somiglianza della Parte IV: si moltiplica il segnale per la sinusoide punto per punto e si somma. Se il segnale contiene quella frequenza, i due “vanno a tempo” e la somma è grande; se non la contiene, le parti positive e negative si cancellano e la somma è quasi zero.

Lo spettrogramma fa questo confronto in modo localizzato. Ogni cella (k,m)(k, m) misura quanto il suono, nella finestra m, somiglia alla sinusoide di frequenza kk.

Letta così, la matrice non è solo un’immagine: è una tabella di risposte alla domanda “quanto di questa frequenza c’è qui?”, ripetuta per ogni frequenza e per ogni istante. È una rappresentazione fatta di confronti con un dizionario di pattern elementari — le sinusoidi pure — disposti su una griglia regolare.

Questo angolo conta perché è esattamente il tipo di struttura che una rete sa sfruttare. Una rete convoluzionale, sul piano tempo-frequenza, impara filtri che cercano pattern locali in quella tabella di somiglianze: una formante che si sposta, un transiente, un pettine armonico.

Lo spettrogramma offre già la materia prima nella forma giusta — somiglianze a frequenze fisse, disposte su una griglia regolare — e alla rete resta da combinarle in pattern più astratti. È il filo che, alla fine del capitolo, collega la STFT alle architetture visive riusate sull’audio.

Costruire uno spettrogramma è una sequenza fissa di operazioni. Partiamo da un segnale campionato x[n]x[n] — la sequenza di numeri uscita dal campionamento — e arriviamo alla matrice.

Passo 1 — framing. Spezza il segnale in frame (blocchi) di NN campioni ciascuno. NN è la dimensione della finestra (in inglese win_length, spesso uguale a n_fft, il numero di punti su cui si fa la FFT). Un valore tipico per il parlato è NN pari a 25 millisecondi di audio: a 16 kHz sono 400 campioni.

Passo 2 — overlap e hop. I frame non sono affiancati senza toccarsi: si sovrappongono. Lo spostamento tra l’inizio di un frame e l’inizio del successivo è l’hop size (hop_length), e la sovrapposizione è overlap=Nhop\text{overlap} = N - \text{hop}.

Un hop pari a un quarto della finestra significa 75% di overlap; pari a metà, 50%. Whisper, per esempio, usa finestre da 25 ms con un hop di 10 ms.

Passo 3 — windowing. Ogni frame viene moltiplicato per una funzione finestra che va dolcemente a zero ai bordi — tipicamente una finestra di Hann o di Hamming.

Questo passo, e il perché serve, sono già stati spiegati in Fourier: senza finestratura, i bordi tagliati netti di ogni frame iniettano frequenze spurie nello spettro (lo spectral leakage), e l’immagine si “sporca” di code orizzontali che il suono non aveva.

Passo 4 — FFT per frame. Su ogni frame finestrato si calcola la FFT (l’algoritmo veloce per la DFT, vedi capitolo precedente). Per un segnale reale di NN campioni questo produce N/2+1N/2 + 1 coefficienti complessi, uno per ogni bin di frequenza.

Passo 5 — modulo. Di ogni coefficiente complesso si prende il modulo X[k,m]|X[k, m]| — l’ampiezza — scartando la fase (l’angolo). La fase, come vedremo nella sezione “Dove si rompe”, non è irrilevante: è ciò che rende lo spettrogramma non direttamente invertibile.

Passo 6 — stacking. Ogni frame ha prodotto una colonna di valori (un’ampiezza per bin di frequenza). Affiancate nell’ordine temporale, queste colonne formano la matrice. In simboli, lo spettrogramma è

S[k,m]=STFT=n=0N1x[n+mhop]w[n]ei2πkn/NS[k, m] = \big|\, \text{STFT}\,\big| = \left| \sum_{n=0}^{N-1} x[n + m \cdot \text{hop}] \, w[n] \, e^{-i\, 2\pi k n / N} \right|

In parole povere: per la colonna mm (il frame che parte al campione mhopm \cdot \text{hop}) e la riga kk (la kk-esima frequenza), prendi i campioni di quel frame, moltiplicali per la finestra w[n]w[n], fai la loro DFT e prendi il modulo del coefficiente kk.

È la DFT del capitolo precedente, applicata frame per frame invece che a tutto il segnale, con la finestra incorporata. L’unica novità rispetto a Fourier è l’indice mm, il tempo: non c’è più un solo spettro per tutto il segnale, ma uno spettro per finestra, e l’insieme di questi spettri affiancati è lo spettrogramma.

A che frequenza e a che istante corrisponde la cella?

Sezione intitolata “A che frequenza e a che istante corrisponde la cella?”

La matrice ha indici astratti, ma ogni cella corrisponde a una frequenza e a un istante fisici precisi. Se la frequenza di campionamento è fsf_s (campioni al secondo) e la finestra ha NN campioni, la riga kk corrisponde alla frequenza

fk=kfsNf_k = k \cdot \frac{f_s}{N}

esattamente come per la DFT del capitolo precedente. Le righe sono spaziate uniformemente di fs/Nf_s/N Hz, dalla frequenza zero fino alla frequenza di Nyquist fs/2f_s/2.

La colonna mm, invece, corrisponde all’istante tm=mhop/fst_m = m \cdot \text{hop} / f_s secondi: le colonne sono spaziate dell’intervallo di hop. Tienili distinti, perché governano due cose diverse: la risoluzione verticale (quanto fini sono le frequenze) dipende dalla finestra, la densità orizzontale (quanto fitti sono gli istanti) dipende dall’hop.

Qui ricompare, in forma operativa, il principio di indeterminazione tempo-frequenza di Heisenberg-Gabor visto in Fourier. La dimensione della finestra è il modo in cui spendi un budget fissato dalla matematica, e non puoi imbrogliare.

Una finestra lunga contiene molti campioni: la sua FFT ha tanti bin fitti, quindi ottima risoluzione in frequenza — distingue due toni vicini, separa le armoniche. Ma abbraccia un lungo tratto di tempo, quindi cattiva risoluzione temporale: non sai con precisione quando una frequenza è comparsa, perché potrebbe essere comparsa in qualsiasi punto di quel lungo tratto.

Una finestra corta è l’opposto: pochi campioni, pochi bin radi (frequenze sfocate), ma ottima localizzazione nel tempo — vedi nitidamente il singolo transiente.

In numeri, la risoluzione in frequenza è circa fs/Nf_s/N e quella in tempo è circa N/fsN/f_s: aumentare NN migliora la prima e peggiora la seconda, e il loro prodotto resta sotto un limite invalicabile. Non è un difetto della STFT o un limite degli strumenti: è il principio di indeterminazione, e vale per qualunque modo di guardare insieme tempo e frequenza.

Una conseguenza pratica netta: per analizzare la melodia di un basso (frequenze gravi, vicine, che cambiano lentamente) conviene una finestra lunga; per cogliere la precisione ritmica di una batteria (transienti rapidi) conviene una finestra corta.

Lo stesso brano, due spettrogrammi, due verità parziali. È il motivo per cui i software di analisi audio espongono la dimensione della finestra come parametro centrale, e non esiste un valore “giusto” indipendente da cosa vuoi vedere.

C’è un equivoco comune: che aumentare l’overlap migliori il trade-off tempo-frequenza. Non è così. Il trade-off è fissato dalla dimensione della finestra; l’overlap non lo tocca.

L’hop serve ad altre tre cose. Primo, rende fluida la rappresentazione temporale: più colonne significano più “fotogrammi” del film, una transizione più morbida invece di salti a scatti. Secondo, evita di perdere transienti che cadrebbero esattamente a cavallo tra due finestre disgiunte: con overlap, ogni istante è coperto da più finestre. Terzo, abilita la ricostruzione: per ri-sintetizzare il segnale dalle finestre (l’operazione inversa) la finestra e l’hop devono soddisfare una condizione di sovrapposizione costante, così che sommando i frame ricostruiti non restino buchi né gobbe.

C’è anche un costo, ed è la ragione per cui l’overlap non si spinge all’estremo. Ogni colonna in più è una FFT in più da calcolare e da memorizzare: dimezzare l’hop raddoppia il numero di frame, quindi il calcolo e la dimensione della matrice. Con overlap molto alto le colonne adiacenti diventano quasi identiche — ridondanza pura, che gonfia l’input di un modello senza aggiungere informazione. I valori tipici, 50% o 75% di sovrapposizione, sono il compromesso che fluidifica la rappresentazione senza esplodere in dimensione. Whisper, con finestra da 25 ms e hop da 10 ms, sta intorno al 60% di overlap.

La forma della funzione finestra del Passo 3 è la terza leva di progetto, ed è meno banale di quanto sembri. Tutte le finestre “buone” condividono l’idea di andare dolcemente a zero ai bordi per uccidere lo spectral leakage, ma differiscono nel come, e quella differenza si paga su due fronti in tensione tra loro.

Da un lato c’è la larghezza del lobo principale: quanto si allarga un picco netto. Una finestra che smorza molto i bordi accorcia di fatto la parte utile del segnale, quindi allarga i picchi e peggiora la capacità di separare due frequenze vicine. Dall’altro c’è l’altezza dei lobi laterali: quanta energia spuria resta sparsa attorno al picco vero.

Una finestra rettangolare (cioè nessuna finestra, frame tagliati netti) ha il lobo principale più stretto possibile — massima capacità di separare picchi — ma lobi laterali altissimi, cioè leakage pessimo. Le finestre di Hann e Hamming sacrificano un po’ di larghezza del lobo principale per abbattere i lobi laterali: per la maggior parte dei segnali reali è l’affare giusto, ed è il motivo per cui sono lo standard di fatto.

Esistono finestre più aggressive (Blackman, Kaiser, quest’ultima con un parametro che regola il compromesso) per quando serve schiacciare ancora di più i lobi laterali. La regola pratica: a meno di un motivo specifico, Hann va bene; cambiarla è una scelta da fare sapendo quale dei due fronti — separare picchi vicini o sopprimere il leakage — si vuole favorire.

Dal modulo X[k,m]|X[k,m]| si ottiene lo spettrogramma di ampiezza. Elevandolo al quadrato, X[k,m]2|X[k,m]|^2, si ottiene lo spettrogramma di potenza, proporzionale all’energia. La differenza tra i due, in pratica, quasi sparisce appena si passa alla scala logaritmica, ed ecco perché ci si passa quasi sempre.

L’energia di un suono spazia su ordini di grandezza enormi: tra il fruscio più tenue e un colpo forte ci possono essere fattori di un milione o più. Disegnata in scala lineare, una tale immagine mostrerebbe solo i picchi più forti come puntini accesi su uno sfondo tutto nero: i dettagli deboli — che spesso sono i più informativi — sparirebbero.

La cura è la scala in decibel (dB), che è logaritmica:

dB=10log10 ⁣(potenzariferimento)=20log10 ⁣(ampiezzariferimento)\text{dB} = 10 \cdot \log_{10}\!\left(\frac{\text{potenza}}{\text{riferimento}}\right) = 20 \cdot \log_{10}\!\left(\frac{\text{ampiezza}}{\text{riferimento}}\right)

In parole povere: si misura l’energia non in valore assoluto ma in “quante volte” rispetto a un riferimento, e si comprime quella scala col logaritmo. Le due formule coincidono perché la potenza è l’ampiezza al quadrato, e il quadrato dentro un logaritmo diventa un fattore due davanti: log(amp2)=2log(amp)\log(\text{amp}^2) = 2\log(\text{amp}). È per questo che, una volta in dB, “spettrogramma di ampiezza” e “spettrogramma di potenza” sono la stessa immagine a meno di una costante.

Due cose da non dimenticare. Il decibel è relativo: serve un riferimento dichiarato, altrimenti i valori assoluti non significano nulla (spesso il riferimento è il massimo della matrice, e allora 0 dB è il punto più forte e tutto il resto è negativo).

E la scala log non è solo un trucco di visualizzazione: avvicina la rappresentazione a come l’orecchio percepisce l’intensità, che è grossolanamente logaritmica — raddoppiare la potenza non raddoppia la sensazione di “forte”. Tieni questo in mente, perché lo stesso principio — imitare la percezione invece di prendere i numeri fisici grezzi — torna subito, applicato all’asse delle frequenze.

Lo spettrogramma “lineare” mette le frequenze su un asse uniforme: il bin a 200 Hz e quello a 5000 Hz hanno lo stesso peso. Ma l’orecchio umano non funziona così.

Distinguiamo facilmente 200 Hz da 300 Hz; molto meno 5000 Hz da 5100 Hz, benché la differenza in Hz sia identica. La nostra percezione del pitch è compressa verso l’alto: alta risoluzione sui gravi, bassa sugli acuti. Spendere lo stesso numero di bin su tutte le frequenze, come fa lo spettrogramma lineare, è quindi uno spreco in alto e una scarsità in basso, rispetto a ciò che conta per l’udito.

Questo fatto fu quantificato nel 1937 da Stevens, Volkmann e Newman (psicoacustici, in “A Scale for the Measurement of the Psychological Magnitude Pitch”, Journal of the Acoustical Society of America) attraverso esperimenti di bisezione: si chiedeva agli ascoltatori di individuare il tono “a metà strada” tra due altri, e dalle loro risposte si ricostruì una scala percettiva del pitch — la scala mel (da “melody”).

La scala mel è all’incirca lineare sotto i 1000 Hz circa e logaritmica sopra; una formula molto usata è

mel(f)=2595log10 ⁣(1+f700)\text{mel}(f) = 2595 \cdot \log_{10}\!\left(1 + \frac{f}{700}\right)

dove ff è in Hz. In parole povere: passi alla scala mel quando vuoi che “distanze uguali” corrispondano a differenze di pitch percepite come uguali, non a differenze uguali in Hz.

Il mel-spettrogramma applica questa idea allo spettrogramma. Invece di tenere tutti i bin FFT lineari, si fa passare lo spettro di potenza attraverso un banco di filtri mel (mel filterbank): una serie di filtri triangolari sovrapposti — tipicamente 40, 64, 80 o 128 — spaziati uniformemente sulla scala mel, e quindi fitti sui bassi e larghi sugli acuti se li guardi in Hz.

Ogni filtro somma, pesandola con la sua forma triangolare, l’energia dei bin FFT che cadono nella sua banda. Il risultato è un vettore di poche decine di valori per frame — un’energia per banda mel — al posto delle centinaia o migliaia di bin lineari. Prendendone poi il logaritmo si ottiene il log-mel spectrogram, che è la forma effettivamente usata nei modelli.

Perché il mel-spettrogramma è diventato lo standard per l’audio in machine learning si riassume in quattro motivi. È compatto: 80 bande mel invece di centinaia di bin lineari significano un input più piccolo e meno parametri a valle. È percettivo: concentra la risoluzione dove conta per l’udito umano (e per distinguere i suoni del parlato), e butta dettaglio dove l’orecchio non sente. È robusto: meno sensibile a rumore e a variazioni fini ad alta frequenza. Ed è empiricamente migliore: storicamente, nei task di speech, le feature mel battono lo spettro lineare grezzo.

La classe di questa affermazione va marcata: è una scelta ingegneristica consolidata, non un teorema. Nessuno ha dimostrato che il mel sia ottimale — e per alcuni segnali, come vedremo, è anzi la scelta sbagliata — ma decenni di pratica lo hanno reso lo standard di fatto per la voce e per buona parte dell’audio.

C’è un ulteriore passo che, per decenni, è stato la conclusione obbligata della pipeline: i MFCC (Mel-Frequency Cepstral Coefficients, coefficienti cepstrali in frequenza mel).

Sono stati formalizzati da Davis e Mermelstein nel 1980 (in “Comparison of Parametric Representations for Monosyllabic Word Recognition in Continuously Spoken Sentences”, IEEE Transactions on Acoustics, Speech, and Signal Processing), e si ottengono applicando una DCT (Discrete Cosine Transform, la cugina della trasformata di Fourier già incontrata a proposito di JPEG nel capitolo su Fourier) al log-mel spectrogram.

La DCT fa due cose utili a chi, all’epoca, modellava il parlato con metodi statistici. Decorrela i coefficienti: le bande mel adiacenti sono correlate tra loro, e la DCT le rende quasi indipendenti. E compatta l’energia nei primi coefficienti, così che si possano tenere solo i primi tredici circa e scartare il resto.

Questo era prezioso per i sistemi di riconoscimento vocale basati su HMM-GMM (modelli di Markov nascosti con misture gaussiane, lo standard ASR dagli anni ‘80 fino ai primi anni 2010), che assumevano feature a bassa dimensione e poco correlate fra loro: dare in pasto a quei modelli i 13 MFCC era molto più gestibile che dare loro un mel-spettrogramma intero.

Con il deep learning il passo della DCT è spesso eliminato. Le reti profonde gestiscono bene feature correlate — sanno decorrelare da sole — quindi conviene dare loro il log-mel spectrogram “grezzo”, che contiene più informazione. Whisper, per esempio, usa log-mel, non MFCC.

Gli MFCC restano un pezzo di storia importante e ancora usati in contesti leggeri o classici, ma nel mondo dei grandi modelli il log-mel li ha in larga parte sostituiti. La classe di questo legame è una filiazione tecnica documentata: gli MFCC nascono dal mel-spettrogramma aggiungendo la DCT, e il deep learning ha “tagliato” l’ultimo passo tornando al log-mel — un caso in cui il progresso è consistito nel togliere un passo, non nell’aggiungerne.

Esempio 1 — numerico: che forma ha lo spettrogramma di tre secondi di parlato?

Sezione intitolata “Esempio 1 — numerico: che forma ha lo spettrogramma di tre secondi di parlato?”

Prima di guardare cosa mostra uno spettrogramma, conviene contare quanto è grande. Prendi tre secondi di parlato campionato a fs=16000f_s = 16000 Hz: sono 3×16000=480003 \times 16000 = 48000 campioni nella forma d’onda.

Usiamo i parametri di Whisper: finestra da 25 millisecondi e hop da 10 millisecondi. Da qui si calcola tutto il resto.

La finestra contiene N=0.025×16000=400N = 0.025 \times 16000 = 400 campioni; l’hop è 0.010×16000=1600.010 \times 16000 = 160 campioni. Quante colonne (frame) escono? Ogni hop avanza di 160 campioni, quindi il numero di frame è all’incirca 48000/160=30048000 / 160 = 300. Quante righe? La FFT su N=400N = 400 campioni di segnale reale dà N/2+1=201N/2 + 1 = 201 bin di frequenza. Lo spettrogramma lineare è quindi una matrice 201×300201 \times 300: 201 frequenze, 300 istanti.

Ora la risoluzione. In frequenza, i 201 bin coprono da 0 fino alla frequenza di Nyquist fs/2=8000f_s/2 = 8000 Hz, spaziati di fs/N=16000/400=40f_s/N = 16000/400 = 40 Hz l’uno dall’altro: due toni più vicini di 40 Hz cadono nello stesso bin e non li distingui. In tempo, ogni colonna è separata dalla successiva di 160/16000=10160/16000 = 10 ms: eventi più ravvicinati di 10 ms finiscono nella stessa colonna.

Se ora applichi il banco di filtri mel a 80 bande, la matrice si comprime da 201×300201 \times 300 a 80×30080 \times 300: l’altezza scende da 201 a 80, il tempo resta invariato. Sono numeri piccoli e concreti, e mostrano due cose. Lo spettrogramma è molto più compatto della forma d’onda — 48000 numeri diventano 80×300=2400080 \times 300 = 24000, e con valori molto più informativi. E ogni parametro che scegli ha una conseguenza misurabile sulla griglia che il modello vedrà: cambiare la finestra cambia le righe, cambiare l’hop cambia le colonne.

Esempio 2 — la voce: “ciao” sotto il microscopio

Sezione intitolata “Esempio 2 — la voce: “ciao” sotto il microscopio”

Registra qualcuno che pronuncia “ciao”. La forma d’onda non dice quasi nulla a occhio. Lo spettrogramma, sì.

La parte vocalica (“a-o”) appare come un pettine di righe orizzontali: una frequenza fondamentale (l’altezza della voce, l’intonazione) e i suoi multipli interi, le armoniche. Sopra questo pettine spiccano delle bande più scure e accese a certe frequenze: sono le formanti, i picchi di risonanza della cavità vocale. La loro posizione è ciò che distingue una /a/ da una /o/, e mentre la bocca cambia forma passando da una vocale all’altra le formanti si spostano: nello spettrogramma le vedi scivolare verso l’alto o verso il basso.

La “c” iniziale appare invece come uno schizzo verticale a banda larga: un breve rumore che contiene molte frequenze insieme, senza struttura armonica. Lo spettrogramma rende visibile esattamente la struttura tempo-frequenza che la forma d’onda nascondeva — ed è in questa forma che il parlato entra in un modello di speech.

Esempio 3 — la musica: una nota, un accordo, un colpo

Sezione intitolata “Esempio 3 — la musica: una nota, un accordo, un colpo”

Una singola nota di pianoforte tenuta è un pettine pulito: la fondamentale in basso e una scaletta di armoniche sopra, tutte righe orizzontali stabili che lentamente si spengono mentre la nota decade. Un accordo è la sovrapposizione di più pettini, uno per nota, e l’occhio allenato legge gli intervalli dalla spaziatura delle righe.

Un colpo di rullante è il contrario: nessuna struttura armonica, una striscia verticale larga e brevissima, perché un transiente percussivo contiene tutte le frequenze in un istante. E un glissando — il dito che scivola sulle corde — è una linea obliqua, una frequenza che sale o scende con continuità. Tre forme diverse per tre fenomeni musicali diversi, tutte leggibili nella stessa immagine. Ed è anche un buon promemoria del trade-off della finestra: per leggere bene gli intervalli di un accordo serve risoluzione in frequenza (finestra lunga), per cogliere la precisione del colpo serve risoluzione nel tempo (finestra corta).

Esempio 4 — il canto degli uccelli e i fischi dei delfini

Sezione intitolata “Esempio 4 — il canto degli uccelli e i fischi dei delfini”

In bioacustica lo spettrogramma è lo strumento di lavoro. Il canto di un uccello appare come un intreccio di trilli e fischi modulati — curve sottili che salgono, scendono, si ripetono — e ogni specie lascia una firma riconoscibile, tanto che sistemi di classificazione automatica come BirdNET (un classificatore di specie addestrato su spettrogrammi) analizzano migliaia di spettrogrammi all’ora per identificare chi canta.

I delfini tursiopi producono dei signature whistle: fischi modulati in frequenza, una curva caratteristica per ciascun individuo, associata alla sua identità — una sorta di “nome” acustico. Quella curva è leggibile nello spettrogramma, e raggruppare gli spettrogrammi dei fischi permette di distinguere e monitorare i singoli animali. Due specie, due mondi sonori, lo stesso strumento visivo — e in entrambi i casi il passo successivo, dare quegli spettrogrammi in pasto a una rete, è lo stesso del parlato.

Esempio 5 — in codice: costruire uno spettrogramma e un mel-spettrogramma

Sezione intitolata “Esempio 5 — in codice: costruire uno spettrogramma e un mel-spettrogramma”

In Python, con numpy e librosa (la libreria standard per l’analisi audio), la pipeline è poche righe.

import numpy as np
import librosa
y, sr = librosa.load("voce.wav", sr=16000) # segnale + frequenza di campionamento
# 1) Spettrogramma lineare via STFT
n_fft, hop = 400, 160 # finestra 25 ms, hop 10 ms a 16 kHz
S = librosa.stft(y, n_fft=n_fft, hop_length=hop, window="hann")
S_db = librosa.amplitude_to_db(np.abs(S), ref=np.max) # modulo -> dB
# 2) Mel-spettrogramma: stesso STFT, poi banco di filtri mel
M = librosa.feature.melspectrogram(
y=y, sr=sr, n_fft=n_fft, hop_length=hop, n_mels=80)
M_db = librosa.power_to_db(M, ref=np.max) # potenza -> dB (log-mel)
print(S.shape) # (201, T) -> 201 bin di frequenza lineari, T frame
print(M.shape) # (80, T) -> 80 bande mel, stessi T frame

Tre cose da portare via. La stft esegue esattamente la pipeline a sei passi: framing, finestra di Hann, FFT per frame; np.abs prende il modulo.

Il mel-spettrogramma riusa lo stesso STFT e gli somma sopra il banco di filtri mel, comprimendo i 201 bin lineari in 80 bande mel — l’altezza dell’immagine cala da 201 a 80. E amplitude_to_db / power_to_db realizzano la scala logaritmica con un riferimento esplicito (ref=np.max): senza quel riferimento i numeri in dB non avrebbero significato assoluto.

Esempio 6 — scenario reale: trovare un ronzio guardando l’immagine

Sezione intitolata “Esempio 6 — scenario reale: trovare un ronzio guardando l’immagine”

Hai un dataset di registrazioni e una di queste suona “sporca”, ma non sai perché. Apri lo spettrogramma: c’è una riga orizzontale netta e isolata a 50 Hz (e magari le sue armoniche a 100, 150 Hz), accesa per tutta la durata. È il ronzio della rete elettrica (50 Hz in Europa, 60 in Nord America). Nel tempo era invisibile, annegato nel resto; in tempo-frequenza salta all’occhio come una riga che non dovrebbe esserci.

Lo spettrogramma è spesso il primo posto dove guardare quando “c’è qualcosa che non va e non so cosa” in un segnale audio. Ed è anche il modo con cui si fa quality assurance su un dataset prima di darlo in pasto a un modello, scartando le registrazioni con clipping, artefatti di compressione o disturbi periodici che altrimenti il modello imparerebbe come se fossero parte del suono.

Front-end di speech e ASR. Quasi nessun modello che lavora sul parlato riceve la forma d’onda grezza: riceve un log-mel spectrogram. Capire i suoi parametri — numero di bande mel, lunghezza della finestra, hop — significa capire le leve che decidono cosa il modello può e non può distinguere.

Una finestra troppo corta sfoca le frequenze e confonde le vocali; un hop troppo grande perde i transienti rapidi delle consonanti, e con essi pezzi di parola. Queste non sono manopole cosmetiche: spostano direttamente il limite superiore di quanto bene il modello potrà mai riconoscere.

Sintesi vocale (TTS). Nella pipeline classica del text-to-speech moderno, un primo modello converte il testo in un mel-spettrogramma — la “partitura” del parlato da generare — e un secondo modello, il vocoder, converte quel mel in forma d’onda udibile.

Lo spettrogramma è la rappresentazione intermedia su cui i due pezzi si incontrano: il primo modello non deve preoccuparsi di generare campioni audio uno per uno, gli basta dipingere lo spettrogramma giusto.

Music information retrieval e generazione musicale. Riconoscere il genere, separare le tracce, identificare un brano, generare musica: tutti compiti che partono da rappresentazioni tempo-frequenza o da token che ne derivano. Lo spettrogramma è il punto di partenza visivo della maggior parte di questi sistemi.

Bioacustica e monitoraggio ambientale. Classificare le specie da registrazioni sul campo (uccelli, anfibi, cetacei), stimare la biodiversità ascoltando un ecosistema, monitorare singoli animali dalle loro firme acustiche. Tutto passa per lo spettrogramma, spesso dato in pasto a una rete nata per le immagini: è lo stesso trucco “audio come immagine” usato per il parlato, applicato alla fauna.

Debug e quality assurance audio. Individuare ronzii, clipping, artefatti di compressione, aliasing residuo (se il segnale era stato campionato male, vedi Nyquist): tutti difetti che nel dominio del tempo sono difficili da vedere e nello spettrogramma diventano evidenti. È uno strumento di ispezione prima ancora che di modellazione.

Il ponte verso l’AI: l’audio diventa un’immagine, poi diventa token

Sezione intitolata “Il ponte verso l’AI: l’audio diventa un’immagine, poi diventa token”

Qui lo spettrogramma smette di essere uno strumento di analisi e diventa l’ingranaggio che collega l’audio all’infrastruttura del deep learning.

I legami sono di classi diverse — un’identità d’uso, una scelta ingegneristica, una pipeline, uno stato dell’arte in evoluzione — e li marchiamo uno per uno, perché confonderli porta a intuizioni che si rompono.

Il legame più diretto è un’identità d’uso, non un’analogia. Whisper, il modello di riconoscimento vocale di OpenAI (2022, descritto in “Robust Speech Recognition via Large-Scale Weak Supervision”), non riceve la forma d’onda grezza.

La converte in un log-mel spectrogram a 80 canali, calcolato su finestre da 25 millisecondi con uno stride di 10 millisecondi; per uno spezzone da 30 secondi questo dà una matrice di forma 80×300080 \times 3000 (80 bande di frequenza per 3000 istanti), scalata globalmente tra 1-1 e 11 con media circa zero sul dataset. Sono esattamente i numeri dell’Esempio 1, scalati a 30 secondi: l’oggetto costruito in questo capitolo, usato come front-end senza modifiche.

Non è una particolarità di Whisper. Dai vecchi sistemi a modelli di Markov nascosti fino ai modelli end-to-end di oggi, l’input dello speech è quasi sempre uno spettrogramma o feature da esso derivate (gli MFCC nei sistemi classici, il log-mel nei moderni).

La classe del legame è precisa: non è un’analogia, è la STFT di questo capitolo usata come front-end. Capire come si costruisce lo spettrogramma significa, alla lettera, capire cosa entra in input a questi modelli, e capire i suoi parametri significa capire le leve che governano cosa il modello può distinguere.

Perché trasformare l’audio in immagine sblocca le architetture visive

Sezione intitolata “Perché trasformare l’audio in immagine sblocca le architetture visive”

Qui c’è la scelta strategica. Una volta che il suono è una matrice 80×300080 \times 3000, è un’immagine — e tutto l’armamentario maturo della computer vision si può riusare quasi pari pari.

Whisper lo fa esplicitamente: lo stem del suo encoder è costituito da due strati convoluzionali (con filtri di ampiezza 3 e attivazione GELU, il secondo con stride 2), gli stessi mattoni con cui si processano le immagini.

Lo spettrogramma viene trattato come un’immagine, e una CNN (rete convoluzionale, l’architettura nata per la visione) o un Transformer pensati per le immagini ci scorrono sopra senza modifiche concettuali. È qui che torna utile il terzo angolo dell’intuizione: la tabella di somiglianze tempo-frequenza è proprio ciò su cui un filtro convoluzionale sa cercare pattern locali.

La classe del legame è una scelta ingegneristica dichiarata: lo spettrogramma è il ponte che porta un problema audio dentro l’ecosistema, molto più maturo e ricco di tecniche pronte, dei modelli per immagini.

Attenzione a non gonfiare l’affermazione: non è che l’audio “assomigli” a un’immagine in senso vago. Una volta spettrogrammato, è una matrice 2D di intensità, e questo è ciò che conta per un’architettura convoluzionale, che lavora proprio su griglie di valori. (I capitoli dedicati alle reti convoluzionali, alla visione multimodale e a Whisper — cnn-base, multimodal-vision, whisper — sono in preparazione in altre Parti.)

C’è un’asimmetria. Costruire lo spettrogramma è facile e ben definito; tornare indietro non lo è, perché nel passo del modulo abbiamo scartato la fase. La matrice di sole ampiezze non basta a ricostruire l’onda: manca l’informazione su come le frequenze erano allineate tra loro.

Il problema “da mel-spectrogram a forma d’onda” è risolto dai vocoder neurali, e il loro contributo è una pipeline ingegneristica, non un’analogia. Un vocoder impara, dai dati, a indovinare la forma d’onda plausibile che produrrebbe un dato spettrogramma — fase inclusa.

Due rappresentanti, due filosofie. WaveNet (van den Oord e colleghi, DeepMind, 2016, “WaveNet: A Generative Model for Raw Audio”) genera l’onda un campione alla volta in modo autoregressivo: qualità altissima, ma lento, perché produce decine di migliaia di campioni al secondo uno dopo l’altro.

HiFi-GAN (Kong, Kim e Bae, NeurIPS 2020) usa invece un GAN (rete generativa avversaria, un generatore allenato contro un discriminatore che cerca di smascherare i falsi) per produrre l’onda da un mel-spettrogramma, raggiungendo qualità vicina a quella umana a circa 168 volte la velocità del tempo reale su una singola GPU. Il vocoder è il pezzo che chiude il cerchio testo \to mel \to onda nei sistemi TTS, ed è il motivo per cui la sintesi vocale moderna suona naturale.

Audio tokenization: lo stato dell’arte, in evoluzione

Sezione intitolata “Audio tokenization: lo stato dell’arte, in evoluzione”

C’è una frontiera oltre lo spettrogramma continuo, e va marcata come stato dell’arte 2026, ancora in evoluzione. I modelli audio generativi più recenti non lavorano su uno spettrogramma a valori continui, ma su token discreti: l’audio viene mappato in una sequenza di simboli presi da un vocabolario finito, esattamente come il testo è una sequenza di token.

EnCodec (Défossez, Copet, Synnaeve e Adi, Meta, 2022, “High Fidelity Neural Audio Compression”) fa questo con un encoder-decoder convoluzionale e un bottleneck a Residual Vector Quantization (una quantizzazione a più stadi che approssima il segnale con una sequenza di indici discreti, ciascuno scelto da un dizionario appreso).

Quei token diventano il “vocabolario” su cui modelli come MusicGen fanno language modeling, applicando all’audio lo stesso meccanismo che un LLM applica al testo: predire il prossimo token, solo che il token è un frammento di suono invece di una sillaba.

È qui che si chiude il legame con la multimodalità: testo, immagini e audio si possono ridurre tutti a sequenze di token che uno stesso Transformer modella nello stesso framework. Lo spettrogramma trattato come immagine era il primo ponte (audio dentro la computer vision); la tokenizzazione è il secondo (audio dentro il language modeling).

Lo spettrogramma, intanto, non scompare — molti codec e modelli usano ancora una loss in dominio tempo-frequenza, e il mel resta lo strumento per capire cosa c’è dentro un suono — ma cessa di essere l’unica rappresentazione possibile. La classe è uno stato dell’arte in movimento: tra qualche anno la frontiera sarà altrove, e questa sezione è uno snapshot, non una verità stabile.

Lo spettrogramma è uno strumento potente, ma porta con sé un fascio di trappole e di fraintendimenti che mordono chiunque ci lavori senza conoscerli. Alcuni sono concettuali (cosa è davvero la matrice), altri pratici (cosa succede ai bordi, cosa si perde, cosa non si confronta).

STFT, FFT, spettrogramma: tre cose diverse. La FFT è un algoritmo veloce per calcolare la DFT (chiarito in Fourier). La STFT è una sequenza di FFT, una per finestra. Lo spettrogramma è il modulo della STFT, disposto come immagine. Confonderli porta a errori concettuali: la STFT conserva la fase, lo spettrogramma no.

Lo spettrogramma non è invertibile così com’è. Questa è la trappola più costosa. Avendo scartato la fase nel passo del modulo, dalla sola matrice di ampiezze non si ricostruisce univocamente l’onda.

Per tornare indietro servono o un algoritmo classico che stima la fase iterativamente (Griffin-Lim) o un vocoder neurale. Chi si aspetta che “antitrasformare lo spettrogramma” restituisca il suono originale resta deluso: manca metà dell’informazione, e va indovinata.

La scala mel non è il “log” del log-mel. Sono due operazioni distinte che si confondono di continuo. La scala mel riguarda l’asse delle frequenze: è una rimappatura percettiva, all’incirca lineare-poi-logaritmica, di dove cadono le bande. Il log del “log-mel” riguarda invece i valori di energia: è la compressione logaritmica dell’ampiezza, la scala in dB. Una agisce sull’asse verticale (quali frequenze), l’altra sul colore (quanta energia). Sono indipendenti.

Finestra più lunga non significa “migliore”. Una finestra lunga migliora la risoluzione in frequenza ma peggiora quella nel tempo. Non esiste una scelta universalmente buona: dipende dal segnale e dal task. Cercare “la finestra giusta” senza sapere cosa si vuole vedere è un errore di impostazione.

Il decibel ha bisogno di un riferimento. Senza un riferimento dichiarato, i valori in dB sono insignificanti in assoluto. Confrontare due spettrogrammi normalizzati con riferimenti diversi (uno sul massimo della clip, l’altro su un livello fisso) porta a conclusioni sbagliate sull’energia relativa.

L’aliasing si eredita. Lo spettrogramma è fedele solo se il segnale è stato campionato bene. Se la frequenza di campionamento era troppo bassa rispetto al contenuto del segnale, l’aliasing (vedi Nyquist) ha già piegato le frequenze alte su quelle basse prima che lo spettrogramma venisse calcolato. L’immagine mostrerà frequenze fantasma, e nessuna scelta di finestra le potrà correggere: il danno è a monte.

Lo spectral leakage senza finestratura. Se si saltano le finestre di Hann/Hamming e si tagliano i frame netti, ogni frame inietta frequenze spurie e lo spettrogramma si “sporca” di code orizzontali attorno ai toni veri. È lo stesso fenomeno discusso in Fourier, qui moltiplicato per il numero di frame.

Il mel butta informazione di proposito. Comprimere a 80 bande mel scarta dettaglio ad alta frequenza. Per il parlato è un vantaggio; per task che vivono sugli acuti (certa analisi musicale, alcuni segnali ultrasonici) può essere una perdita. Il mel non è neutrale: incorpora un’assunzione sulla percezione umana, che non sempre è l’assunzione giusta per il problema.

Lo spettrogramma non sa separare suoni sovrapposti. Quando due sorgenti suonano insieme — due voci, una voce e la musica di sottofondo — le loro energie si sommano in ogni cella, e dallo spettrogramma non si recupera “chi ha messo cosa”. Le forme si intrecciano e si mascherano a vicenda. La separazione delle sorgenti è un problema difficile a sé, e lo spettrogramma è il punto di partenza, non la soluzione: mostra il miscuglio, non i suoi ingredienti.

I parametri non sono confrontabili tra librerie. Due spettrogrammi calcolati con n_fft, hop_length, tipo di finestra, scala (potenza vs ampiezza) o numero di bande mel diversi sono immagini diverse dello stesso suono. Confrontarli a occhio, o peggio darli a un modello addestrato su parametri diversi, è una fonte di errori silenziosi: il training/serving skew dei segnali audio nasce spesso da qui.

  • Fourier: vedere frequenze invece di tempo — prerequisito diretto: trasformata, DFT, FFT, principio di indeterminazione, finestre, spectral leakage. Questo capitolo costruisce sopra quello.
  • Campionamento, aliasing, teorema di Nyquist — lo spettrogramma parte da un segnale campionato; aliasing e frequenza di Nyquist determinano cosa l’immagine può mostrare fedelmente.
  • Filtri, convoluzione, smoothing, edge detection — il banco di filtri mel è un insieme di filtri triangolari; il ronzio a 50 Hz si toglie con un filtro notch.
  • Segnali continui, discreti, sistemi lineari — il vocabolario di base (segnale, campione, sistema) su cui poggia tutta la costruzione.
  • rumore-snr (in preparazione, questa Parte) — i disturbi che si vedono nello spettrogramma (ronzio, fruscio) si quantificano col rapporto segnale-rumore.
  • time-series-base (in preparazione, questa Parte) — il periodogramma per le serie temporali è parente stretto dello spettrogramma: cercare cicli ricorrenti è cercare righe orizzontali.
  • ponte-segnali-audio-vision (in preparazione, questa Parte) — il capitolo che tira le fila: perché segnali e filtri servono per audio, vision e multimodale.
  • Prodotto scalare come proiezione e somiglianza — ogni coefficiente della STFT è un prodotto scalare tra il frame e una sinusoide: la misura di “quanto si somigliano”.
  • whisper, multimodal-audio, asr-fundamentals (in preparazione, Parte XXII) — i modelli di speech che ricevono il log-mel spectrogram come input.
  • cnn-base, multimodal-vision (in preparazione, Parte XVIII e XXII) — le architetture convoluzionali che si riusano sullo spettrogramma trattato come immagine.
  • tts-moderno, music-generation (in preparazione, Parte XXII) — i sistemi che generano un mel-spettrogramma e lo convertono in onda con un vocoder.
  • Alec Radford et al., “Robust Speech Recognition via Large-Scale Weak Supervision” (OpenAI, 2022) — il paper di Whisper; la sezione sull’architettura specifica il front-end log-mel a 80 canali e lo stem convoluzionale.
  • S. S. Stevens, J. Volkmann, E. B. Newman, “A Scale for the Measurement of the Psychological Magnitude Pitch” (Journal of the Acoustical Society of America, 1937) — la fonte originale della scala mel, ottenuta sperimentalmente.
  • S. B. Davis, P. Mermelstein, “Comparison of Parametric Representations for Monosyllabic Word Recognition in Continuously Spoken Sentences” (IEEE Trans. ASSP, 1980) — il paper che formalizza gli MFCC.
  • Aäron van den Oord et al., “WaveNet: A Generative Model for Raw Audio” (DeepMind, 2016) e Jungil Kong, Jaehyeon Kim, Jaekyoung Bae, “HiFi-GAN” (NeurIPS 2020) — i due vocoder che chiudono il cerchio da mel a onda, autoregressivo l’uno, GAN l’altro.
  • Alexandre Défossez et al., “High Fidelity Neural Audio Compression” (EnCodec) (Meta, 2022) — la tokenizzazione audio discreta che porta l’audio dentro il framework dei modelli a token.
  • Documentazione di librosa (librosa.stft, librosa.feature.melspectrogram, librosa.power_to_db) — il riferimento implementativo per costruire spettrogrammi e mel-spettrogrammi in Python.