Scripting 如何在Praat脚本中为声音的特定部分运行语音报告?

Scripting 如何在Praat脚本中为声音的特定部分运行语音报告?,scripting,praat,Scripting,Praat,我是Praat脚本新手,我正在尝试提取语音报告,但在声音文件中,而不是整个文件中,提取特定的开始/结束时间。手册中给出了以下示例: voiceReport$ = Voice report: 0, 0, 75, 500, 1.3, 1.6, 0.03, 0.45 jitter = extractNumber (voiceReport$, "Jitter (local): ") shimmer = extractNumber (voiceReport$, "Shimmer (local): ") w

我是Praat脚本新手,我正在尝试提取语音报告,但在声音文件中,而不是整个文件中,提取特定的开始/结束时间。手册中给出了以下示例:

voiceReport$ = Voice report: 0, 0, 75, 500, 1.3, 1.6, 0.03, 0.45
jitter = extractNumber (voiceReport$, "Jitter (local): ")
shimmer = extractNumber (voiceReport$, "Shimmer (local): ")
writeInfoLine: "Jitter = ", percent$ (jitter, 3), ", shimmer = ", percent$     (shimmer, 3)
这将运行整个文件的语音报告

从其他一些有用的例子中,我能够组合以下脚本,它创建了一个包含“静默”和“声音”层的TextGrid。我想在每个发声行上运行语音报告(beginsound和endsound是标记)

据我所知,语音报告可以在TextGrid选择上运行,也可以在Sound+Pitch+PointProcess对象选择上运行。我不确定如何将语音报告命令添加到我的for循环中。非常感谢任何帮助/指导。谢谢。

简短回答 您提到的
语音报告…
命令中的前两个参数是用于报告的块的开始和结束时间。如果两个值都使用
0
,则Praat会获取整个声音,但您可以指定所需的任何值

# Initial variables, just to make the parameters clearer
pitch_min = 60
pitch_max = 600
time_step = 0.3
silence_threshold = -25
min_pause = 0.1
min_voiced = 0.1
tier = 1

# Detect silences
sound = selected("Sound")
textgrid = To TextGrid (silences): pitch_min, time_step, 
  ... silence_threshold, min_pause, min_voiced, "silent", "sounding"
# The TextGrid is automatically selected
total_intervals = Get number of intervals: tier

# Make the remaining objects
selectObject: sound
pitch = To Pitch: 0, pitch_min, pitch_max
selectObject: sound
pulses = To PointProcess (periodic, cc): pitch_min, pitch_max

# Find beginning and end of sounding intervals 
for i to total_intervals
  selectObject: textgrid
  label$ = Get label of interval: tier, i
  if label$ == "sounding"
    start = Get start point: tier, i
    end   = Get end point: tier, i
    selectObject: sound, pitch, pulses
    report$ = Voice report: start, end,
      ... pitch_min, pitch_max, 1.3, 1.6, 0.03, 0.45
    # Do whatever you want with the report
  endif
endfor

# Clean up
removeObject: textgrid, pitch, pulses
长答覆: 如果只计算一次所需的对象(声音、音高和PointProcess对象),脚本将最快,因为您可以指定时间范围。如果您不是从编辑器中运行它,而是直接使用对象,那么它也将是最快的

您也不需要将TextGrid转换为TableOfReal:您可以直接查询发声间隔的开始时间和结束时间,方法是检查标签的内容以确保它是您想要的间隔

# Initial variables, just to make the parameters clearer
pitch_min = 60
pitch_max = 600
time_step = 0.3
silence_threshold = -25
min_pause = 0.1
min_voiced = 0.1
tier = 1

# Detect silences
sound = selected("Sound")
textgrid = To TextGrid (silences): pitch_min, time_step, 
  ... silence_threshold, min_pause, min_voiced, "silent", "sounding"
# The TextGrid is automatically selected
total_intervals = Get number of intervals: tier

# Make the remaining objects
selectObject: sound
pitch = To Pitch: 0, pitch_min, pitch_max
selectObject: sound
pulses = To PointProcess (periodic, cc): pitch_min, pitch_max

# Find beginning and end of sounding intervals 
for i to total_intervals
  selectObject: textgrid
  label$ = Get label of interval: tier, i
  if label$ == "sounding"
    start = Get start point: tier, i
    end   = Get end point: tier, i
    selectObject: sound, pitch, pulses
    report$ = Voice report: start, end,
      ... pitch_min, pitch_max, 1.3, 1.6, 0.03, 0.45
    # Do whatever you want with the report
  endif
endfor

# Clean up
removeObject: textgrid, pitch, pulses
旁白 尽管可以忽略这一点,但作为旁白,您也在计算一些您并不真正需要的变量。在脚本中,
sound
soundid
具有相同的值,而
textgrid
textgridid
也具有相同的值。这是:

To TextGrid (silences)... 60 0.3 0.1 silent sounding
textgridid = selected("TextGrid")
可以转向这个

textgridid = To TextGrid (silences): 60, 0.3, 0.1, "silent", "sounding"
您还混合了“速记”和新的语法样式,这肯定会使事情变得混乱。我更喜欢新款式