#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 Гц). Кто-нибудь может помочь?
Ответ №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
строки раньше.