Estou usando a specgram()
função matplotlib
para gerar espectrogramas de arquivos de ondas de fala em Python, mas a saída é sempre de qualidade muito inferior à que meu software normal de transcrição, Praat, pode gerar. Por exemplo, a seguinte chamada:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Gera isso:
Enquanto Praat, trabalhando na mesma amostra de áudio com as seguintes configurações:
- Faixa de visualização: 0-8000Hz
- Comprimento da janela: 0.005s
- Faixa dinâmica: 70dB
- Etapas do tempo: 1000
- Etapas de frequência: 250
- Forma da janela: Gaussian
Gera isso:
O que estou fazendo errado? Eu tentei mexer com todos os specgram()
parâmetros, mas nada parece melhorar a resolução. Não tenho praticamente nenhuma experiência com FFTs.
fft
spectrogram
python
Alek Storm
fonte
fonte
Respostas:
Aqui estão os parâmetros matplotlib.specgram
Os parâmetros fornecidos na descrição da pergunta precisam ser convertidos em parâmetros comparáveis de mpl.specgram. A seguir, um exemplo do mapeamento:
Se você usar 8ms, obterá uma potência de 2 FFT (128). A seguir, é apresentada a descrição das configurações do Praat no site
Link para configurações do Praat
A pergunta do OP pode estar relacionada à diferença de contraste entre o espectrograma Praat e o espectrograma mpl (matplotlib). O Praat possui uma configuração de Faixa dinâmica que afeta o contraste. A função mpl não possui uma configuração / parâmetro semelhante. O mpl.specgram retorna a matriz 2D de níveis de potência (o espectrograma), a faixa dinâmica pode ser aplicada à matriz de retorno e plotada novamente.
A seguir, é um snippet de código para criar os gráficos abaixo. O exemplo é a fala de ~ 1m15s com um chilro de 20Hz a 8000Hz.
fonte
Parece ser um problema de resolução de tempo / frequência. Seu gráfico do Praat tem uma resolução de frequência pior (você nem consegue ver claramente os harmônicos) e uma resolução de tempo melhor. Tente reduzir o tamanho da janela (NFFT) para 16000 x 0,05 = 80 amostras. Eu sugiro usar uma potência maior de 2 em pad_to (128 ou 256).
fonte