Praat 脚本 | 提取与音强相关的声学参数

作者:熊子瑜
脚本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$'"