Я использую specgram()
функцию matplotlib
для генерации спектрограмм файлов речевых волн в Python, но результат всегда значительно хуже, чем то, что может генерировать мое обычное программное обеспечение для транскрипции, Praat. Например, следующий вызов:
specgram(
fromstring(spf.readframes(-1), 'Int16'),
Fs=framerate,
cmap=cm.gray_r,
)
Создает это:
Пока Praat работает над тем же аудиосэмплом со следующими настройками:
- Диапазон просмотра: 0-8000 Гц
- Длина окна: 0,005 с
- Динамический диапазон: 70 дБ
- Шаг по времени: 1000
- Частота шагов: 250
- Форма окна: гауссов
Создает это:
Что я делаю не так? Я попытался поиграться со всеми specgram()
параметрами, но, кажется, ничто не улучшило разрешение. У меня практически нет опыта работы с БПФ.
fft
spectrogram
python
Алек Шторм
источник
источник
Ответы:
Вот параметры matplotlib.specgram
Параметры, приведенные в описании вопроса, необходимо преобразовать в сопоставимые параметры mpl.specgram. Ниже приведен пример сопоставления:
Если вы используете 8 мс, вы получите мощность 2 БПФ (128). Ниже приведено описание настроек Praat с их веб-сайта.
Ссылка на настройки Praat
Вопрос ОП может касаться разницы в контрасте между программой Praat и программой mpl (matplotlib). Praat имеет настройку динамического диапазона, которая влияет на контраст. Функция mpl не имеет аналогичных настроек / параметров. Mpl.specgram возвращает двумерный массив уровней мощности (спектрограмму), динамический диапазон может быть применен к возвращаемому массиву и перенастроен.
Ниже приведен фрагмент кода для создания графиков ниже. Пример - речь ~ 1m15s с частотой от 20 Гц до 8000 Гц.
источник
Кажется, это проблема разрешения времени / частоты. Ваш график Праата имеет худшее разрешение по частоте (вы даже не можете четко видеть гармоники) и лучшее разрешение по времени. Попробуйте уменьшить размер окна (NFFT) до 16000 x 0,05 = 80 выборок. Я бы предложил использовать большую степень 2 в pad_to (128 или 256).
источник