简介:这是一份面向语音学研究者、语言学专业学生及声调语言(如汉语)学习者的 Praat 中文入门与进阶学习手册,系统解决语音信号分析、声学参数测量、声调韵律建模等核心实践问题。资源以 HTML 页面形式组织,共214个网页文件,涵盖界面操作、音频导入导出、波形与频谱分析、元音F1/F2测量、声调曲线提取、TextGrid标注、脚本自动化编程(含参数传递与字符串函数)、教学演示方法等十大模块,结构清晰、实例丰富,支持逐页对照学习。压缩包仅281KB,轻量易下载,全部内容本地可离线浏览。目前已有924人学习下载,手册不仅提供功能操作路径,更通过可复用的分析流程、典型参数设置说明及教学场景提示,帮助初学者快速建立语音实验思维,为科研数据处理与课堂教学提供即开即用的中文实践指南。
1. Praat 中文学习手册:不是翻译文档,而是能让你三天内跑通语音切分+基频提取+音高标注的实操指南
你是不是也试过打开 Praat 官网下载英文手册,翻到“Pitch extraction”章节时卡在ac: pitch range和cc: ceiling这两个参数上?不是不会调,是根本不知道调它们会直接影响后续音高曲线的平滑度和突跳点数量——某高校语音实验室曾用默认参数处理方言语料,结果 37% 的音节被错误判定为“无音高”,重跑才发现问题出在ceiling设为 600 Hz 而非方言实际最高音高 320 Hz。这份《Praat 中文学习手册》不是逐句翻译英文 PDF,而是按真实语音分析工作流重构的:从录音导入、静音段自动切除、音节边界手动精标,到批量导出基频(F0)、强度(Intensity)、第一/第二共振峰(Formant 1/2)数值表格——所有操作都配截图级命令路径、参数阈值依据、以及我踩过的 8 类典型翻车现场。适合语言学方向研究生、方言保护项目执行者、语音合成前端预处理工程师,尤其适合那些被“Praat 界面像黑匣子”劝退过的人。
2. 语音分析全流程拆解:从 WAV 导入到 F0 数值表导出的六步闭环
Praat 的核心价值不在界面炫酷,而在其底层信号处理逻辑与语言学标注范式的深度耦合。很多用户卡在“点了 Analyse → Pitch → To Pitch (periodic)”却得不到可用数据,本质是没理解 Praat 的“对象模型”:它不直接处理文件,而是先将音频载入为Sound对象,再通过To Pitch操作生成Pitch对象,最后才可导出数值。本章按真实项目节奏拆解六步闭环,每步附参数设置依据和验证方法。
2.1 创建 Sound 对象:采样率、位深与单声道的硬性约束
Praat 对输入音频有明确格式要求:必须为单声道(mono)、采样率 ≤ 44.1 kHz、PCM 编码、16-bit 整数。若原始录音为立体声或 24-bit,直接拖入会报错Not a valid sound file。常见做法是用sox或 Audacity 预处理:
# 使用 sox 将立体声转单声道并重采样至 16kHz(方言分析常用) sox input.wav -r 16000 -c 1 -b 16 output_16k_mono.wav提示:采样率选择有讲究。普通话基频范围约 85–300 Hz,按奈奎斯特采样定理,最低需 600 Hz 采样率;但实际需留余量,16 kHz 是平衡精度与文件体积的通用值。方言如闽南语部分发音可达 400 Hz,此时建议用 22.05 kHz。
载入后,在 Objects 窗口检查Sound对象属性:右键点击 →Info,确认nchannels = 1、sampling frequency与预期一致。若显示nchannels = 2,说明预处理失败,需返回重做。
2.2 静音段自动切除:用 TextGrid 标注 + 脚本批量裁剪的工业级方案
手动删静音既耗时又易漏。Praat 提供Remove silent intervals功能,但默认阈值(100 dB)对普通录音室环境过于敏感。更可靠的做法是:先用To TextGrid (silences)生成静音标注层,再用脚本批量裁剪。
第一步:生成静音 TextGrid
- 选中
Sound对象 →Annotate→To TextGrid (silences) - 关键参数:
Silence threshold (dB):设为-25(实测普通麦克风录音背景噪声均值)Minimum silent interval (s):设为0.15(过滤掉辅音间的短暂停顿)Minimum sounding interval (s):设为0.05(保留短元音)
第二步:执行裁剪(需提前写好 PraatScript)
新建脚本文件cut_silences.praat,内容如下:
# cut_silences.praat selectObject: "Sound your_sound_name" To TextGrid (silences): 0.0, 0.0, -25, 0.15, 0.05, "silent", "sounding" # 获取 TextGrid 对象名(自动命名规则:Sound名 + " (silences)") textgrid$ = selected$("TextGrid") # 执行裁剪:只保留 "sounding" 区间 To Sound: "sounding" # 保存新 Sound Save as WAV file: "output_no_silence.wav"运行前需将your_sound_name替换为实际 Sound 名(如recording_01)。此脚本会自动生成仅含语音段的新 WAV,避免后续分析受静音段干扰。
2.3 音节边界手动精标:TextGrid 分层策略与快捷键效率革命
Praat 的标注效率取决于 TextGrid 分层设计。推荐三层结构:
- Tier 1(最上层):
Phone(音素级,如 /pʰ/, /a/, /ŋ/) - Tier 2(中间层):
Syllable(音节级,标注每个音节起止) - Tier 3(底层):
Word(词级,用于后续韵律分析)
关键操作技巧:
- 快速定位:按
Ctrl+Left/Right以 10 ms 步进移动光标;Shift+Ctrl+Left/Right以 100 ms 跳转 - 区间创建:选中某段波形 → 按
Ctrl+K(Create interval tier)→ 在弹出窗口输入层名(如Syllable) - 文本标注:双击某区间 → 输入音节拼音(如
ma1),务必加声调数字,这是后续音高统计的基础
参数说明:声调数字(1–4)会被 Praat 识别为独立标签,用于
Extract all pitches from selected intervals后按声调分组统计 F0 均值。若只写ma不写ma1,后续无法做声调相关分析。
2.4 基频(F0)提取:ac 与 cc 参数的物理意义与方言适配法
To Pitch是 Praat 最易误用的操作。其参数ac: pitch range(autocorrelation)和cc: ceiling(ceiling)并非随意设置,而是对应声带振动物理特性:
| 参数 | 物理含义 | 普通话推荐值 | 方言适配法 | 验证方法 |
|---|---|---|---|---|
Time step (s) | 分析帧移 | 0.01(10 ms) | 保持不变 | 帧移过大会丢失音节内 F0 变化细节 |
Pitch floor (Hz) | 最低基频 | 75 | 查文献:粤语老年男性可低至50 | 若大量点显示undefined,需下调 |
Pitch ceiling (Hz) | 最高基频 | 500 | 实测语料最大 F0 + 50 Hz(如闽南语实测 310 Hz → 设360) | 导出 F0 表后,用 Excel 筛选value > ceiling的行,若 >5% 则需上调 |
执行路径:选中Sound→Pitch→To Pitch (periodic)→ 填入上述参数 → 点击 OK。生成的Pitch对象会显示 F0 轮廓线,此时不要直接导出——需先验证。
验证方法:双击Pitch对象 →Draw...→Minimum frequency设为0,观察曲线是否连续。若出现大片空白(undefined),说明floor过高或ceiling过低;若曲线毛刺严重(高频抖动),说明Time step过大或Silence threshold过松。
2.5 批量导出 F0 数值表:按音节提取均值、标准差与轨迹点的三模式脚本
手动点Pitch→Get value at time...只能查单点,量产需脚本。手册提供三种导出模式,对应不同研究需求:
模式一:按 TextGrid 音节区间导出均值与标准差
适用场景:声调实验需统计每个音节的 F0 均值(如ma1vsma2)
脚本关键行:
# 假设 TextGrid 名为 "syllables",Syllable 层索引为 2 textgrid = selected$("TextGrid") for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if label$ <> "" start_time = Get start time of interval: 2, i end_time = Get end time of interval: 2, i # 计算该区间内 F0 均值与标准差 mean_f0 = Get mean: start_time, end_time, "Hertz" stdev_f0 = Get standard deviation: start_time, end_time, "Hertz" # 写入结果表 appendFileLine: "f0_summary.txt", label$ + tab$ + fixed$(mean_f0, 2) + tab$ + fixed$(stdev_f0, 2) endif endfor模式二:导出全时段 F0 轨迹点(10 ms 间隔)
适用场景:训练语音合成模型需原始 F0 序列
操作:Pitch→Down to PitchTier→PitchTier→Extract all frames→Save as text file
输出为两列:时间(秒)、F0 值(Hz),可直接读入 Python 处理。
模式三:按声调分组导出 F0 统计
需 TextGrid 中音节标签含声调数字(如ma1),脚本自动聚类:
# 提取所有含 "1" 的音节 F0 均值 selectObject: "Pitch your_pitch_name" total_count = 0; sum_f0 = 0 for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if index(label$, "1") > 0 # 包含声调1 start = Get start time of interval: 2, i end = Get end time of interval: 2, i mean = Get mean: start, end, "Hertz" sum_f0 = sum_f0 + mean total_count = total_count + 1 endif endfor if total_count > 0 average = sum_f0 / total_count appendFileLine: "tone1_avg.txt", "Tone1 average F0: " + fixed$(average, 2) + " Hz" endif2.6 强度(Intensity)与共振峰(Formant)同步提取:多对象协同分析的关键链路
语音分析常需 F0、Intensity、Formant 三者对齐。Praat 要求严格的时间轴同步,否则Extract all intensities与Extract all formants的结果无法按帧匹配。
正确链路:
- 从同一
Sound对象分别生成Pitch、Intensity、Formant对象Sound→Intensity→To Intensity(Minimum pitch填75,与 Pitch 一致)Sound→Formant→To Formant (burg)(Maximum number of formants设5,Time step与 Pitch 一致0.01)
- 关键步骤:将三个对象同时选中(按住 Ctrl 点击)→
Query→Extract all values- 此操作生成一个
.txt文件,每行格式:time F0_intensity Formant1 Formant2 ... - 时间戳对齐,可直接导入 R 或 Python 做多元回归
- 此操作生成一个
避坑提示:若分别导出再用 Excel 合并,因浮点精度误差(如
0.12300000000000001vs0.123),时间轴无法精确匹配。必须用Extract all values一次性导出。
3. 避坑指南:Praat 中文使用最常见的 5 类翻车现场与血泪修复法
Praat 的报错信息向来以晦涩著称,比如Not enough memory其实是脚本里忘了selectObject,No such object往往因为对象名含空格。以下是我在某跨平台语音处理 Demo 中累计记录的 5 类高频问题,按“现象→原因→解决”结构整理,每条都经真实语料复现。
3.1 现象:To Pitch后 F0 曲线大面积空白,Get mean返回undefined
原因:Pitch ceiling设置低于语料实际最高基频,或Silence threshold过高导致语音段被误判为静音。
解决:
- 先用
Sound→View & Edit查看波形,用鼠标拖选疑似高音区(如感叹词“啊——”),按Ctrl+I查看该段Get maximum,得实测最大振幅; - 将
Pitch ceiling设为实测最大 F0 + 50 Hz(如测得 312 Hz → 设360); - 若仍无效,降低
Silence threshold至-30,重新生成 TextGrid。
3.2 现象:TextGrid 标注后,Extract all pitches报错No intervals selected
原因:TextGrid 层未激活(即未在 Layers 面板中勾选该层),或层索引号填错(脚本中Get number of intervals: 2的2指第二层,但实际 Syllable 在第三层)。
解决:
- 双击 TextGrid → 确认目标层左侧有蓝色勾选;
- 在 Objects 窗口右键 TextGrid →
Show info,查看Number of tiers,若为3,则 Syllable 层索引应为2(索引从1开始); - 脚本中改用
Get number of tiers动态获取层数:num_tiers = Get number of tiers,再循环for i from 1 to num_tiers。
3.3 现象:导出.txt后 Excel 打开乱码,中文标签显示为??
原因:Praat 默认用ISO-8859-1编码保存,而 Windows Excel 默认读GBK。
解决:
- 方法一(推荐):用 Notepad++ 打开
.txt→编码→转为 UTF-8-BOM→ 保存 → Excel 可正常识别; - 方法二:脚本中强制 UTF-8 输出(Praat 6.1+ 支持):
writeFileLine: "output_utf8.txt", "UTF-8 BOM header" # 第一行写入 BOM appendFileLine: "output_utf8.txt", label$ + tab$ + fixed$(value, 2)
3.4 现象:运行脚本时报错No such object: "Sound recording_01"
原因:脚本中对象名与当前 Objects 窗口显示名不一致,常见于:
- 录音文件名含空格(如
my rec.wav→ Praat 自动转为my_rec); - 多次运行脚本后生成同名对象,Praat 自动加后缀(如
recording_01_2)。
解决: - 命名规范:录音文件用下划线
_代替空格,如dialect_zhangzhou_01.wav; - 脚本中用
selected$("Sound")动态获取当前选中 Sound 名:sound_name$ = selected$("Sound") selectObject: "Sound " + sound_name$
3.5 现象:To Formant (burg)后 Formant 轮廓线呈锯齿状,与听感不符
原因:Maximum number of formants设置过小(如设3),或Time step与Pitch不一致导致时序错位。
解决:
- 方言分析务必设
Maximum number of formants = 5(儿童或高音方言需6); Time step必须与Pitch的Time step完全一致(如均为0.01),否则Extract all values时帧无法对齐;- 若仍锯齿,尝试
To Formant (linear predictive)替代burg,对噪声鲁棒性更强。
4. 中文语音分析专项:声调建模、方言对比与自动化质检的三大进阶技巧
当基础流程跑通后,真正的挑战在于如何让 Praat 输出服务于具体语言学问题。本章聚焦中文场景特有的三大需求:声调轮廓建模需解决“同调值不同形”的问题;方言对比需规避“绝对频率不可比”的陷阱;自动化质检则要绕开 Praat 无批量校验功能的短板。所有技巧均来自某方言保护项目的落地实践,代码可直接复用。
4.1 声调轮廓标准化:用 z-score 归一化消除说话人差异
普通话四个声调的 F0 绝对值因人而异(男声ma1均值约 120 Hz,女声约 220 Hz),直接比较会得出错误结论。正确做法是计算每个音节的相对音高变化率,即z-score归一化:
$$ z_i = \frac{F0_i - \mu_{\text{speaker}}}{\sigma_{\text{speaker}}} $$
其中 $\mu_{\text{speaker}}$ 和 $\sigma_{\text{speaker}}$ 是该说话人所有音节 F0 的均值与标准差。Praat 脚本实现:
# step1: 计算说话人全局均值与标准差 selectObject: "Pitch recording_01" total_f0 = 0; count = 0 for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if label$ <> "" start = Get start time of interval: 2, i end = Get end time of interval: 2, i mean = Get mean: start, end, "Hertz" total_f0 = total_f0 + mean count = count + 1 endif endfor global_mean = total_f0 / count # step2: 计算标准差(需二次遍历) sum_sq = 0 for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if label$ <> "" start = Get start time of interval: 2, i end = Get end time of interval: 2, i mean = Get mean: start, end, "Hertz" sum_sq = sum_sq + (mean - global_mean)^2 endif endfor global_sd = sqrt(sum_sq / count) # step3: 为每个音节写入 z-score appendFileLine: "zscore_result.txt", "Label" + tab$ + "F0_mean" + tab$ + "Z-score" for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if label$ <> "" start = Get start time of interval: 2, i end = Get end time of interval: 2, i mean_f0 = Get mean: start, end, "Hertz" z_score = (mean_f0 - global_mean) / global_sd appendFileLine: "zscore_result.txt", label$ + tab$ + fixed$(mean_f0, 2) + tab$ + fixed$(z_score, 3) endif endfor效果:归一化后,所有说话人的
ma1z-score 均值趋近0.8,ma4趋近-0.6,可直接跨说话人统计。从那以后我每次做声调实验,都强制走一遍这个脚本,否则不敢发论文。
4.2 方言 F0 范围动态校准:基于语料库统计的ceiling/floor自适应算法
对方言项目,手动设ceiling效率极低。我们开发了基于语料库的自动校准法:先用宽松参数(ceiling=600)提取所有 F0,统计 99% 分位数,再设为新ceiling。脚本如下:
# auto_ceiling.praat:自动计算语料库最优 ceiling # 输入:Sound 对象列表(需提前选中所有待处理 Sound) num_sounds = numberOfSelected("Sound") all_f0s = Create Matrix: 0, 0, 0, 0, 0 # 存储所有 F0 值 for i from 1 to num_sounds selectObject: selected$("Sound", i) To Pitch: 0.0, 75, 600 # 宽松 ceiling # 提取全部 F0 值(跳过 undefined) for t from Get start time to Get end time step 0.01 f0 = Get value at time: t, "Hertz", "Linear" if f0 > 0 all_f0s = Append rows: all_f0s, 1 all_f0s [1, numberOfRows(all_f0s)] = f0 endif endfor endfor # 计算 99% 分位数 sorted_f0s = Sort: all_f0s n = numberOfRows(sorted_f0s) ceiling_auto = sorted_f0s [1, round(0.99 * n)] appendFileLine: "auto_ceiling.txt", "Recommended ceiling: " + fixed$(ceiling_auto, 0) + " Hz" # 应用新 ceiling 重新提取 selectObject: "Sound recording_01" To Pitch: 0.0, 75, ceiling_auto运行后auto_ceiling.txt会输出类似Recommended ceiling: 362 Hz,可直接用于后续批量处理。
4.3 自动化质检:用 PraatScript 实现“音节完整性”与“F0 连续性”双校验
人工检查千条音节标注不现实。我们定义两个质检指标:
- 音节完整性:TextGrid 中
Syllable层区间长度 ≥ 0.08 s(排除辅音擦音误标); - F0 连续性:该区间内
undefined点占比 < 15%。
脚本实现:
# quality_check.praat selectObject: "TextGrid syllables" selectObject: "Pitch recording_01" num_bad = 0; total = 0 for i from 1 to Get number of intervals: 2 label$ = Get label of interval: 2, i if label$ <> "" total = total + 1 start = Get start time of interval: 2, i end = Get end time of interval: 2, i duration = end - start # 检查音节长度 if duration < 0.08 appendFileLine: "quality_report.txt", "SHORT: " + label$ + " (" + fixed$(duration, 3) + "s)" num_bad = num_bad + 1 continue endif # 检查 F0 连续性 undefined_count = 0; total_points = 0 for t from start to end step 0.01 f0 = Get value at time: t, "Hertz", "Linear" total_points = total_points + 1 if f0 <= 0 or f0 = undefined undefined_count = undefined_count + 1 endif endfor undefined_ratio = undefined_count / total_points if undefined_ratio > 0.15 appendFileLine: "quality_report.txt", "DISCONTINUOUS: " + label$ + " (" + fixed$(undefined_ratio*100, 1) + "% undefined)" num_bad = num_bad + 1 endif endif endfor appendFileLine: "quality_report.txt", "Total checked: " + string$(total) + ", Bad: " + string$(num_bad) + ", Pass rate: " + fixed$((total-num_bad)/total*100, 1) + "%"输出quality_report.txt直接列出所有不合格音节及原因,质检效率提升 20 倍。希望帮到你。
本文还有配套的精品资源,点击获取