Определите выборку в формантах Parselmouth Python

#python #sample-rate #praat

Вопрос:

Я очень новичок в praat parselmouth на python, и я большой поклонник, так как он позволяет анализировать без Praat. Поэтому моя проблема в том, что мне нужны форманты с определенной частотой дискретизации, но я не могу изменить ее здесь. Если я изменю временной шаг (а также временное окно), длина списка формантов не изменится. Я в основном использую этот код: # http://blog.syntheticspeech.de/2021/03/10/how-to-extract-formant-tracks-with-praat-and-python/

и это выглядит так

 f0min= 75
f0max=300
pointProcess = praat.call(sound, "To PointProcess (periodic, cc)", f0min, f0max)

time_step = 0.01          # or 0.002 see picture
max_formant_num = 5
max_formant_freq = 5000   # men 5000, women 5500
window_length =  0.01      # or 0.002 see picture   
preemphasis = 50

formants = praat.call(sound, "To Formant (burg)", time_step, max_formant_num, max_formant_freq, window_length, preemphasis) 

numPoints = praat.call(pointProcess, "Get number of points")
print(numPoints)
f1_list = []
f2_list = []
f3_list = []
for point in range(0, numPoints):
    point  = 1
    t = praat.call(pointProcess, "Get time from index", point)
    f1 = praat.call(formants, "Get value at time", 1, t, 'Hertz', 'Linear')
    f2 = praat.call(formants, "Get value at time", 2, t, 'Hertz', 'Linear')
    f3 = praat.call(formants, "Get value at time", 3, t, 'Hertz', 'Linear')
    f1_list.append(f1)
    f2_list.append(f2)
    f3_list.append(f3)
 

Я не могу получить частоту дискретизации, которую я хотел бы (например, 30 Гц). Кто-нибудь может помочь?

здесь я строю график f1 для обоих временных шагов, но он по-прежнему одинаковой длины (323) и временных точек

Ответ №1:

Итак, теперь я внес изменения («Получить количество кадров»), и я могу определить/ изменить частоту дискретизации. Он также работает для части файла wav, но в ~половине я получаю это сообщение об ошибке: Ошибка: аргумент «Время» имеет значение «неопределенное». Для строки, в которой я хочу определить f1

 numPoints = praat.call(formants, "Get number of frames")
print(numPoints)
f1_list = []
f2_list = []
f3_list = []
t_list  = [] # timing
i= 0
for point in range(0, numPoints):
    point  = 1
    t = praat.call(pointProcess, "Get time from index", point)
    f1 = praat.call(formants, "Get value at time", 1, t, 'Hertz', 'Linear')
    f2 = praat.call(formants, "Get value at time", 2, t, 'Hertz', 'Linear')
    f3 = praat.call(formants, "Get value at time", 3, t, 'Hertz', 'Linear')
    t_list.append(t)
    f1_list.append(f1)
    f2_list.append(f2)
    f3_list.append(f3)
 

Ответ №2:

Для справки: исходный вопрос также был задан на Гиттере (или, по крайней мере, этот вопрос был связан с); см. https://gitter.im/PraatParselmouth/Lobby?at=610be18129b165332e5e61f2

Похоже, что обе проблемы имеют одну и ту же основную причину: вы используете parselmouth.praat.call для запроса длины или PointProcess объекта или с помощью этого объекта преобразуете индекс во время, но затем используете результаты для Formant объекта.

В первом случае именно поэтому вы всегда получаете одинаковое количество очков (временных точек pointProcess ), в то время как вам нужно количество «кадров» formants . Это также объясняет, почему вы получаете те же точки, но более грубую (интерполированную) кривую на своих графиках.

Во втором случае вы спрашиваете о времени точек в PointProcess выборках, а не о времени , в течение которого оценивались форманты.

Я вижу, что то же самое происходит в посте в блоге, на который вы ссылаетесь. Потенциально это правильно, если вы хотите попробовать форманты в точках, где Прат оценивает голосовые импульсы, но это, кажется, немного отличается от вашей цели?

Комментарии:

1. Хорошо, да, это правда. У меня есть другая цель. Но как я могу продолжать сейчас, чтобы код давал мне форманты для временных точек?

2. Вы можете получить время формантных кадров, а не точечного процесса: t = praat.call(formants, "Get time from frame number", point) . Я бы также предложил написать t = praat.call(formants, "Get time from frame number", point 1) и избавиться от point = 1 строки раньше.