引题
今天为大家提供一个脚本来简单统计自己标注的内容,我们在标注了很多的文件之后,想知道自己某一层,到底标了多少多少的一些音素或者词单位等。

如图所示,我们想知道第一层,在我们标注的数据集合里,标了多少个k,多少个a这样的发音音素。即我们想得到这样的结果:
| 音素 | 出现个数 |
|---|---|
| k | 1 |
| a | 5 |
| er | 3 |
| … | … |
同样,比如这些汉字分别出现多少次?
| 汉字 | 出现个数 |
|---|---|
| 卡 | 2 |
| 尔 | 6 |
| 外 | 3 |
| 玩 | 2 |
| … | … |
如果你是在标注如英语这样的数据,即统计这些英语单词在你的标注数据中出现多少次。
| 单词 | 出现个数 |
|---|---|
| author | 1 |
| of | 17 |
| the | 48 |
| danger | 1 |
| … | … |
使用这个脚本可以先使用这两套开源数据试一下,下载地址在https://github.com/feelins/Praat_Scripts/tree/master/data, 关于这两套数据的详细说明可通过关注微信公众号“语音处理小站“,查找一篇”推荐|中文普通话和英语开源数据“的文章。
代码段
这个脚本的统计功能其实在其它编程语言是很常用的一段,这里是了解一下如何通过Praat脚本操作,这里的操作有一些复杂,因为Praat脚本对于文本数据处理有一些不方便。这里是需要建立一个空表,每当发现一个音素,则新建一行,然后再次遇到这个音素的时候,把这一行后面的数据加1,以此类推。
有兴趣的同学仔细理解这段代码,有助于更好的学习脚本。
...
selectObject: "Table table"
totalRow = Get number of rows
exists = 0
for j from 1 to totalRow
name$ = Get value: j, "item"
if name$ = lab$
exists = j
endif
endfor
if exists
totalRow = Get number of rows
for j from 1 to totalRow
name$ = Get value: j, "item"
if name$ = lab$
curCount = Get value: j, "count"
Set numeric value: j, "count", curCount + 1
endif
endfor
else
curRow = Get number of rows
Set string value: curRow, "item", lab$
Set numeric value: curRow, "count", 1
Append row
endif
...
以上脚本中,假设我们在统计音素,item这一列就是保存所有出现的音素的,而count这一列就是音素的个数,脚本不断累加,直到程序结束。
运行脚本
打开Praat之后,选择Praat,Open Praat Script...,打开这个脚本,然后在脚本窗口选择Run,Run,或者直接使用快捷键Ctrl+R,在弹出来的对话框里,设置以下几个地方,首先以上述示例中的普通话数据为例,本文例子的目录在E盘的Biaobei_Demo目录:
- 设置你的
标注数据所在的目录,这里因为是在Windows系统,所以路径斜线是\,如果你是在Mac使用,将这个斜线方向反一下就好。也可以用这样的路径E:\Biaobei_Demo\,取决于你的数据所在的目录,由于这里的统计只是对于标注的TextGrid文档,所以这个目录里可以不放音频; - 设置
目标统计层,这取决于你的标注情况,这里的例子,音素层在第1层,设置为1;你需要统计的层在这里可自由设置,有些标注中使用的是Point Tier,这种脚本也是考虑在内,也可以进行统计; - . 设置
保存结果路径,这里是E:\Biaobei_Demo_Stats.txt;

设置完毕,点击OK,运行脚本,结果可以到E:\Biaobei_Demo_Stats.txt查看。
| item | Value |
|---|---|
| sil | 200 |
| k | 38 |
| a2 | 9 |
| er2 | 15 |
| p | 27 |
| u3 | 17 |
| ei2 | 7 |
| uai4 | 7 |
| s | 24 |
| uen1 | 11 |
| uan2 | 9 |
| h | 57 |
| ua2 | 4 |
| t | 32 |
| i1 | 15 |
| j | 43 |
| ia2 | 3 |
| v3 | 16 |
| c | 22 |
| … | … |
这个结果文件的第一行,是表头,以下便是统计出来的结果,这里有一个问题,由于汉语拼音是标了声调的,而我们如果想过滤这些声调,只统计拼音出现次数,如何做到呢??
这个自然简单,我们把每一层的标注内容,遇到声调值都替换掉就可以了,即在我们的脚本里加上这样几句:
lab$ = replace$(lab$, "1", "", 0)
lab$ = replace$(lab$, "2", "", 0)
lab$ = replace$(lab$, "3", "", 0)
lab$ = replace$(lab$, "4", "", 0)
lab$ = replace$(lab$, "5", "", 0)
以此拓展,如果你发现自己统计的一些符号是不准备统计在内的,可在此修改脚本,将你需要忽略的符号替换掉。具体方式将replace语句复制之后,稍加修改就可以了。
再次运行之后,我们再次打开结果文件,这时候是对于真正的音素的统计:
| item | Value |
|---|---|
| sil | 200 |
| k | 38 |
| a | 37 |
| er | 26 |
| p | 27 |
| u | 74 |
| ei | 26 |
| uai | 8 |
| s | 24 |
| uen | 24 |
| uan | 34 |
| h | 57 |
| ua | 15 |
| t | 32 |
| … | … |
第一次因为声调值的关系,我们得到了168个统计单位,而现在替换了声调之后,得到了65个统计单位。这有助于我们了解,整个音库的标注是否合理。
再次扩展一下,我们也可以统计第二层汉字的结果,则在运行的时候target_tier选择第2层:

统计的结果如下:
| item | Value |
|---|---|
| 卡 | 2 |
| 尔 | 6 |
| 普 | 1 |
| 陪 | 2 |
| 外 | 3 |
| 孙 | 2 |
| 玩 | 2 |
| 滑 | 1 |
| … | … |
同样,你会发现可能由于数据的原因,这里面应该会出现大量的标点符号,有兴趣的同学可自行研究一下,如何通过上面提到的replace命令,交标点替换之后,统计出来。
相同的操作,我们可以对英语数据,或者你手头的自己的音库数据进行操作,操作方式非常简单,这里不再继续扩展。
获取脚本
https://github.com/feelins/Praat_Scripts
本站所有Praat脚本都可以在上述github的项目目录里找到,如果日常对代码、脚本操作比较熟练的可通过下载、安装、配置github for windows在自己的电脑上通过git clone将代码下载到本机,这样的好处是可以跟主站及时更新代码。
不想费如此脑筋,可以通过点击如下图1位置所示,下载整站的代码,也可直接使用。

本文的代码是20-stats_basic_infomation/Get_basic_infos.praat,点进去之后,还有附带的示例文件,同学可练习使用。脚本里有我的邮箱,有任何问题都可以来信咨询。
关注
关于对本站脚本的使用咨询,以及功能修改,增加等,都可以扫QQ咨询群,私信群主。

版权说明
1、版权归本公众号“极地语音工作室”,原名“语音处理小站”所有;
2、未经本站或者作者允许, 不得任意转载本文内容,否则将视为侵权;
3、转载或者引用本文内容请注明来源及原作者;
4、对于不遵守此声明或者其他违法使用本站内容者,本人依法保留追究权等。
850

被折叠的 条评论
为什么被折叠?



