Estoy usando la specgram()
función matplotlib
para generar espectrogramas de archivos de ondas de voz en Python, pero la salida siempre es de una calidad muy inferior a la que puede generar mi software de transcripción normal, Praat. Por ejemplo, la siguiente llamada:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Genera esto:
Mientras Praat, trabaja en la misma muestra de audio con la siguiente configuración:
- Rango de visión: 0-8000Hz
- Longitud de ventana: 0.005s
- Rango dinámico: 70dB
- Pasos de tiempo: 1000
- Pasos de frecuencia: 250
- Forma de ventana: gaussiana
Genera esto:
¿Qué estoy haciendo mal? He intentado jugar con todos los specgram()
parámetros, pero nada parece mejorar la resolución. Prácticamente no tengo experiencia con FFT.
fft
spectrogram
python
Tormenta Alek
fuente
fuente
Respuestas:
Aquí están los parámetros matplotlib.specgram
Los parámetros proporcionados en la descripción de la pregunta deben convertirse a parámetros comparables de mpl.specgram. El siguiente es un ejemplo de la asignación:
Si usa 8 ms, obtendrá una potencia de 2 FFT (128). La siguiente es la descripción de la configuración de Praat desde su sitio web
Enlace a la configuración de Praat
La pregunta del OP podría ser sobre la diferencia de contraste entre el espectrograma Praat y el espectrograma mpl (matplotlib). Praat tiene una configuración de rango dinámico que afecta el contraste. La función mpl no tiene una configuración / parámetro similar. El mpl.specgram devuelve la matriz 2D de niveles de potencia (el espectrograma), el rango dinámico podría aplicarse a la matriz de retorno y volver a trazarse.
El siguiente es un fragmento de código para crear los gráficos a continuación. El ejemplo es ~ 1m15s de voz con un chirrido de 20Hz-8000Hz.
fuente
Parece ser un problema de resolución de tiempo / frecuencia. Su diagrama de Praat tiene una resolución de frecuencia peor (ni siquiera puede ver claramente los armónicos) y una mejor resolución de tiempo. Intente reducir el tamaño de la ventana (NFFT) a 16000 x 0.05 = 80 muestras. Sugeriría usar una potencia mayor de 2 en pad_to (128 o 256).
fuente