我想知道是否有一种方法可以使用parselmouth或其他praat的pythonic实现批量处理音频文件并生成完整的语音报告。到目前为止,我只能获得中值音调,但我需要能够计算出脉冲和周期的总数,语音中断的程度和微光。如果使用python无法做到这一点,可以使用praat脚本吗? praat generated voice report
答案 0 :(得分:1)
[免责声明:我是提到的Parselmouth库的作者]
在Gitter chatbox for Parselmouth上提出并解决了这个问题,但为以后参考,这是我在此处建议的解决方案:
之前在StackOverflow上曾问过类似的问题:How to automate voice reports for Praat,说明了如何在不使用Praat“查看和编辑”窗口(例如,使用Sound
,Pitch
的情况下获取语音报告,和PointProcess
对象)。
因此,首先您要获得以下三个对象,即声音,音高音调和PointProcess脉冲,可能会更改您希望具有不同参数的参数:
import parselmouth sound = parselmouth.Sound("the_north_wind_and_the_sun.wav") pitch = sound.to_pitch() pulses = parselmouth.praat.call([sound, pitch], "To PointProcess (cc)")
之后,您可以查询要以不同方式提取的不同数量。例如,可以使用以下方法提取PointProcess中的脉冲数:
n_pulses = parselmouth.praat.call(pulses, "Get number of points")
还有其他人
n_periods = parselmouth.praat.call(pulses, "Get number of periods", 0.0, 0.0, 0.0001, 0.02, 1.3) shimmer_local = parselmouth.praat.call([sound, pulses], "Get shimmer (local)...", 0.0, 0.0, 0.0001, 0.02, 1.3, 1.6)
要获得语音中断的程度要难一些。不知道为什么普拉特没有命令得到这个。
在Python中获取此代码的快速方法是:
max_voiced_period = 0.02 # This is the "longest period" parameter in some of the other queries periods = [parselmouth.praat.call(pulses, "Get time from index", i+1) - parselmouth.praat.call(pulses, "Get time from index", i) for i in range(1, n_pulses)]
degree_of_voice_breaks =总和(如果期间> max_voiced_period,则为该期间的期间)/ sound.duration
您还可以在“语音报告”的输出字符串中找到报告此百分比的行;参见https://stackoverflow.com/a/51657044/2043407
如果您查看Praat用户界面,实际上没有按钮“获取中间值”,因此这行不起作用。但是,在Praat中有一个“获取分位数”命令 所以我建议
parselmouth.praat.call(pitch, "Get quantile", 0.0, 0.0, 0.5, "Hertz")
(那个0.5就是50%的分位数,即中位数)