1. 基本流程

  • 声音的基频(F0,Frenquecy 0),即声音中的主要频率成分。对于人类语音来说,F0通常与说话人的音调或音高有关。
  • 基频轮廓(F0 contour)通常指的是F0随时间的变化情况,即基频的起伏和变化。这通常用于语音分析、语音合成或音乐分析中,以了解声音信号中音高或音调的变化规律。

2. Demo

2.1 空白TextGrid的创建和手工标注

  • TextGrid文件主要用于存储时间序列数据的分段(segmentation)和层叠注释(tiered annotations)。
    • TextGrid允许用户在一个语音文件中创建多个层级(tier),每个层级可以包含不同类型的标注信息。例如,你可以在一个层级中标注音节的边界,在另一个层级中标注音高的变化,还可以创建更多的层级来标注其他语音特性。
    • 在批处理过程中,TextGrid可以帮助Praat自动化地提取和处理语音数据。通过编写脚本或利用Praat的自动化功能,你可以对多个语音文件及其对应的TextGrid文件进行批量处理,从而大大提高工作效率。
  • 下面代码只是为每个音频文件生成一个空白的TextGrid文件框架,其中的具体分段和注释信息仍然需要个人手动填充。
  • 分段的核心问题: (1)如何确定分段的标准? 参考音频相关的硕博论文。 (2)Praat使用什么分段,
#First Setp: 空白TextGrid创建
#代码使用说明:
#此脚本会逐个打开文件夹中的所有.wav文件,并为它们创建TextGrids。
#0. 要使用此脚本,你需要一系列.wav文件。
#1. 使用Praat打开脚本(从文件读取...),并选择脚本或直接将文件拖动到Praat图标上。
#2. 将打开一个表单,你可以在其中:
  #输入层级名称
  #选择是否从列表中的第一个文件开始工作
  #或者,如果你之前已经处理过这些文件,并且知道你停在了哪个文件编号,也可以选择相应的编号。点击OK。
#3. 将打开一个窗口询问你的文件在哪里,选择文件夹并点击"OK"。
#4. 声音和TextGrid将一起打开。修正任何必要的内容,完成后点击"Continue"。
#5. TextGrid将保存在声音所在的同一文件夹中。
#然后,将打开列表中的下一个文件。
#Wendy Elvira-García (2013). 空白TextGrid创建 v.1. [Praat脚本]
#mailto:wendyelviragarcia@gmail.com
#巴塞罗那大学语音学实验室
##################################################################

#文件夹选择器(仅创建一个变量)
#如果你想手动输入路径,而不是使用选择器,请注释掉这行(前面加上#),并取消注释下面的#4行代码。

folder=chooseDirectory ("请选择你想要查看/修改文件的文件夹:")   # 注释:输入包含文件的文件夹路径
form Creator
	sentence all_tiers transcription BI   # 注释:层级的名称
	sentence point_tiers BI   # 注释:你是否已经开始修正了?
	integer nfile 1  # 注释:你想从列表中的哪个文件开始工作?
endform

# 为该文件夹中所有wav文件创建列表
Create Strings as file list... listawav 'folder$'/*.wav

# 选择列表并提取其中文件的数量到一个变量中
select Strings listawav
nstrings = Get number of strings

# 开始循环
for i from nfile to nstrings
	select Strings listawav
	# 将当前处理的.wav文件添加到对象中
	nombresonido=Get string...i
	Readfromfile... ′folder'/'nombresonido$'
	base$ = nombresonido$ - ".wav"   # 为该.wav文件创建TextGrid对象
	nombregrid$ = base$ + ".TextGrid"

	To TextGrid: all_tiers$, point_tiers$

	# 选择声音和查看
	select Sound 'base$'
	plus TextGrid 'base$'
	View & Edit

	# 暂停脚本,以便研究者进行交互
	pause Please correct the TextGrid for 'base$' (file number 'i' of 'nstrings') and click "Continue" to automatically save the TextGrid.

	# Save the TextGrid
	select TextGrid 'base$'
 	Save as text file... 'folder$'/'nombregrid$'

 	# Clear the list of objects and close the editor window
	select all
	minus Strings listawav
	Remove
endfor
# 结束循环

# Final cleanup of objects
select all
Remove

exit Done!

# 保存TextGrid
select TextGrid 'base$'
Save as text file... 'folder$'/'nombregrid$'

# 清除对象列表,并关闭编辑器窗口
select all
minus Strings listawav
Remove
endfor

#最终清理对象
select all
Remove

exit Done!

为每个音频创建完空白标注文件后,下一步可以使用代码对音频进行切分

#####################	FORMULARIO	#######################  
form Indicator directory  
    comment: Textgrids所在的目录:  
    sentence directoriomater /Users/Wen/Desktop/praat  
    comment: 是否要删除层级?  
    boolean remove_tier 0  
    comment: 你想删除哪个层级的编号(层级的位置)?  
    integer tier_number_to_be_removed 0  
    comment: 是否要添加点层级?  
    boolean point_tier 1  
    word nombre_point_tier_2 BI  
    word nombre_point_tier_3 Tones  
    comment: 是否要添加区间层级?  
    boolean interval_tier 0  
    word nombre_interval_tier XX  
    integer posicion_interval_tier 1 (=on top)  
    comment: 保存修改后的文件列表  
    boolean guardar_la_lista_de_archivos_modificados 1  
endform  
##########################################  
if windows = 1  
	barra$ = "\"  
else  
	barra$= "/"  
endif  

Create Strings as file list... lista 'directoriomater$'/*.TextGrid  

if guardar_la_lista_de_archivos_modificados  
	Save as raw text file... 'directoriomater$'/lista.txt  
endif  

numberOfFiles = Get number of strings  

for ifile to numberOfFiles  
	select Strings lista  
	nombreArchivo$ = Get string... ifile  
	nombreObjeto$ = nombreArchivo$ - ".TextGrid"  

	do ("Read from file...", "'directoriomater$'/'nombreArchivo$'")  
	select TextGrid 'nombreObjeto$'  
	if remove_tier = 1  
		Remove tier... 'tier_number_to_be_removed'  
	endif  

	if point_tier = 1  
		do ("Insert point tier...", 2, "'nombre_point_tier_2$'")  
		do ("Insert point tier...", 4, "'nombre_point_tier_3$'")  
	endif  
	if interval_tier = 1  
		do ("Insert interval tier...", posicion_interval_tier, "'nombre_interval_tier$'")  
	endif  

	do ("Save as text file...", "'directoriomater$'/'nombreArchivo$'")  

endfor

2.2 批处理提取

https://github.com/polvanrijn/praat-scripts https://www.ub.edu/phoneticslaboratory/en/resources.html https://github.com/Syuparn/praat_batch_analysis