作者:熊子瑜
脚本ID:Praat.XZY20210908.015
上传时间:2021年9月8日
简介:针对用户指定的某个文件夹中的全部声音文件,按其标注文件中的音段时间信息分别提取下列与音强相关的几项声学参数:(1)基于Sound数据对象提取Mean,Root-mean-square,Standard deviation;Energy,Power,Energy in air,Power in air,Intensity(dB)等声学参数;(2)基于Intensity数据对象提取音强均值数据(分别采用dB、energy、sones等3种分析方法)。注意:标注文件必须与声音文件放在同一文件夹之中。
#By XIONG Ziyu
#更新时间:2021-09-08
#版本号:Praat 6.1.05
#功能:针对用户指定的某个文件夹中的全部声音文件,
# 按其标注文件中的音段时间信息分别提取下列与音强相关的几项声学参数:
# (1)基于Sound数据对象提取Mean,Root-mean-square,Standard deviation;
# Energy,Power,Energy in air,Power in air,Intensity(dB)等声学参数;
# (2)基于Intensity数据对象提取音强均值数据(分别采用dB、energy、sones等3种分析方法)。
#注意:标注文件必须与声音文件放在同一文件夹之中。
form 提取音强等数据
sentence wavFile_Open_Path d:\sounds\
optionmenu Scale_Peak_or_Intensity: 1
option 不做规整处理
option Scale Intensity to 70dB
option Scale Peak to 0.7
positive Tier_Index 1
endform
Text reading preferences: "UTF-8"
Text writing preferences: "UTF-8"
Create TextGrid: 0, 1, "Mary John bell", "bell"
select all
Remove
wavFile_Open_Path$=replace$(wavFile_Open_Path$,"/","\",0)
if right$(wavFile_Open_Path$,1)!="\"
wavFile_Open_Path$=wavFile_Open_Path$+"\"
endif
sfn$=wavFile_Open_Path$+"intensity_data.txt"
filedelete 'sfn$'
fileappend "'sfn$'" Filename'tab$'Index'tab$'sTime'tab$'eTime'tab$'duration'tab$'Label'tab$'
fileappend "'sfn$'" amplitude_mean'tab$'amplitude_rms'tab$'amplitude_stdv'tab$'power'tab$'power_in_air'tab$'intensity'tab$'energy'tab$'energy_in_air'tab$'
fileappend "'sfn$'" intensity_mean_db'tab$'intensity_mean_energy'tab$'intensity_mean_sones'newline$'
Create Strings as file list: "fileList", "'wavFile_Open_Path$'*.wav"
fNum=Get number of strings
for f from 1 to fNum
selectObject: "Strings fileList"
fName$=Get string: 'f'
wName$=wavFile_Open_Path$+fName$
tName$=wName$-".wav"+".TextGrid"
if fileReadable(wName$) and fileReadable(tName$)
Read from file: "'wName$'"
aTime=Get total duration
Read from file: "'tName$'"
sName$=selected$("TextGrid")
iNum=Get number of intervals: 'tier_Index'
spos=0
st=Get start time of interval: 'tier_Index', 1
et=Get end time of interval: 'tier_Index', 1
lab$=Get label of interval: 'tier_Index', 1
if lab$="" or index(lab$,"sil")>0
spos=et-0.03
endif
epos=aTime
st=Get start time of interval: 'tier_Index', 'iNum'
et=Get end time of interval: 'tier_Index', 'iNum'
lab$=Get label of interval: 'tier_Index', 'iNum'
if lab$="" or index(lab$,"sil")>0
epos=st+0.03
endif
if spos<0
spos=0
endif
if epos>aTime
epos=aTime
endif
if spos>0 or epos<aTime
selectObject: "Sound 'sName$'"
Extract part: 'spos', 'epos', "rectangular", 1, "no"
Rename: "NEWFILE"
selectObject: "TextGrid 'sName$'"
Extract part: 'spos', 'epos', "no"
Rename: "NEWFILE"
selectObject: "Sound 'sName$'"
plusObject: "TextGrid 'sName$'"
Remove
selectObject: "Sound NEWFILE"
Rename: "'sName$'"
selectObject: "TextGrid NEWFILE"
Rename: "'sName$'"
endif
selectObject: "Sound 'sName$'"
aTime=Get total duration
if scale_Peak_or_Intensity=2
Scale intensity: 70
endif
if scale_Peak_or_Intensity=3
Scale peak: 0.7
endif
selectObject: "Sound 'sName$'"
To Intensity: 100, 0, "yes"
selectObject: "TextGrid 'sName$'"
iNum=Get number of intervals: 'tier_Index'
for i from 1 to iNum
selectObject: "TextGrid 'sName$'"
st=Get start time of interval: 'tier_Index', 'i'
et=Get end time of interval: 'tier_Index', 'i'
lab$=Get label of interval: 'tier_Index', 'i'
dur=et-st
if lab$!=""
selectObject: "Sound 'sName$'"
mean=Get mean: 0, 'st', 'et'
rms=Get root-mean-square: 'st', 'et'
sd=Get standard deviation: 0, 'st', 'et'
#Get power: 0, 0
power=rms^2
#Get power in air
power_in_air=power/402.42
#Get energy: 0, 0
energy=power*dur
#Get energy in air
energy_in_air=energy/402.42
#Get intensity (dB)
intensity=10*log10(power_in_air/(10^(-12)))
selectObject: "Intensity 'sName$'"
mdb=Get mean: 'st', 'et', "dB"
menergy=Get mean: 'st', 'et', "energy"
msones=Get mean: 'st', 'et', "sones"
fileappend "'sfn$'" 'sName$''tab$''i''tab$''st:3''tab$''et:3''tab$''dur:3''tab$''lab$''tab$'
fileappend "'sfn$'" 'mean''tab$''rms''tab$''sd''tab$''power''tab$''power_in_air''tab$''intensity''tab$'
fileappend "'sfn$'" 'energy''tab$''energy_in_air''tab$''mdb''tab$''menergy''tab$''msones''newline$'
endif
endfor
endif
select all
minus Strings fileList
Remove
endfor
exitScript: "运行结束,结果详见:'newline$''sfn$''newline$'"