第一次接触声学分析时,我手动测量了50个元音样本的共振峰。盯着频谱图一个个点选Formant listing,再手工记录数据,整整花了两天时间。当看到Excel里歪歪扭扭的手写数据时,突然意识到:这种重复劳动正是脚本存在的意义。
共振峰分析本质上是在解决三个问题:定位元音声学空间(F1/F2)、区分音色特征(F3参与)、量化发音稳定性(时长与共振峰波动)。传统方法就像用勺子挖隧道,而Praat脚本则是开挖掘机——它能自动完成:
实测处理100个文件只需3分钟,效率提升近百倍。更重要的是,脚本消除了人为误差。我曾对比过手动测量和脚本输出的数据,同一元音/i/的F2值手工记录波动范围达150Hz,而脚本结果标准差不超过20Hz。
Praat底层采用**线性预测编码(LPC)**算法,相当于给声波做CT扫描。它会自动计算声道形状对应的共振频率,就像通过水波纹反推石头入水的位置。关键参数需要微调:
praat复制# 建议设置的Formant对象参数
formant = To Formant (burg)... 0 5 5500 0.025 50
5代表提取5个共振峰(实际常用F1-F3)5500是最大分析频率(女性语音建议调至5000)0.025是窗长(颤音需要更短窗长)50是预加重(消除声门波影响)有个容易踩的坑:爆破音会污染共振峰数据。解决方法是在TextGrid中精确标注元音段,脚本会自动跳过辅音段。
脚本提取的时长并非简单终点减起点,而是采用加权算法:
实测发现,汉语单韵母/i/的脚本计算时长比手动测量平均短30ms,正是因为过滤了起始的摩擦成分。
建议建立如下目录结构:
code复制/project
├── /wav
│ ├── speaker1.wav
│ └── speaker2.wav
├── /textgrid
│ ├── speaker1.TextGrid
│ └── speaker2.TextGrid
└── /output
脚本参数配置示例:
praat复制# Windows路径示例
wav_dir$ = "C:\project\wav"
textgrid_dir$ = "C:\project\textgrid"
output_path$ = "C:\project\output\formant_results.csv"
tier_number = 1 # 假设元音标注在第1层
常见报错解决:
\改为/输出表格包含6个关键字段:
| 字段名 | 说明 | 示例值 |
|---|---|---|
| filename | 音频文件名 | speaker1.wav |
| phoneme | 音素标签 | i |
| duration | 时长(秒) | 0.125 |
| f1 | 第一共振峰(Hz) | 320.5 |
| f2 | 第二共振峰(Hz) | 2250.3 |
| f3 | 第三共振峰(Hz) | 2890.1 |
异常数据处理技巧:
excel复制=AVERAGEIF(B:B,"i",D:D) # 计算所有/i/的F1均值
excel复制# 新建两列作图数据
=D2 # X轴数据(原F2)
=C2 # Y轴数据(原F1)
对比图示例:
code复制[图表描述:左侧为原始数据点,右侧添加了元音区域椭圆标注]
有个偷懒技巧:直接保存为模板,下次只需替换数据源。我常用的模板包含自动标色功能,不同元音自动显示为不同颜色。
处理多人数据时,建议增加说话人ID字段:
praat复制# 修改脚本添加speaker字段
speaker$ = replace$(filename$, ".wav", "", 1)
fileappend "'output_path$'" 'speaker$','phoneme$','duration','f1','f2','f3''newline$'
统计时可使用方差分析:
excel复制=ANOVA(C2:C100, B2:B100) # 检验不同元音时长差异
遇到儿童或特殊嗓音时,需要调整LPC参数:
maximum_formantwindow_lengthpre-emphasis曾处理过一位老年发音人的数据,初始脚本获取的F2全部偏低。将maximum_formant从5500降到4500后,数据立即恢复正常范围。
这套方法稍加改造就能用于:
最近帮一位研究生分析闽南语元音演变,我们修改脚本增加了时间戳标记,成功捕捉到元音/a/在三代人中的F1抬升现象。