Eu tenho um conjunto de músicas para as quais extraí o STFT (Short-Time Fourier Transform) e usei o espectro de magnitudepara calcular o espectrograma de mel usando uma matriz de banco de filtros de mel , então . Quero saber se existe algum método para reverter esse processo, ou seja, converter do espectrograma mel de volta para o espectrograma. Realizei alguma redução de dimensionalidade no espectrograma mel e reconstruí o espectrograma mel a partir de dimensões mais baixas. Agora eu quero regenerar o sinal de áudio do espectrograma de mel reconstruído, então acho que primeiro reconstrua o espectrograma e depois o sinal de áudio.
O problema é que a matriz do banco de filtros de mel não é uma matriz quadrada, uma vez que reduzimos o número de compartimentos de frequência, então inverso de não pode ser usado assim: . Então, existe alguma maneira de gerar o mapeamento inverso, como alguma função de transferência inversa que pode converter de para ?
fonte
Respostas:
Tomar um espectrograma de magnitude e um banco de filtros Mel são processos com perdas. Informações importantes necessárias para reconstruir o original serão perdidas. Portanto, você precisa voltar e usar as amostras de áudio originais para fazer a reconstrução, determinando um filtro no domínio do tempo ou da frequência equivalente à sua redução de dimensionalidade.
Você pode fazer suposições sobre as informações perdidas, mas essas suposições geralmente soam imprecisas, artificiais e / ou robóticas. Ou você pode usar apenas entradas especialmente sintetizadas, onde as suposições serão corretas por design dessa entrada.
fonte
Como já mencionado, em geral não é possível executar exatamente. Como se você tivesse uma representação 2D da cena 3D, do lado de fora de um carro, você não pode, em princípio, dizer se é um desenho muito fino que se assemelha a um carro ou se era uma foto de um carro real, mas se você assumir que ninguém tentou enganar você pode fazer algumas suposições sobre dados reais; de fato, é assim que os modelos generativos de aprendizado de máquina funcionam.
Com relação à transformação inversa, como a maioria dos filtros é ortogonal (seu produto interno é zero), você pode usar a transposição do banco de filtros como uma aproximação da transformação inversa; no entanto, a escala dos dados estará incorreta, como você facilmente verificará. Você pode usar algumas estatísticas sobre o STFT original extraído de alguns grandes conjuntos de dados, por canal (frequência) e normalizar oMTMx ter a escala 'certa'. Quando se trata de criar espectrograma completo apenas a partir do sinal de magnitude, é possível usar o algoritmo Griffin-Lin para fazer alguma aproximação. Você pode usar algo como WaveNet ou Parallel Wavenet para fazer isso com mais robustez, pois foi verificado que funciona muito bem com o sinal de fala e outros sinais de áudio.
fonte
Atualmente, o mais fácil seria usar
librosa
para esta tarefa. Possui a função mel_to_stft que faz exatamente o que você deseja.Como outros já mencionaram, essa reconstrução é com perdas e apenas uma solução aproximada pode ser encontrada. Na librosa, isso é feito usando o algoritmo de quadrados de concessão não negativos .
Lembre-se de que: se você extraiu as energias da mel usando seu próprio algoritmo, deve garantir que o desvio da frequência seja semelhante; caso contrário, você terminará com áudio que soa desarmônico (supondo que mais tarde você queira sintetizar o forma de onda do STFT). Na librosa existem duas funções de distorção, você pode usar a segunda especificando
htk=True
.fonte