You are on page 1of 8

Praat 语音标注及数据提取

1. 文件的读取和保存
最常用的两种文件:原始音频文件.wav 和标注文件.textgrid
只有音频文件时,用 annotate 来创建该音频文件对应的 textgrid 文件
Annotate—to textgrid——设置参数:tier name____?(如设置第一层为词,第二层为声
韵母)、point tier_____?(哪一层为点标记层)
编辑完 textgrid 文件后一定要记得手动保存,在 wav 文件相同的文件夹下。

2. Textgrid 文件的标注要点
对 wav 文件进行标注,主要目的是切分音段,以便进行不同位点的声学数据提取
1) 操作按键
快捷键:tab—播放被选中的或窗口中的音频
Ctrl+1—在第一层 tier 上加 boundary
Ctrl+s—保存
按键: sel—放大选中的区域至全部窗口
2) 切分音节或音素 interval 时需结合频谱图、声波图、基频曲线的特征来进行切分。
↑左边是频谱值范围 右边表示基频值范围↑

·频谱图用于观察共振峰的变化(音质的变化),三个共振峰可以判断出 vowel quality(即


区分该元音和其它元音的特征)
·基频用于分析音高的变化。
·需注意 praat 分析的基频数据是由不同算法计算得出的,因此 praat 版本的不同、分析时
采用的方法和参数设置不同会导致提取到的声学数据不同。这也提醒我们应注意甄别假值:
正常人声的基频曲线不应有过多剧烈波动,也可结合共振峰曲线来判断,基频曲线走势应和
共振峰走势相同。
·声调的载荷单位就是韵腹+韵尾,确定声调开始和结束的位置可根据基频曲线和频谱图共
振峰来判断,弯头降尾(声调开始的拐弯和末尾的下降)是要去掉的。
3) 基频分析参数设置
若使用 praat 标注音段的目的是提取对应的基频,则需注意基频分析参数的设置。一般
分析参数设置为默认值就可以满足分析需求,如下图所示为默认 pitch settings,analysis
method 设置为 filtered cross-correlation 即可。(官网建议:“测量声带振动频率或语调时,
使用“filtered ac”对于语音分析,如语音病理领域,使用 raw cc”。How to choose a pitch
analysis method (uva.nl))
·Voicing threshold (标准值: 0.50)
超过这个阈值就是有基频浊音,没超过就是清音,他就不会计算基频值。

·Octave cost (标准值: 0.055 per octave)

对高频候选值的倾向程度,和自相关最大值有关。这是必要的,因为即使(或:特别是)在一个完全周期信号的情况下,F0
的所有底音都是与 F0 本身是同样强的候选值。要想更有力地支持选择高频候选值,就要提高这个值。

·Octave-jump cost (标准值: 0.35)

对音高变化不利的程度,和自相关最大值有关。要减少大频率跳变的次数,请增加此值。与本文中描述的相反,该值将根
据时间步进行校正:乘以 0.01 s / TimeStep,以获得本文中公式中使用的值。

在分析轻声词时,建议设置参数:调小 voicing threshold 为 0.1,另外 octave-jump 和


octave-jump cost 的值调小一点也可以更敏锐地捕捉到音节末尾的基频。
如下两图中,将 voicing threshold 由默认设置 0.5 变为 0.1,分析出的“拳头”一词的轻
声音节“头”的基频曲线也发生了变化。
3. praat 脚本批量提取语音数据
Praat 脚本-000 | 实用的 Praat 脚本总索引-CSDN 博客
GitHub - feelins/Praat_Scripts: Some basic praat scripts.

提取音节始末基频:
#文件路径
directory1$ = "C:\Users\cyr\Desktop\1"

#文件 1.text 删除
filedelete 1.txt
#创建文件 1.text 并写入
fileappend 1.txt sound timePoint pitchPoint pitch 'newline$'
#调用程序
call getF0 'directory1$' 1
select Strings textgridList
Remove

procedure getF0 directory$ tone$


#创建 textgird 文件列表
Create Strings as file list... textgridList 'directory$'\*.TextGrid

#总共有多少个 textgrid 文件
nTextgrid = Get number of strings
#用 for loop 挨个读取 textgrid 文件
for iTextgrid to nTextgrid

#选择文件列表对象
select Strings textgridList
iTextGrid$ = Get string... iTextgrid

#得到没有 textgrid 后缀的文件名


myTextGrid$ = left$ (iTextGrid$, length(iTextGrid$) - 9)

#读取路径下对应文件名的 textgrid 文件
Read from file... 'directory$'\'iTextGrid$'

#得到 P1 开始的时间点
Get starting points... 1 "is equal to" P1
p1Start = Get time from index... 1
Remove

#选中 textgrid 文件
select TextGrid 'myTextGrid$'

#得到 P1 结束的时间点
Get end points... 1 "is equal to" P1
p1End = Get time from index... 1
Remove
select TextGrid 'myTextGrid$'
Remove

#计算 P1 interval 的时长


duration = 'p1End' - 'p1Start'

#读取路径下对应文件名的 wav 文件 进行 to pitch 分析


Read from file... 'directory$'\'myTextGrid$'.wav
To Pitch... 0 75 600

#用 for loop 提取从起点到终点时的对应时间点和对应基频


for iPoint to 2
#timepoint 为 0(ipoint=1 时)或 P1 音节时长(ipoint=2 时)
timePoint = 'duration'/1 * (iPoint - 1)
#pitchPoint 为提取 pitch 时的时间点(ipoint=1 时为 P1 起始时间点,=2 时为
P1 末尾时间点)
pitchPoint = 'p1Start' + 'timePoint'
#提取 pitchPoint 时间点的基频值
pitch = Get value at time... 'pitchPoint' Hertz Linear
#文件写入提取值
fileappend 'tone$'.txt 'myTextGrid$' 'timePoint' 'pitchPoint' 'pitch' 'newline$'
endfor

select Sound 'myTextGrid$'


plus Pitch 'myTextGrid$'
Remove
endfor
endproc

You might also like