You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Praat脚本开发:如何提取对应Utterance层级的区间时长

解决TextGrid脚本中获取对应话语时长的问题

选中的TextGrid包含两个区间层级:Utterance(话语)层级和标记disfluency(语流中断)特征的层级。现有Praat脚本可提取disfluency特征、起止时间、时长及对应话语,但无法正确获取对应话语的完整时长,总是重复disfluency特征自身的时长。原脚本如下:

tierWords = 2
tierdis = 3
resultfile$ = "/Users/alice/Desktop/results.tsv"
writeFile: resultfile$
titleline$ = "Dis   Start   End Duration    Utterance   'newline$'"
fileappend "'resultfile$'" 'titleline$'
#select your TextGrid
tg = selected("TextGrid")
nint_tierdis = Get number of intervals: tierdis
for int_tierdis to nint_tierdis
    selectObject: tg
    dis$ = Get label of interval: tierdis, int_tierdis
    if dis$ <> ""
        appendFile: resultfile$, dis$
        start = Get starting point: tierdis, int_tierdis
        end = Get end point: tierdis, int_tierdis
        duration = end-start
        appendFile: resultfile$, tab$, start, tab$, end, tab$, duration
        extractedTg = Extract part: start, end, "yes"
        nint_tierWords = Get number of intervals: tierWords
        for int_tierWords to nint_tierWords
            word$ = Get label of interval: tierWords, int_tierWords
            appendFile: resultfile$, tab$, word$, newline$
        endfor
removeObject: extractedTg
endif
endfor

解决思路与修改后的代码

原脚本错误地提取了disfluency特征时间范围内的话语片段,导致只能拿到特征覆盖的时长。正确做法是找到disfluency特征所在的完整Utterance区间,获取该区间的起止时间计算时长:

tierUtterance = 2  # Utterance层级编号
tierDisfluency = 3 # disfluency层级编号
resultfile$ = "/Users/alice/Desktop/results.tsv"

# 初始化结果文件,更新表头加入话语时长列
writeFile: resultfile$
titleline$ = "Disfluency\tStart\tEnd\tDuration\tUtterance\tUtterance_Duration\n"
fileappend: resultfile$, titleline$

tg = selected("TextGrid")
nint_dis = Get number of intervals: tierDisfluency
nint_utt = Get number of intervals: tierUtterance  # 获取话语层级的总区间数

for int_dis to nint_dis
    selectObject: tg
    dis_label$ = Get label of interval: tierDisfluency, int_dis
    if dis_label$ <> ""
        # 获取disfluency特征的时间信息
        dis_start = Get starting point: tierDisfluency, int_dis
        dis_end = Get end point: tierDisfluency, int_dis
        dis_duration = dis_end - dis_start
        
        # 寻找包含该disfluency的完整Utterance区间
        utt_label$ = ""
        utt_duration = 0
        for int_utt to nint_utt
            utt_start = Get starting point: tierUtterance, int_utt
            utt_end = Get end point: tierUtterance, int_utt
            # 检查disfluency的起始时间是否落在当前Utterance区间内
            if dis_start >= utt_start and dis_start < utt_end
                utt_label$ = Get label of interval: tierUtterance, int_utt
                utt_duration = utt_end - utt_start
                break  # 找到对应区间后跳出循环
            endif
        endfor
        
        # 将所有信息写入结果文件
        appendFile: resultfile$, dis_label$, tab$, \
            dis_start, tab$, dis_end, tab$, dis_duration, tab$, \
            utt_label$, tab$, utt_duration, newline$
    endif
endfor

修改说明

  1. 调整表头,新增Utterance_Duration列用于存储话语完整时长
  2. 遍历disfluency区间时,不再提取片段,而是直接遍历Utterance层级的所有区间,通过时间匹配找到对应完整话语
  3. 计算并写入该完整话语的时长,避免重复disfluency特征的时长

内容的提问来源于stack exchange,提问作者Alice P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:02:47