algoritmo - Como calcular o MFCC? - Stack Overflow em Português
Olá, esses dias acordei com vontade de aprender sobre reconhecimento de voz, com uma breve pesquisa eu encontrei sobre o MFCC, então resolvi estudar e encontrei esse material através de uma pesquisa no google:
- http://aquarius.ime.eb.br/~apolin/papers/Carlos_UFF_2007.pdf
- http://www.practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/#eqn1
Nessas pesquisas eu entendi o seguinte:
1 - Primeiro é preciso calcular a FFT (Transformada Rápida de Fourier) de um sinal para se obter as frequências desse sinal (que no caso é o som).
2 - Aplica-se o filtro de pré-enfase para eliminar a instabilidade das frequências.
3 - Faz o janelamento do sinal, separando o sinal de voz em pequenas partes que podem ser de 20 a 40 ms.
4 - Calcula o MFCC de cada janela do sinal.
Eu não sei se estou certo sobre os passos acima, se eu estiver essado me corrijam.
Sobre os cálculos, as minhas duvidas são sobre os valores usados e o significado das variáveis:
Filtro de Pré-Enfase
H(z) = 1 − az^-1, 0.9 ≤ a ≤ 1.0
O que é z e o que é a? e porque a tem que estar entre 0.9 e 1.0?
h(n) = 0.54 − 0.46cos(2 . Pi . n / N - 1)
O que é n? O que eu entendi sobre N é que é o numero total de amostras, mais uma vez me corrijam se eu estiver errado.
N/2 P(i) = Σ |S(k,m)|²Hi(k.(2Pi/N)) k=0
Aqui eu admito que não entendi absolutamente nada, se puderem me dar uma boa explicação eu agradeço.
E uma ultima duvida (deve ter muito mais, mas não estou lembrando agora):
Se eu entendi bem o resultado do calculo do MFCC é um vetor de valores, então para o reconhecimento eu só tenho que calcular os MFCCs de dois sinais e comparar esses vetores?
Eu sou muito leigo em física e não muito bom com cálculos então relevem se eu estiver equivocado ou se minhas duvidas forem muito leigas. `
editada 27/02/19 às 16:32
AlexsanderSSAlexsanderSS
Filtro de Pré-Enfase - Assim como o nome sugere, este tipo de filtro tenta dar ênfase nas frequências maiores, é extremamente útil se o sinal(voz), estiver com algum tipo de ruído, desta maneira as frequências menores onde provavelmente os ruídos estão serão suprimidos enquanto as frequências maiores ganham enfase(aumento da amplitude), na equação o z é o sinal de entrada(voz, música, etc), quanto mais perto de 1 o a estiver mais enfase o sinal ganhará nas frequências maiores.
Janelamento - sim N é o numero total de amostrar n é o numero da iteração atual, pseudo código para criar a janela da equação:
janela[n] = 0.54 − 0.46 * cos(2*PI*n/N-1);
Sobre a equação:
Σ|S(k,m)|²*Hi(k*(2Pi/N))
isso representa o espectro S(k, m) é o retorno da sua função FFT, a primeira parte da equação é equivalente abs(fft(voz*janela,N))).^2; ou seja isso |S(k,m)|² == abs(fft(voz*janela,N))).^2
A próxima parte da equação Hi(k*(2Pi/N)) representa o banco de filtro triangular que será multiplicado pela magnitude do espectro, detalhe que este filtro deverá estar espaçado respeitando a escala Mel
Mais detalhes sobre a segunda parte da equação k*(2Pi/N), k é o número da iteração atuação e N continua sendo o número total de amostras, essa equação é pouco comum em artigos que definem como trabalhar com banco de filtro triangular(na verdade eu nunca tinha visto sendo empregada como definição de filtros), sinceramente eu não sei se o autor quis dar uma complicada huahuahua, a equação k*(2Pi/N) define a frequência equivalente dentro de cada componente espectral, só que ele deixou tudo mais difícil pois a equação coloca as periodicidades de cada componente em radiano(2*pi), não vou entrar no mérito, olhe minha resposta aqui para entender como o FFT mapeia as frequências correspondentes em cada componente do espectro, se vc leu a resposta vai entender melhor o que o autor quis representar, portanto Hi é a coleção de frequências equivalente de cada componente do espetro, ele fez isso para mais tarde você poder selecionar as bandas de frequências do seu espectro, depois seria só aplicar o filtro triangular, mas vamos testar, imagina que sua FFT tem tamanho 2048 e a amostragem do seu áudio esteja em 44100hz, qual seria a periodicidade e a frequência do primeiro componente? maneira fácil (não é a maneira q está descrita na equação acima:
1/2048 = 4.8828e-04
Ou seja o componente 1 tem periodicidade em 4.8828e-04, convertendo isso para Hertz:
4.8828e-04 *  44100 = 21.5332
Verificando se a fórmula do artigo bate:
1*2*pi/2048 = 0.0031
humm o primeiro componente do espectro possui periodicidade em 0.0031 radianos, mas poxa ai fica complicado de ver se isso é verdade, deixa eu converter radianos para hertz:
0.0031 * 1/(2*pi) = 4.9338e-04
Opa o resultado da periodicidade foi bem parecido com o resultado da minha equação, para hertz agora:
4.9338e-04 * fs = 21.7581
Não pode esquecer o sigma Σ a cada iteração você soma tudo começando do índice 0 até N/2 ...
R: Falando de maneira simplista a resposta é sim...
editada 27/02/19 às 16:27
respondida 26/02/19 às 4:02
Mais duvidas: 1 - eu tenho que tirar o FFT de cada janela e passar na equação? 2 - Você poderia me explicar mais um pouco sobre a segunda parte da equação? – AlexsanderSS 26/02/19 às 21:54
@AlexsanderSS sim vc tem q aplicar FFT em cada frame e utilizar as equações, eu dei uma incrementada para responder a sua dúvida, verifique novamente – ederwander 27/02/19 às 16:20
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag algoritmo matemática áudio reconhecimento-de-voz ou faça sua própria pergunta.