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
修改说明
- 调整表头,新增
Utterance_Duration列用于存储话语完整时长 - 遍历disfluency区间时,不再提取片段,而是直接遍历Utterance层级的所有区间,通过时间匹配找到对应完整话语
- 计算并写入该完整话语的时长,避免重复disfluency特征的时长
内容的提问来源于stack exchange,提问作者Alice P
相关产品推荐
相关产品推荐

