Używam tej specgram()
funkcji matplotlib
do generowania spektrogramów plików fal mowy w Pythonie, ale wynik jest zawsze znacznie gorszej jakości niż to, co może wygenerować moje normalne oprogramowanie do transkrypcji, Praat. Na przykład następujące połączenie:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Generuje to:
Podczas korzystania z programu Praat, praca na tym samym próbce audio z następującymi ustawieniami:
- Zakres widzenia: 0–8000 Hz
- Długość okna: 0,005s
- Zakres dynamiczny: 70dB
- Przedziały czasowe: 1000
- Kroki częstotliwości: 250
- Kształt okna: gaussowski
Generuje to:
Co ja robię źle? Próbowałem bawić się wszystkimi specgram()
parametrami, ale wydaje się, że nic nie poprawia rozdzielczości. Nie mam praktycznie żadnego doświadczenia z FFT.
fft
spectrogram
python
Alek Storm
źródło
źródło
Odpowiedzi:
Oto parametry matplotlib.specgram
Parametry podane w opisie pytania należy przekonwertować na porównywalne parametry mpl.specgram. Oto przykład odwzorowania:
Jeśli użyjesz 8ms, otrzymasz moc 2 FFT (128). Poniżej znajduje się opis ustawień Praat z ich strony internetowej
Link do ustawień Praat
Pytanie OP może dotyczyć różnicy kontrastu między specgramem Praat a specgramem mpl (matplotlib). Praat ma ustawienie zakresu dynamicznego , które wpływa na kontrast. Funkcja mpl nie ma podobnego ustawienia / parametru. Mpl.specgram zwraca tablicę 2D poziomów mocy (spektrogram), zakres dynamiczny można zastosować do tablicy powrotnej i ponownie wykreślić.
Poniżej znajduje się fragment kodu umożliwiający utworzenie poniższych wykresów. Przykładem jest ~ 1m15s mowy z ćwierkaniem od 20 Hz do 8000 Hz.
źródło
Wydaje się, że jest to problem z rozdzielczością czas / częstotliwość. Twój wykres Praata ma gorszą rozdzielczość częstotliwości (nawet nie widać wyraźnie harmonicznych) i lepszą rozdzielczość czasową. Spróbuj zmniejszyć rozmiar okna (NFFT) do 16000 x 0,05 = 80 próbek. Sugerowałbym użycie większej mocy 2 w pad_to (128 lub 256).
źródło