引题
我们在做标注的时候,是否会有这样的需求,这件事可能是好几个人在标注,或者工作要分配给外部类似于外包标注。这时候,你可能要知道,这一批数据(TextGrid)在这些处理的人中,是否具有标注一致性?这里会有两个问题要考虑:
- 我们想知道标注一致性是一个什么结论,即A、B标注的一致率是多少?如果假定A是专业标注员的答案,我们可能就相当于知道B的标注正确率是怎么样的,引申一下就是,我们也知道另外一个C和B谁的正确率更高一些;
- 即使我们知道了一致性,可能好,也可能不好,但是事情还是要完成,就是拿到的N个人的数据,我们还是要完成一份值得信赖的数据,如何处理呢?
带着这两个问题,我们以下来解释如何完成。
首先,假定这是一个A标注,也可以认为是标准标注答案,我们用其它的标注来和它比较。
这一段示例是英语标注中,有8个词,每个词有若干音素。我们再来看另外两个人分别为B和C的标注情况。
标注者B:
标注者C:
很明显,标注者B有4处和A不同,标注者C有6处和A不同,假定我们认为A是标准答案,或者是比较专业的标注者,那么很明显C的一致率要差一些。另外我们也会提供另外一个维度,就是根据词的一致率,比如B出错的位置其实是包括在3个词以内的;而C出错的位置是包括在5个词以内,通过词一致率可能也是另外一个观察维度。我们单纯以这一个文件为例,可以得出以下的结论:
类别 | B-A | C-A |
---|---|---|
词一致率 | 0.7 | 0.5 |
音素一致率 | 0.89 | 0.83 |
很明显,B的标注结果要好于C的标注结果。
我们就来看看,如何通过脚本得到这些结果,显然,我们在实际过程中要面对上百上千上万的文件,通过肉眼观察,或者人工检查数量并不可取,通过脚本批量操作,最起码得到一个比较客观的,对于不同标注结果的一个认识,有助于我们进一步分析标注的实际情况表现。
现在回到我们最开始的的两个问题,首先解决直接得到一个一致率的应用场景。
使用场景一
在这里有两个前提,需要统计的两个人(两个目录)里的文件必须是一样的文件名,文件个数,不同的情况不在本文的讨论范围内。另外就是每个文件打开之后,他们的层级关系也应该是一样的。
运行脚本
打开Praat
之后,选择Praat
,Open Praat Script...
,打开这个脚本,然后在脚本窗口选择Run
,Run
,或者直接使用快捷键Ctrl+R
,在弹出来的对话框里,设置以下几个地方,因为只对TextGrid统计一致率,这里无需关心是否有wav目录:
- 设置你的
主TextGrid
所在的目录
。因为示例的目录和脚本在同一个目录,所以这里只输入一个A/
就好了; - 设置你的
次要TextGrid
所在的目录
, 即是待比较的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个B/
就好了; - 设置词或者字层级;
- 设置音素层级, 第
3,4
项因为是本文用的示例,分别在第1,2
层,读者自己的数据可能这两层需要更改; - 设置
目标结果
所在的路径,这里是结果保存在一个文本文件里。
运行之后,我们在check_result.txt这个文件里看到以下的结果。首先列出来比较的两个目录名称,以及出现不同位置的时间点和内容,这里包括了标注内容的不同,和标注边界的不同,最后根据前面讨论的,给出整体所有文件出现的词、音素的一致率。
主目录:,A
待比较目录:,B
比较结果如下:
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, danger, 1.05, EY1-ER0
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, philip, 1.82, F-PH
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, philip, 2.02, L-LL
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, steels, 2.54, L-LL
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, this, 0.84, S-TH
cmu_us_arctic_slt_a0002.TextGrid, 标注边界不同, case, 1.83, S-S
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, tom, 2.19, AA1-EY1
比较一致率情况:
检查后两者词/字一致率0.7272727272727273
检查后两者音素一致率0.9090909090909091
我们同样运行一下C目录,得到的结果为:
主目录:,A/
待比较目录:,C/
比较结果如下:
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, author, 0.38, TH-S
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, of, 0.74, V-F
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, philip, 1.82, F-FF
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, steels, 2.7, Z-S
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, etc, 3.06, EH1-ER0
cmu_us_arctic_slt_a0001.TextGrid, 标注内容不同, etc, 3.26, AH0-AA0
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, not, 0.33, AA1-AE1
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, this, 0.84, S-TH
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, particular, 1.01, ER0-EE1
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, case, 1.83, S-SS
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, apologized, 2.55, AH0-AA0
cmu_us_arctic_slt_a0002.TextGrid, 标注内容不同, whittemore, 3.58, AO0-AA0
比较一致率情况:
检查后两者词/字一致率0.5
检查后两者音素一致率0.8441558441558441
无论目录里有多少文件,我们得到了一个整体的一致率结果。
使用场景二
假定我们并没有潜在的标准答案,在上面场景一得到一致率的基础上,我们想对两者,比如A, B之间,再次通过人工检查,最终得到一个相对比较正确的标注结果。这时候我们可以 考虑分成以下几个步骤:
- 首先通过比较,将不一致的地方标记,并且合并A、B的两层,形成四层的一个新的文件;
- 根据标记的位置,查看每一个位置,将正确的结果全部都修改在某一层上,比如修改在原来A的两层上;
- 删除用来对比的另外一个标注的层级,即B的两层,得到最终的结果;
第一步运行脚本,得到待修改TG
打开Praat
之后,选择Praat
,Open Praat Script...
,打开这个脚本,然后在脚本窗口选择Run
,Run
,或者直接使用快捷键Ctrl+R
,在弹出来的对话框里,设置以下几个地方,因为只对TextGrid统计一致率,这里无需关心是否有wav目录:
- 设置你的
主TextGrid
所在的目录
。因为示例的目录和脚本在同一个目录,所以这里只输入一个A/
就好了; - 设置你的
次要TextGrid
所在的目录
, 即是待比较的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个B/
就好了; - 设置词或者字层级;
- 设置音素层级, 第
3,4
项因为是本文用的示例,分别在第1,2
层,读者自己的数据可能这两层需要更改; - 注意这里选择
check_not
选项,代表我们要生成修改的TG结果; - 同第5步,要给定一个输出的修改TG结果的目录,我们这里用
new_TextGrid_A_B
表示; - 设置
目标结果
所在的路径,这里是结果保存在一个文本文件里,这个结果在这里也是默认生成的。
我们生成了一个修改TG的目录,这个目录里的每个文件,有4层,包括了A,B的各两层。
第二步,根据标记修改每一处
打开其中一个文件,我们会发现所有不同的位置全部以绿色背景显示,而且第4层(原来的B文件)这些不同的结果,带了%%%%%
这几个符号。这个符号是我们脚本里故意增加了,是为了更明显。在脚本的这个位置:
Set interval text: tier_phon, iNumPhon, phonNameSecond$ + "%%%%%"
那么这个绿色是怎么实现的呢?这个其实是Praat的一个很好的操作。
首先打开TextGrid标注窗口,选择TextGrid---TextGrid Settings...
这里
重点在最下面两项,由于我们为每个不同的位置加上了%%%%%
符号,所以这里选择ends with---%%%%%
,那么符合这样条件的位置都会自动显示绿色背景。
这里拓展一下,这个标记绿色其实可以有更多的条件,比如等于,不等 于,包括,不包括等 等,欢迎大家尝试,如果对此有需求,不是很会操作的,也欢迎私信一起讨论。
第三步,删除后面两层
标注完成后,这里也提供了一个专门的脚本用来删除第3,4层。这里是写死的脚本,只删除第3,4层。如果大家需要更灵活的删除,可参照前面的文章:Praat脚本-006 | 批量修改删除复制某一层
最后,我们得到了根据2个人标注结果,修改后的最终结果:
希望以上介绍的脚本,和方案对您有帮助。当然实际情况可能要比文章中提到的层级更复杂,也欢迎有需要的朋友在公众号后台私信一起讨论。
获取脚本
https://github.com/feelins/Praat_Scripts
本站所有Praat脚本
都可以在上述github的项目目录
里找到,如果日常对代码、脚本操作比较熟练的可通过下载、安装、配置github for windows
在自己的电脑上通过git clone
将代码下载到本机,这样的好处是可以跟主站及时更新代码。
不想费如此脑筋,可以通过点击如下图Code位置所示,下载整站的代码,可直接使用。
本文的代码是39_compare_two_textgrids\compare_two_TextGrids.praat
。点进去之后,还有附带的示例文件,同学可练习使用。脚本里有我的邮箱,有任何问题都可以来信咨询。
关注
关于对本站脚本的使用咨询,以及功能修改,增加等,都可以扫QQ咨询群,私信群主。
版权说明
1、版权归本公众号“极地语音工作室”,原名“语音处理小站”所有;
2、未经本站或者作者允许, 不得任意转载本文内容,否则将视为侵权;
3、转载或者引用本文内容请注明来源及原作者;
4、对于不遵守此声明或者其他违法使用本站内容者,本人依法保留追究权等。