1

有没有办法为 Praat 自动生成语音报告(在“查看和编辑”窗口中的“脉冲”下),因为我必须为 100 多个文件执行此操作。我需要整个文件的语音报告,并且最好在 Python 中执行此操作,因为我对此很熟悉。

4

2 回答 2

4

[免责声明:我是提到的 Parselmouth 图书馆的作者]

根据您的实际目标,您似乎可以在声音编辑器菜单之外获得相同的“语音报告”View & Edit输出SoundAnalyse periodicity > To Pitch...用单击)。之后,选择所有 3 个对象(、、)和操作将允许您获得输出。SoundPitchTo PointProcess (cc)SoundPitchPointProcessVoice report...

这甚至适用于 Praat 的批处理版本(即,没有图形用户界面)。我不是编写 Praat 脚本的专家,但转换此工作流程似乎相当简单。

至于您问题的另一部分:使用Parselmouth库实际上可以使用 Python 。这是我一直在创建的一个开源库,它允许以 Python 直观的方式从 Python 访问 Praat:

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)")
voice_report_str = parselmouth.praat.call([sound, pitch, pulses], "Voice report", 0.0, 0.0, 75, 600, 1.3, 1.6, 0.03, 0.45)

对于某些事情,对象上存在 Python 方法,对于其他一些功能,您需要使用parselmouth.praat.call,直到在库上完成更多工作。但它适用于 Python。

但是,如果您只对语音报告的一部分感兴趣并希望将这些作为实际的数字变量(例如,因为您想对所有 100 个文件运行一些统计信息?),所有这些东西都可以独立于Voice report功能。例如,仅获取某个声音文件的平均音高为 Python float

mean_pitch = parselmouth.praat.call(pitch, "Get mean", 0.0, 0.0, "Hertz")
于 2018-08-02T15:14:27.683 回答
0

语音报告是一个编辑器命令,因此在 Praat 的批处理实例中不可用。您将需要一个连接到 GUI 的 Praat 实例(否则会出现Cannot view or edit a Sound from batch错误)。

我不熟悉当前的 Python 特定库,所以我不知道是否有一个可以回避这个问题的库(我对此表示怀疑)。也就是说,您可以通过使用sendpraat程序控制远程 Praat 实例来避免这种情况,该实例又可以连接到 GUI。有关如何工作的更多信息,请参阅此答案。

您可以在下面找到使用 Praat 本身的脚本语言的答案。这可以放入脚本中并作为系统命令(或使用发送sendpraat)从您喜欢的任何语言中执行。

form Voice report...
  positive F0_min 50
  positive F0_max 500
endform

sound = selected("Sound")
end = Get total duration

View & Edit
editor: sound
  # Optimise settings for voice research 
  # and make sure things are turned on
  Pitch settings: f0_min, f0_max, 
    ... "Hertz", "cross-correlation", "automatic"
  info$ = Editor info
  if !extractNumber(info$, "Pulses show:")
    Show pulses
  endif

  Select: 0, end
  report$ = Voice report
endeditor

# Remove header from report
# This leaves text that is parsable as YAML
report$ = replace_regex$(report$, "-- Voice report .*\n", "", 1)
report$ = replace_regex$(report$, "\nTime range .*\n", "", 1)
report$ = replace_regex$(report$, "\s*From 0 to .*\n", "", 1)

writeInfoLine: report$

语音报告(与 Praat 的大多数输出​​一样)主要计划由人类使用,因此机器解析并非易事。我在答案中添加了一些额外的命令来预处理语音报告,以使输出至少可以被 YAML 解析,这可能会使您的情况变得更容易。

于 2017-07-21T17:49:54.407 回答