pratt手册中的脚本程序范文.docx
《pratt手册中的脚本程序范文.docx》由会员分享,可在线阅读,更多相关《pratt手册中的脚本程序范文.docx(63页珍藏版)》请在冰豆网上搜索。
pratt手册中的脚本程序范文
(一)提取二维频谱中某个频率位置的能量值
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#然后在对象列表窗口选定并编辑(Edit)一个二维频谱对象(Spectrum),再在
二维频谱对象上将游标定位到您需要测量其能量的频率位置;
#然后按脚本编辑器的Run菜单下的Run按钮;
#执行结束后,您将在弹出的信息窗口中看见该频率位置的能量值。
clearinfo
spectrumN$=selected$("Spectrum")
editorSpectrum'spectrumN$'
pitchV=Getcursor
endeditor
binNum=Getnumberofbins
binW=Getbinwidth
binN=Getbinnumberfromfrequency...'pitchV'
binNQ=floor(binN)
binNH=ceiling(binN)
pitchQ=Getfrequencyfrombinnumber...'binNQ'
pitchH=Getfrequencyfrombinnumber...'binNH'
ifpitchH-pitchQ>0
rV=Getrealvalueinbin...'binNQ'
rV=rV
iV=Getimaginaryvalueinbin...'binNQ'
iV=iV
shengYaQ=(rV*rV+iV*iV)^0.5
dBQ=20*log10(shengYaQ/2*10^5)+15
rV=Getrealvalueinbin...'binNH'
rV=rV
iV=Getimaginaryvalueinbin...'binNH'
iV=iV
shengYaH=(rV*rV+iV*iV)^0.5
dBH=20*log10(shengYaH/2*10^5)+15
juli=(pitchV-pitchQ)/(pitchH-pitchQ)
dB=dBQ+(dBH-dBQ)*juli
endif
ifpitchH-pitchQ=0
rV=Getrealvalueinbin...'binN'
rV=rV
iV=Getimaginaryvalueinbin...'binN'
iV=iV
shengYa=(rV*rV+iV*iV)^0.5
dB=20*log10(shengYa/2*10^5)+15
endif
print'dB'
(二)提取二维频谱中前n个谐波峰的能量值
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#然后在对象列表窗口选定并编辑(Edit)一个二维频谱对象(Spectrum),并测
量其第10个谐波的中心频率,再除以10以得到这个时点的基频值;
#然后按脚本编辑器的Run菜单下的Run按钮,接下来在弹出的对话窗口
里输入您刚才测定的基频值和需要测量的谐波峰数目n;
#执行结束后,您将在弹出的信息窗口中看见n个谐波峰位置的能量值。
form对话框
positiveFrequency_Zero_(Hz)100
positiveThe_Number_of_harmonics10
endform
fZero=frequency_Zero
fNum=the_Number_of_harmonics
print'fNum'
clearinfo
forjfrom1tofNum
pitchV=fZero*j
binNum=Getnumberofbins
binW=Getbinwidth
binN=Getbinnumberfromfrequency...'pitchV'
binNQ=floor(binN)
binNH=ceiling(binN)
pitchQ=Getfrequencyfrombinnumber...'binNQ'
pitchH=Getfrequencyfrombinnumber...'binNH'
ifpitchH-pitchQ>0
rV=Getrealvalueinbin...'binNQ'
rV=rV
iV=Getimaginaryvalueinbin...'binNQ'
iV=iV
shengYaQ=(rV*rV+iV*iV)^0.5
dBQ=20*log10(shengYaQ/2*10^5)+15
rV=Getrealvalueinbin...'binNH'
rV=rV
iV=Getimaginaryvalueinbin...'binNH'
iV=iV
shengYaH=(rV*rV+iV*iV)^0.5
dBH=20*log10(shengYaH/2*10^5)+15
juli=(pitchV-pitchQ)/(pitchH-pitchQ)
dB=dBQ+(dBH-dBQ)*juli
endif
ifpitchH-pitchQ=0
rV=Getrealvalueinbin...'binN'
rV=rV
iV=Getimaginaryvalueinbin...'binN'
iV=iV
shengYa=(rV*rV+iV*iV)^0.5
dB=20*log10(shengYa/2*10^5)+15
endif
print'dB''newline$'
endfor
(三)提取二维频谱中各频率成分的能量值
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#然后在对象列表窗口中选定一个二维频谱对象(Spectrum);
#然后按脚本编辑器的Run菜单下的Run按钮;
#执行结束后,您将在"C:
/temp.txt"文件中得到各频率成分的能量值。
saveFileName$="c:
/temp.txt"
filedelete'saveFileName$'
binNum=Getnumberofbins
binW=Getbinwidth
fileappend'saveFileName$'Hz
fileappend'saveFileName$',
fileappend'saveFileName$'dB
fileappend'saveFileName$''newline$'
forifrom1tobinNum
rV=Getrealvalueinbin...'i'
iV=Getimaginaryvalueinbin...'i'
shengYa=(rV*rV+iV*iV)^0.5
dB=20*log10(shengYa/2*10^5)+15
pitchV=(i-1)*binW
fileappend'saveFileName$''pitchV'
fileappend'saveFileName$',
fileappend'saveFileName$''dB'
fileappend'saveFileName$''newline$'
endfor
endfor
(四)将共振峰频率数据提取到TextGrid对象中
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#打开一个声音,并按对象列表右侧的Edit按钮来编辑这个声音,选择Show
Spectrogram和ShowFormant按钮前的对钩。
并将显示窗口调整到合适的横轴显
示比例,将游标定位到需要测量共振峰的位置上(一般定位在共振峰数据比较稳
定的地方或发生变化的地方,而不能放在那些红点散乱的位置);
#然后按脚本编辑器的菜单"Run"下的"Run"按钮即可执行;
#运行这段程序后,会出现一个对话框,询问您要提取多少个共振峰数据,
默认为3个,另外还要询问您是否需要新建一个TextGrid对象来保存共振峰数据,
如果在对象列表窗口中没有对应于声音对象的TextGrid对象,请选择"Create
TextGrid(forFirstTime)"按钮前的复选框,然后按"OK"按钮运行即可;如果已经
有了TextGrid对象,则不必选择"CreateTextGrid(forFirstTime)"按钮前的复选框,
直接按"OK"按钮运行即可。
另外请保持FormantNumber与第一次设定的个数一
致,后面的操作过程不必修改它;
#这个程序将提取出游标位置的共振峰频率数据和带宽数据,并把它写到一
个TextGrid类型的文件之中,在TextGrid对象中它们之间用“-”分开,“-”之
前表示共振峰的中心频率值,“-”之后表示共振峰的带宽;如果所提取出来的数
据不够准确,请在TextGrid对象中进行修改,最后请记作保存TextGrid对象。
form对话框
positiveFormant_Number_(no_more_than_5)3
booleanCreate_TextGrid_(for_First_Time)0
endform
nf=formant_Number
createTextgrid=create_TextGrid
soundN$=selected$("Sound")
textGridN$=soundN$+"_Formant"
editorSound'soundN$'
Showanalyses...yesnonoyesno10
time=Getcursor
forifrom1tonf
f'i'=Getformant...'i'
b'i'=Getbandwidth...'i'
endfor
endeditor
ifcreateTextgrid=1
ifnf=5
ToTextGrid..."F5F4F3F2F1"F5F4F3F2F1
endif
ifnf=4
ToTextGrid..."F4F3F2F1"F4F3F2F1
endif
ifnf=3
ToTextGrid..."F3F2F1"F3F2F1
endif
Rename...'textGridN$'
endif
selectTextGrid'textGridN$'
forifrom1tonf
fV=floor(f'i')
bV=floor(b'i')
txt$=fixed$(fV,0)+"-"+fixed$(bV,0)
Insertpoint...nf+1-itime'txt$'
endfor
endif
selectSound'soundN$'
(五)将TextGrid对象中的共振峰数据转换成文本文件
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#再在对象列表窗口中选定一个用来登记共振峰数据的TextGrid对象;
#然后按脚本编辑窗口的Run菜单下的Run按钮执行程序;
#执行结束后,您将在"C:
/temp.txt"文件中得到这个TextGrid对象内的数据,
您可以使用Excell表格读取该文件。
saveFileName$="c:
/temp.txt"
filedelete'saveFileName$'
tN=Getnumberoftiers
forifrom1totN
nF=Gettiername...'i'
pN=Getnumberofpoints...'i'
forjfrom1topN
lP$=Getlabelofpoint...'i''j'
ifindex(lP$,"-")>0
a=index(lP$,"-")-1
b=length(lP$)
b=b-a-1
fP'i''j'=extractNumber(left$(lP$,a),"")
bP'i''j'=extractNumber(right$(lP$,b),"")
else
fP'i''j'=extractNumber(lP$,"")
bP'i''j'=100
endif
tP'j'=Gettimeofpoint...'i''j'
endfor
endfor
fileappend'saveFileName$'时点(ms)
fileappend'saveFileName$',
forifrom1totN
a=tN+1-i
fileappend'saveFileName$'F
fileappend'saveFileName$''a'
fileappend'saveFileName$',
endfor
forifrom1totN
a=tN+1-i
fileappend'saveFileName$'Bandwidth
fileappend'saveFileName$''a'
fileappend'saveFileName$',
endfor
fileappend'saveFileName$''newline$'
forjfrom1topN
tt=floor(tP'j'*1000)
fileappend'saveFileName$''tt'
fileappend'saveFileName$',
forifrom1totN
ll=fP'i''j'
fileappend'saveFileName$''ll'
fileappend'saveFileName$',
endfor
forifrom1totN
ll=bP'i''j'
fileappend'saveFileName$''ll'
fileappend'saveFileName$',
endfor
fileappend'saveFileName$''newline$'
endfor
(六)制作声学元音图
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#然后按脚本编辑窗口的Run菜单下的Run按钮执行程序;运行时,会弹
出一个对话框,如下图所示:
#如果您要自己输入元音的音标及其F1和F2的值,则分别在对话框的前三
个输入窗口中输入;如果您不准备自己手工输入(即由程序自动从声音编辑窗口
和标注窗口中提取您所指定位置的数据),则保持对话框的前三个输入窗口的数
据不变。
对话框的第四个窗口用来输入F1的范围,对话框的第五个窗口用来输
入F2的范围,这两个值一般根据您所画元音里的F1和F2的最大值来决定,通
常可以保持不变。
对话框的第六个窗口用来输入声学元音图的宽度,对话框的第
七个窗口用来输入声学元音图的高度,一般也可以保持不变。
对话框最底下的那
个复选框用来确定是否重新作图,只在做第一个元音图时打钩,接下来做其他元
音时就不能再打钩了,否则前面所做好的图就被取消了。
设置好之后,按对话框
上的“OK”按钮提交运行即可。
#如果您不是手工输入元音的音标及其F1和F2的值,那么您需要在对象列
表窗口中选定声音文件对象和相应的标注文件,并将它们合并在一起打开来编
辑,在编辑窗口分析显示出声音的共振峰数据,还需要在相应的标注文件里标注
出该元音的音标,然后把游标定位到合适的共振峰位置上,设置好这些之后再运
行这个脚本程序。
运行时,还可以在上图1、2、3位置修改元音的音标及其F1
和F2的值。
form输入框
commentIfyouthinkthevaluestokenfromtheeditorarewrong,
commentpleaseinputthecorrectvaluesinthefollowingtextbox:
sentenceVowel_Symboloriginal
realFrequency_of_First_Formant_(Hz)0(=autoinput)
realFrequency_of_Second_Formant_(Hz)0(=autoinput)
positiveMaximum_Frequency_of_First_Formant_(Hz)1000
positiveMaximum_Frequency_of_Second_Formant_(Hz)3000
positiveWidth_of_the_picture5
positiveHeight_of_the_picture5
booleanDraw_the_vowel_on_a_new_picture0
endform
vowelN$=vowel_Symbol$
fff=frequency_of_First_Formant
fsf=frequency_of_Second_Formant
newPic=draw_the_vowel_on_a_new_picture
hyu=maximum_Frequency_of_Second_Formant
zyu=maximum_Frequency_of_First_Formant
wP=width_of_the_picture
hP=height_of_the_picture
wP=wP+0.5
hP=hP+0.5
hjiange=hyu/10000
zjiange=zyu/10000
ifvowelN$="original"
textName$=selected$("TextGrid")
editorTextGrid'textName$'
txt$=Getlabelofinterval
endeditor
else
txt$=vowelN$
endif
iffff=0
textName$=selected$("TextGrid")
editorTextGrid'textName$'
ff=Getfirstformant
endeditor
else
ff=fff
endif
iffsf=0
textName$=selected$("TextGrid")
editorTextGrid'textName$'
fs=Getsecondformant
endeditor
else
fs=fsf
endif
ff=1-ff/zyu
fs=1-fs/hyu
ifnewPic=1
Eraseall
Viewport...0.5'wP'0.5'hP'
Black
Plainline
Drawline...0010
Drawline...0111
Drawline...1110
Drawline...0100
forifrom0to10
a=i/10
b=(10-i)*hjiange
b='b:
2'
Black
Plainline
Textspecial...'a'Centre1BottomTimes100'b'
Grey
Dottedline
ifa<>0anda<>1
Drawline...'a'1'a'0
endif
endfor
forifrom0to9
a=i/10
b=(10-i)*zjiange
b='b:
2'
Plainline
Black
Textspecial...1Left'a'BottomTimes100'b'
Grey
Dottedline
ifa<>0anda<>1
Drawline...1'a'0'a'
endif
endfor
Plainline
Black
Textspecial...1Left1BottomTimes100K
endif
Plainline
Black
Drawcircle...'fs''ff'0.006
a=ff/zjiange
b=floor(a)
c=ceiling(a)
d=(b+c)/2
ifa>d
tf=ff-0.02
else
tf=ff+0.02
endif
a=fs/hjiange
b=floor(a)
c=ceiling(a)
d=(b+c)/2
ifa>d
ts=fs-0.02
else
ts=fs+0.02
endif
Blue
Textspecial...'ts'Centre'tf'HalfTimes140'txt$'
(七)提取标注对象中的数据
#点击主窗口的Control菜单下的Newpraatscript按钮,以建立一个新的脚
本语言编辑窗口,然后将脚本语言拷贝到脚本语言编辑窗口中;
#执行这个程序,你需要在C盘temp文件夹下存放TextGrid文件,TextGrid
对象需要标注音节和声韵母等数据;
#然后按脚本编辑窗口的Run菜单下的Run按钮执行程序;运行时,会弹
出一个对话框,如下图所示:
#请在上图1位置输入音节层的标注层级;请在上图2位置输入声韵母层的
标注层级;请在上图3位置输入重音层的标注层级;请在上图4位置输入间断层
的标注层级;如果在您的标注文件中没有标注上面的内容,请保留“0”不变。
设置好之后请按上图5的“OK”按钮继续运行。
#运行结束后,您将在C盘temp文件夹下找到提取出来的数据文件,其名
称是TextGrid文件的名称加上“_TextGrid”,类型是文本文件。
您可以使用Excel
表格打开刚才得到的数据文件,以观察和分析数据。
dirPath$="C:
\temp\"
CreateStringsasfilelist...list'dirPath$'\*.TextGrid
fileNum=Getnumberofstrings
iffileNum>0
form对话框
realthe_PinYin_TierIndex_in_TextGrid0
realthe_ShengYun_TierIndex_in_TextGrid0
realthe_Stress_TierIndex_in_TextGrid0
realthe_Break_TierIndex_in_TextGrid