Praat脚本-039 | 如何统计TextGrid标注的一致性及有效完成校对的方案

引题

我们在做标注的时候,是否会有这样的需求,这件事可能是好几个人在标注,或者工作要分配给外部类似于外包标注。这时候,你可能要知道,这一批数据(TextGrid)在这些处理的人中,是否具有标注一致性?这里会有两个问题要考虑:

  1. 我们想知道标注一致性是一个什么结论,即A、B标注的一致率是多少?如果假定A是专业标注员的答案,我们可能就相当于知道B的标注正确率是怎么样的,引申一下就是,我们也知道另外一个C和B谁的正确率更高一些;
  2. 即使我们知道了一致性,可能好,也可能不好,但是事情还是要完成,就是拿到的N个人的数据,我们还是要完成一份值得信赖的数据,如何处理呢?
    带着这两个问题,我们以下来解释如何完成。

首先,假定这是一个A标注,也可以认为是标准标注答案,我们用其它的标注来和它比较。
在这里插入图片描述
这一段示例是英语标注中,有8个词,每个词有若干音素。我们再来看另外两个人分别为B和C的标注情况。

标注者B:
在这里插入图片描述
标注者C:
在这里插入图片描述
很明显,标注者B有4处和A不同,标注者C有6处和A不同,假定我们认为A是标准答案,或者是比较专业的标注者,那么很明显C的一致率要差一些。另外我们也会提供另外一个维度,就是根据词的一致率,比如B出错的位置其实是包括在3个词以内的;而C出错的位置是包括在5个词以内,通过词一致率可能也是另外一个观察维度。我们单纯以这一个文件为例,可以得出以下的结论:

类别B-AC-A
词一致率0.70.5
音素一致率0.890.83

很明显,B的标注结果要好于C的标注结果。

我们就来看看,如何通过脚本得到这些结果,显然,我们在实际过程中要面对上百上千上万的文件,通过肉眼观察,或者人工检查数量并不可取,通过脚本批量操作,最起码得到一个比较客观的,对于不同标注结果的一个认识,有助于我们进一步分析标注的实际情况表现。

现在回到我们最开始的的两个问题,首先解决直接得到一个一致率的应用场景。

使用场景一

在这里有两个前提,需要统计的两个人(两个目录)里的文件必须是一样的文件名,文件个数,不同的情况不在本文的讨论范围内。另外就是每个文件打开之后,他们的层级关系也应该是一样的。

运行脚本

打开Praat之后,选择PraatOpen Praat Script...,打开这个脚本,然后在脚本窗口选择RunRun,或者直接使用快捷键Ctrl+R,在弹出来的对话框里,设置以下几个地方,因为只对TextGrid统计一致率,这里无需关心是否有wav目录:

  1. 设置你的主TextGrid所在的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个A/就好了;
  2. 设置你的次要TextGrid所在的目录, 即是待比较的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个B/就好了;
  3. 设置词或者字层级;
  4. 设置音素层级, 第3,4项因为是本文用的示例,分别在第1,2层,读者自己的数据可能这两层需要更改;
  5. 设置目标结果所在的路径,这里是结果保存在一个文本文件里。
    在这里插入图片描述
    运行之后,我们在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之间,再次通过人工检查,最终得到一个相对比较正确的标注结果。这时候我们可以 考虑分成以下几个步骤:

  1. 首先通过比较,将不一致的地方标记,并且合并A、B的两层,形成四层的一个新的文件;
  2. 根据标记的位置,查看每一个位置,将正确的结果全部都修改在某一层上,比如修改在原来A的两层上;
  3. 删除用来对比的另外一个标注的层级,即B的两层,得到最终的结果;

第一步运行脚本,得到待修改TG

打开Praat之后,选择PraatOpen Praat Script...,打开这个脚本,然后在脚本窗口选择RunRun,或者直接使用快捷键Ctrl+R,在弹出来的对话框里,设置以下几个地方,因为只对TextGrid统计一致率,这里无需关心是否有wav目录:

  1. 设置你的主TextGrid所在的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个A/就好了;
  2. 设置你的次要TextGrid所在的目录, 即是待比较的目录。因为示例的目录和脚本在同一个目录,所以这里只输入一个B/就好了;
  3. 设置词或者字层级;
  4. 设置音素层级, 第3,4项因为是本文用的示例,分别在第1,2层,读者自己的数据可能这两层需要更改;
  5. 注意这里选择check_not选项,代表我们要生成修改的TG结果;
  6. 同第5步,要给定一个输出的修改TG结果的目录,我们这里用new_TextGrid_A_B表示;
  7. 设置目标结果所在的路径,这里是结果保存在一个文本文件里,这个结果在这里也是默认生成的。
    在这里插入图片描述

我们生成了一个修改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、对于不遵守此声明或者其他违法使用本站内容者,本人依法保留追究权等。

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Praat是一种语音分析软件,可以用来提取基频,也称为声音的基本频。基频是声音中重复性的振动速度,通常对应于声音的音高。 在Praat中提取基频的脚本可以通过以下步骤完成: 1. 从声音文件导入数据:首先,需要在Praat中打开声音文件,可以通过脚本命令`Read from file`来实现。这将把声音文件加载到Praat的对象中。 2. 创建声音分析对象:接下来,需要使用`Sound`对象来表示声音。可以使用脚本命令`Create Sound as pure tone`或`Create Sound as noise`来创建声音分析对象。 3. 设定分析参数:在分析之前,需要设置基频分析的参数。可以使用脚本命令`To Pitch`来打开基频分析对话框,并设置参数,如最小基频、最大基频等。 4. 提取基频:一旦设置好了分析参数,可以使用脚本命令`Get pitch`来提取基频。这将基于所选的参数对声音进行基频分析,并将结果保存在Praat的对象中。 5. 导出基频数据:最后,可以使用脚本命令`Write to spreadsheet file`将基频数据保存为电子表格文件,以供进一步分析或处理。 需要注意的是,以上步骤仅提供了一个基本的基频提取框架,实际使用时可能需要根据具体的需求进行参数调整和数据处理。 总结而言,利用Praat提取基频的脚本主要包括导入数据、创建声音对象、设置分析参数、提取基频和导出数据等步骤,可以根据具体需求进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极地语音工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值