Ich benutze die specgram()
Funktion in matplotlib
, um Spektrogramme von Sprachwellendateien in Python zu generieren, aber die Ausgabe ist immer von erheblich schlechterer Qualität als die, die meine normale Transkriptionssoftware Praat generieren kann. Zum Beispiel der folgende Aufruf:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Erzeugt dies:
Während Praat an demselben Audiobeispiel mit den folgenden Einstellungen arbeitet:
- Sichtbereich: 0-8000Hz
- Fensterlänge: 0,005s
- Dynamikbereich: 70dB
- Zeitschritte: 1000
- Frequenzschritte: 250
- Fensterform: Gauß
Erzeugt dies:
Was mache ich falsch? Ich habe versucht, mit allen specgram()
Parametern zu experimentieren, aber nichts scheint die Auflösung zu verbessern. Ich habe praktisch keine Erfahrung mit FFTs.
fft
spectrogram
python
Alek Storm
quelle
quelle
Antworten:
Hier sind die matplotlib.specgram-Parameter
Die in der Fragenbeschreibung angegebenen Parameter müssen in vergleichbare mpl.specgram-Parameter konvertiert werden. Das Folgende ist ein Beispiel für die Zuordnung:
Wenn Sie 8 ms verwenden, erhalten Sie eine Potenz von 2 FFT (128). Das Folgende ist die Beschreibung der Praat-Einstellungen von ihrer Website
Link zu den Praat-Einstellungen
Die Frage des OP könnte sich auf den Kontrastunterschied zwischen dem Praat-Specgramm und dem MPL-Specgramm (Matplotlib) beziehen. Praat hat eine Dynamic Range- Einstellung, die den Kontrast beeinflusst. Die MPL-Funktion hat keine ähnliche Einstellung / Parameter. Das mpl.specgram gibt das 2D-Array von Leistungspegeln (das Spektrogramm) zurück, mit dem der Dynamikbereich auf das Return-Array angewendet und neu gezeichnet werden kann.
Das Folgende ist ein Codeausschnitt, um die folgenden Darstellungen zu erstellen. Das Beispiel ist ~ 1m15s Sprache mit einem Chirp von 20Hz-8000Hz.
quelle
Es scheint ein Problem mit der Zeit- / Frequenzauflösung zu sein. Ihr Praat-Plot hat eine schlechtere Frequenzauflösung (Sie können die Harmonischen nicht einmal klar erkennen) und eine bessere Zeitauflösung. Versuchen Sie, die Fenstergröße (NFFT) auf 16000 x 0,05 = 80 Samples zu reduzieren. Ich würde vorschlagen, eine größere Potenz von 2 in pad_to (128 oder 256) zu verwenden.
quelle