J'utilise la specgram()
fonction in matplotlib
pour générer des spectrogrammes de fichiers d'ondes vocales en Python, mais la sortie est toujours de bien meilleure qualité que ce que mon logiciel de transcription normal, Praat, peut générer. Par exemple, l'appel suivant:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Génère ceci:
Pendant que Praat, travaille sur le même échantillon audio avec les paramètres suivants:
- Plage de vision: 0-8000Hz
- Longueur de la fenêtre: 0,005 s
- Plage dynamique: 70 dB
- Pas de temps: 1000
- Pas de fréquence: 250
- Forme de la fenêtre: gaussienne
Génère ceci:
Qu'est-ce que je fais mal? J'ai essayé de jouer avec tous les specgram()
paramètres, mais rien ne semble améliorer la résolution. Je n'ai pratiquement aucune expérience avec les FFT.
fft
spectrogram
python
Alek Storm
la source
la source
Réponses:
Voici les paramètres matplotlib.specgram
Les paramètres fournis dans la description de la question doivent être convertis en paramètres de mpl.specgram comparables. Voici un exemple de mappage:
Si vous utilisez 8 ms, vous obtiendrez une puissance de 2 FFT (128). Ce qui suit est la description des paramètres Praat de leur site Web
Lien vers les paramètres Praat
La question du PO pourrait concerner la différence de contraste entre le specgramme Praat et le specgramme mpl (matplotlib). Praat a un réglage de plage dynamique qui affecte le contraste. La fonction mpl n'a pas de réglage / paramètre similaire. Le mpl.specgram renvoie le tableau 2D de niveaux de puissance (le spectrogramme), la plage dynamique pourrait être appliquée au tableau de retour et retracée.
Voici un extrait de code pour créer les tracés ci-dessous. L'exemple est ~ 1m15s de parole avec un chirp de 20Hz-8000Hz.
la source
Il semble que ce soit un problème de résolution temps / fréquence. Votre tracé Praat a une résolution de fréquence pire (vous ne pouvez même pas voir clairement les harmoniques) et une meilleure résolution de temps. Essayez de réduire la taille de la fenêtre (NFFT) à 16000 x 0,05 = 80 échantillons. Je suggère d'utiliser une plus grande puissance de 2 dans pad_to (128 ou 256).
la source