Conversione di spettrogramma mel in spettrogramma


8

Ho una serie di canzoni per le quali ho estratto la STFT (Short-Time Fourier Transform) e usato lo spettro di grandezza |S| per calcolare lo spettrogramma mel usando una matrice bank bank mel M, così X=log(M×|S|). Voglio sapere che esiste un metodo per invertire questo processo, ovvero convertire dallo spettrogramma mel allo spettrogramma. Ho eseguito una riduzione della dimensionalità sullo spettrogramma mel e ho ricostruito lo spettrogramma mel da dimensioni inferiori. Ora voglio rigenerare il segnale audio dallo spettrogramma mel ricostruito, quindi immagino prima di ricostruire lo spettrogramma e poi il segnale audio.

Il problema è che la matrice del banco del filtro mel non è una matrice quadrata, poiché riduciamo il no dei bin di frequenza, quindi al contrario M non può essere usato in questo modo: S^=M1exp(X). Quindi esiste un modo per generare la mappatura inversa, come una funzione di trasferimento inversa da cui è possibile convertireX per S?


Questo semplicemente non è possibile a meno che tu non abbia un modello precedente molto forte di come suonavano le tue fonti. Senza alcuna informazione preliminare sulle tue fonti, ci sono davvero molti spettri diversi che possono essere "collassati" nello stesso insieme di coefficienti di frequenza mel.
Pichenettes,

@pichenettes: Quindi come ricostruire la canzone originale, spero che tu abbia capito il problema. Ho uno spettrogramma mel e una versione ricostruita di dimensioni inferiori. Invece di riferire che "l'errore era" in termini di cifre numeriche, se c'è un modo in cui potrei in qualche modo "ascoltare" lo spettrogramma mel ricostruito, allora posso dire che dopo la riduzione della dimensionalità, trattenendo meno componenti e ricostruendo il mel -spettrogramma, ecco come suona l'audio.
user76170,

2
Semplicemente non è possibile nel caso generale. È come avere 5 numeri e chiedere come "ricostruire" i numeri dalla loro somma.
Pichenettes,

Vogliamo creare un sistema di controllo vocale sul matlab ma non sappiamo come possiamo farlo. Abbiamo dati vocali ma come possiamo metterli nel Matlab. ad es. file (eight1.mel .... eight.mel). Vogliamo questo riconoscimento di numeri audio inglese in matlab. 1-Devo convertire i file ".mel-waw"? 2-Quali posso usare i codici? Se ci aiuti, ti saremmo grati Saluti

Risposte:


5

Sia prendere uno spettrogramma di grandezza che un banco di filtri Mel sono processi in perdita. Le informazioni importanti necessarie per ricostruire l'originale saranno andate perse. Pertanto, è necessario tornare indietro e utilizzare i campioni audio originali per eseguire la ricostruzione determinando un filtro del dominio del tempo o della frequenza equivalente alla riduzione della dimensionalità.

È possibile formulare ipotesi in merito alle informazioni perse, ma tali presupposti di solito sembrano inesatti, artificiali e / o robotici. Oppure puoi utilizzare solo input appositamente sintetizzati, in cui i presupposti saranno corretti in base alla progettazione di quell'input.


Esiste una trasformazione inversa equivalente per la banca fiter Mel? Capisco che è un processo con perdita di dati. e non possiamo trovareM1poiché M non è quadrata. Tuttavia, è possibile saltare questo passaggio ed eseguire direttamente la PCA sullo spettrogramma di magnitudine | M | ? Memorizza anche le informazioni sulla fase. Quindi ricostruire | M |, combinare le informazioni sulla fase e ripristinare l'audio originale?
user76170

1

Come già accennato, in generale non è possibile eseguire esattamente. Come se tu avessi una rappresentazione in 2D della scena 3d, lato esterno di un'auto, in linea di principio non puoi dire se è un cartone molto sottile che assomiglia a un'auto o era la foto di qualche macchina reale ma se pensi che nessuno abbia tentato di ingannare tu, puoi fare alcune ipotesi sui dati reali, infatti è così che funzionano i modelli generativi di machine learning.

Per quanto riguarda la trasformazione inversa, poiché la maggior parte dei filtri sono ortogonali (il loro prodotto interno è zero), è possibile utilizzare la trasposizione della banca di filtri come approssimazione della trasformazione inversa, tuttavia il ridimensionamento dei dati sarà errato come si verificherà facilmente. È possibile utilizzare alcune statistiche sull'STFT originale estratto da alcuni insiemi di dati di grandi dimensioni per canale (frequenza) e normalizzareMTMxavere la scala "giusta". Quando si tratta di creare uno spettrogramma completo solo dal segnale di magnitudine, è possibile utilizzare l'algoritmo Griffin-Lin per fare un po 'di approssimazione. Puoi usare qualcosa come WaveNet o Parallel Wavenet per farlo in modo più efficace, poiché è stato verificato che funziona abbastanza bene con il segnale vocale e altri segnali audio.


1

Al giorno d'oggi la cosa più semplice sarebbe usare librosaper questo compito. Ha la funzione mel_to_stft che fa esattamente quello che vuoi.

Come altri hanno già detto, questa ricostruzione è in perdita e si può trovare solo una soluzione approssimativa. In librosa viene eseguito utilizzando l' algoritmo Lease Squares non negativo .

Una cosa da tenere a mente: se hai estratto le energie mel usando il tuo algoritmo, devi assicurarti che il warping di frequenza sia simile, altrimenti finirai con un audio che suona disarmonico (supponendo che in seguito vorrai sintetizzare il forma d'onda dalla STFT). In librosa ci sono due funzioni di deformazione, è possibile utilizzare la seconda specificando htk=True.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.