简介:这份praat中文学习手册面向语音学研究者、语言学与心理学专业学生及对语音科学感兴趣的初学者,系统梳理了praat在语音信号分析、处理与展示方面的核心操作。内容涵盖基本界面与操作、语音文件导入导出、波形与频谱分析、声调韵律研究、元音辅音测量、语音合成、脚本编程以及教学演示等模块,并配有实例与步骤指导,帮助读者从零掌握这款语音学软件。资源包共214个文件,全部为html网页文档,压缩包约281KB,按功能模块组织,便于按需检索与离线查阅。目前已有920人学习下载,适合希望系统入门praat、对照功能说明逐步实践并积累语音分析经验的读者参考使用。
1. 从一份中文手册说起:praat 到底能帮你做什么
如果你正在做语音实验、声学分析或者语音合成,大概率绕不开 praat 这个名字。它是一款老牌的开源语音分析软件,功能覆盖录音、标注、基频提取、共振峰分析、频谱绘制、脚本批处理等。问题是,官方文档以英文为主,很多刚入门的同学打开界面就懵了——菜单栏密密麻麻,参数名全是专业术语,想做个简单的基频曲线都要查半天资料。这份 praat 中文学习手册就是来解决这个问题的:它把界面操作、参数含义、脚本写法用中文重新梳理了一遍,适合语音学方向的学生、做语音信号处理的工程师,以及需要批量处理音频数据但不想写太多底层代码的人。手册不是简单的菜单翻译,而是按实际任务组织内容,比如“怎么标注一段录音”“怎么提取全部音节的共振峰”“怎么用脚本批量跑基频”。拿到它之后,你至少能少走两三个月的弯路。
2. 手册内容拆解:从界面到脚本的完整链路
2.1 核心模块与对应任务
这份手册把 praat 的功能拆成了几个相对独立的模块,每个模块对应一类常见任务。下面这张表是我根据手册目录和实际使用经验整理的,方便你快速定位自己需要的部分。
| 模块 | 主要功能 | 典型任务 |
|---|---|---|
| 录音与编辑 | 录制、裁剪、重采样、格式转换 | 采集语音样本,统一采样率 |
| 标注(TextGrid) | 音段层、音节层、韵律层标注 | 建立语音库的标注文件 |
| 声学分析 | 基频、共振峰、强度、频谱 | 提取元音共振峰、绘制音高曲线 |
| 脚本(Script) | 批处理、循环、条件判断 | 批量提取上百个文件的基频 |
| 绘图与导出 | 图片、数据表、文本文件 | 生成论文用图、导出 CSV |
手册对每个模块都给了操作路径和参数说明,不是只列菜单。比如基频提取部分,它会告诉你“音高设置”里那个“ pitch floor ”和“ pitch ceiling ”到底怎么影响结果,而不是让你自己猜。
2.2 标注系统:TextGrid 的层级逻辑
TextGrid 是 praat 里最常用的标注容器,但很多人第一次用会搞不清“层级(tier)”和“区间(interval)”的关系。手册里用了一个很直观的类比:把 TextGrid 想象成一摞透明的纸,每张纸上画着时间轴上的分段,每张纸就是一个 tier。你可以有“音素层”“音节层”“声调层”,它们时间对齐但内容独立。
实际操作步骤大致是这样:
- 打开一个音频文件,在 Objects 窗口选中它。
- 点击右侧的 Annotate -> To TextGrid...,弹出对话框。
- 在 Tier names 里填入你需要的层名,比如
phone syllable tone,用空格隔开。 - 点 OK 后,Objects 窗口会出现一个 TextGrid 对象,和音频文件并列。
- 同时选中音频和 TextGrid,点 View & Edit,进入标注界面。
在标注界面里,你可以用鼠标划选区间,然后在对应的 tier 上输入标签。手册特别提醒:不要用中文标点或空格作为标签内容,否则后续脚本读取时容易出错。这个坑我后面还会细说。
2.3 脚本入门:从手动到自动的关键一步
手册用了一整章讲脚本,因为这是 praat 真正高效的地方。很多人手动标了十几个文件就受不了了,而脚本可以让你一次性处理几百个。下面这段代码是手册里“批量提取基频”的简化版,我加上了注释:
# 定义输入输出目录 input_dir$ = "/home/user/audio/" output_dir$ = "/home/user/output/" # 创建输出文件并写入表头 outfile$ = output_dir$ + "pitch_data.csv" writeFileLine: outfile$, "filename,time,pitch" # 获取输入目录下所有 wav 文件 file_list = Create Strings as file list: "list", input_dir$ + "*.wav" num_files = Get number of strings # 循环处理每个文件 for i from 1 to num_files selectObject: file_list filename$ = Get string: i base$ = filename$ - ".wav" # 读取音频 sound = Read from file: input_dir$ + filename$ # 提取基频,参数:时间步长 0.01s,最低 75Hz,最高 500Hz pitch = To Pitch: 0.01, 75, 500 # 获取基频数据点数量 num_frames = Get number of frames # 遍历每一帧,写入时间和基频值 for j from 1 to num_frames time = Get time from frame number: j freq = Get value at time: time, "Hertz", "linear" if freq <> undefined appendFileLine: outfile$, base$ + "," + string$(time) + "," + string$(freq) endif endfor # 清理对象,避免内存堆积 removeObject: sound, pitch endfor # 最后删除文件列表对象 removeObject: file_list这段脚本的逻辑很清晰:先拿到文件列表,然后逐个读取、提取基频、遍历帧、写入 CSV。参数部分需要根据你的数据调整——比如成年男声的基频下限可以设到 60Hz,女声或儿童可以设到 100Hz 以上。手册里专门有一节讲“基频参数怎么设”,建议先用默认值跑一个文件,看提取出来的曲线是否连续,再决定要不要改。
注意:脚本里的路径要用绝对路径,而且目录分隔符在 Windows 和 Linux 下不一样。手册建议统一用正斜杠
/,praat 在 Windows 下也能识别。
3. 避坑指南:中文用户最容易翻车的五个地方
3.1 路径里有中文或空格,脚本直接报错
现象:脚本运行到Read from file就停了,提示“File not found”,但文件明明存在。
原因:praat 的脚本引擎对非 ASCII 字符和空格的处理比较脆弱,尤其是 Windows 系统下。路径里只要有中文、空格或特殊符号,就可能读不到。
解决:把所有音频文件和输出目录放在纯英文、无空格的路径下,比如D:/praat_data/。如果实在要用中文目录,先在脚本里用replace$把路径转成短路径名,但最稳妥的还是改路径。
3.2 TextGrid 标签用了中文标点,后续分析全乱
现象:用脚本读取 TextGrid 的标签时,得到的字符串是乱码或者空值。
原因:praat 内部用 UTF-8 存储文本,但如果你在标注时输入了中文逗号、句号或全角空格,某些导出函数会截断或转义。
解决:标注时只用英文字母、数字和下划线。比如用vowel_a而不是元音a,用tone1而不是声调1。手册里有一页专门列了“推荐标签命名规范”,照着做能省很多事。
3.3 基频提取出现断崖,参数没设对
现象:画出来的基频曲线中间突然掉到 0 或者跳到很高,明显不连续。
原因:To Pitch的上下限设得太窄或太宽。比如男声最低到 60Hz,你设了下限 100Hz,那低音部分就提取不到;反过来,上限设到 800Hz,环境噪声会被当成基频。
解决:先看音频的实际情况。用Get mean pitch粗略估计,或者手动在编辑器里看一段。一般男声设 60-300Hz,女声设 100-500Hz,儿童设 150-600Hz。手册里给了一个对照表,按说话人类型直接查就行。
3.4 批量处理时内存爆了,程序卡死
现象:跑了几十个文件后,praat 越来越慢,最后无响应。
原因:每次循环都创建了新的 Sound、Pitch 对象,但没有及时删除。praat 不会自动垃圾回收,对象越堆越多。
解决:在循环末尾加removeObject: sound, pitch,只保留文件列表对象。如果还要保留 TextGrid,也记得在不需要时删掉。手册的脚本模板里已经内置了清理步骤,直接抄就行。
3.5 导出的 CSV 用 Excel 打开乱码
现象:CSV 文件里中文标签变成问号,或者列错位。
原因:praat 写文件时默认用 UTF-8 编码,而 Excel 在中文系统下默认用 GBK 打开,编码不匹配。
解决:用记事本打开 CSV,另存为时选择“ANSI”编码,或者直接用 Python 的 pandas 读取,指定encoding='utf-8'。手册推荐用 Python 做后续处理,因为 praat 本身的数据整理能力有限。
4. 进阶用法:把手册里的脚本改成自己的流水线
4.1 从单文件到批处理:加一层目录遍历
手册里的脚本大多针对单个目录,但实际项目往往有子目录。比如audio/speaker1/、audio/speaker2/这种结构。你可以在脚本里加一个递归函数,或者用 praat 的Create Strings as folder list先拿到所有子目录,再逐个处理。下面是一个简化的目录遍历片段:
# 获取所有子目录 folder_list = Create Strings as folder list: "folders", "/home/user/audio/" num_folders = Get number of strings for i from 1 to num_folders selectObject: folder_list folder_name$ = Get string: i full_path$ = "/home/user/audio/" + folder_name$ + "/" # 对每个子目录调用之前的处理逻辑 # ...(此处省略具体提取代码) endfor这样你就能一次性处理整个语音库,而不是手动改路径。手册在“脚本进阶”一节里给了完整的模板,包括错误捕获和日志输出。
4.2 用 Python 做后处理:praat + pandas 的组合
praat 导出的 CSV 通常需要进一步清洗,比如去掉 undefined 的行、按说话人分组统计、画更漂亮的图。这时候用 Python 的 pandas 和 matplotlib 会方便很多。下面这段代码读取 praat 输出的基频 CSV,计算每个文件的平均基频:
import pandas as pd # 读取 praat 导出的 CSV,注意编码 df = pd.read_csv('pitch_data.csv', encoding='utf-8') # 去掉基频为 undefined 的行(praat 里通常写成 -- 或空) df = df[df['pitch'] != '--'] df['pitch'] = pd.to_numeric(df['pitch'], errors='coerce') df = df.dropna(subset=['pitch']) # 按文件名分组,计算均值和标准差 summary = df.groupby('filename')['pitch'].agg(['mean', 'std', 'count']) summary.to_csv('pitch_summary.csv', encoding='utf-8-sig') print(summary.head())这里encoding='utf-8-sig'是为了让 Excel 能正确识别中文。手册里没有 Python 部分,但这是实际工作中很自然的延伸——praat 负责提取,Python 负责统计和可视化。
4.3 验证提取结果:用编辑器回看
脚本跑完之后,怎么知道提取对不对?手册给了一个很实用的方法:随机抽几个文件,在 praat 里同时打开音频和提取出的 Pitch 对象,点 View & Edit,看基频曲线是否贴合语音的基频轨迹。如果发现某段明显偏离,就回去检查参数。这个步骤看起来笨,但能帮你抓住大部分参数设置错误。我自己的习惯是每跑完一批数据,至少抽 10% 回看,尤其是边界情况(比如录音开头有静音、结尾有噪声)。
提示:praat 的编辑器里可以同时显示波形、频谱和基频,按
Ctrl加鼠标滚轮可以缩放时间轴,方便逐段核对。
4.4 一个容易忽略的技巧:保存和复用脚本模板
手册最后几页讲了一个很实在的做法:把常用的脚本存成模板,比如“批量提取基频”“批量提取共振峰”“批量导出 TextGrid 为 CSV”。每次新项目只需要改路径和参数,不用从头写。我自己的模板库里就有七八个这样的脚本,用的时候复制一份,改三行就能跑。手册里附了几个模板的完整代码,可以直接拿来改。
从那以后我每次拿到新的语音数据,都强制先跑一遍模板脚本,再手动抽检几个文件。这样既保证了效率,又不会因为参数问题翻车。希望这份手册也能帮你把 praat 用顺手。
本文还有配套的精品资源,点击获取