Praat脚本-027 | 通过基频曲线的距离做一个声调判别器

15 篇文章 2 订阅

一、研究目的

我们已经知道如何利用Praat脚本提取基频(见文章,Praat脚本-009 | 提取时长和基频),另外也针对Praat提取的基频值,和工程上的一些工具提取的值进行了比较(见文章,Praat提取的基频可以工程应用吗?)。我们来试着进行一个实验,首先引进一个曲线距离(或称相似度)的概念,当我们提取一个音节的10个点的基频值的时候,这时候其实是相当于用有限的点来描述这个曲线的样子。如图所示,观察这两条基频曲线的时候,我们是否可以有一个尺度来衡量两条曲线的相似性?或者也可以定义为两条曲线的距离,当这个距离特别小的时候,说明这两条曲线是很相似的,认为这两条曲线描述的声调是一个类别的。这样,我们可以相当于得到一个简单的声调分类器,用来对声调进行分类,当然这样的比较是很有限的,因为前提是我们知道所有样本的空间一共有几种声调。
在这里插入图片描述

作为尝试,我们使用的是中文普通话的数据,但是这样的参考可能实际意义有限,因为中文普通话的声调,相对比较稳定,在语流中变化不大,但是抛砖引玉,由这个小小的实验,希望能对研究其它方言区域的声调,或者其它语言的声调分类的研究有所帮助。

在此省略有关于基频和声调表征是否有密切联系?有多大的联系?的此类文章,有兴趣的朋友可去学术网站,获取更有力的表述。本文默认它们是有密切关系的。

二、相似度概念

将10个点的基频值看成一条曲线,与另外一条曲线,计算距离时,我们引入欧几里得度量(Euclidean Metric)(也称欧氏距离),这是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

二维空间的公式为,
在这里插入图片描述
根据这个公式,我们将两条曲线每个对应的点,代入公式,计算每相对应的两个点之间的距离,最后将它们的距离的平方相加,并且取平方根。

在这里插入图片描述

关于距离度量的其它计算方式,可在网上搜索相关理论,这里只是比较常用和简单的一种。

三、数据说明

为了进行我们的实验,我们还是选取开源数据集,标贝的中文数据,这批数据是精标过的,有明确的声调分类(见文章,推荐 | 实用的开源数据(更新中))。在本站的github项目里也有这个数据,提供了100句的对应音频和TextGrid的压缩包。

首先我们留出5句作为测试样本集合,其它95句作为训练的样本,或者叫作为标准的样本集合。所以这里的问题就是训练集的选择很重要,小伙伴如果自己做实验,这里作为标准的集合一定要是能够更好的代表这个类别的典型特征。
在这里插入图片描述
在这里插入图片描述

四、技术方案

对于作为比较标准的训练集,我们有两个办法比较,原则上为了利用上欧氏距离,我们需要让标准样本和待比较样本有相同的数值维度,即都为10个点或者20个点,我们这里选取10个点。第一种方案我们首先计算每个声调分类所有样本点,每个点的平均值,这样得到一个10个点的标准值用于比较;第二种方案,我们将待测试样本的10个点和我们的训练数据每个样本都计算一个距离,然后根据训练数据的分类,每个分类计算这些距离的平均值;

1. 方案一

对于95句的用于当作标准的数值的数据,提取了每个音节的10个点的基频值之后,根据被标注的音节的声调,分成5类(这个是标贝开源数据里的分类,对应汉语普通话的1,2,3,4和轻声),然后分别对这5类的样本求一个总的平均值样本。这个平均值样本是10个点每个点的平均值。这里的平均值,我们假定当成本次实验的标准值。然后对于测试样本,用测试样本的10个点,来和5个类别的平均值样本计算一个距离,显然,我们将距离最小的那个认为是属于这个类别的,如图所示,我们认为这个测试样本应该是声调类别3。
在这里插入图片描述

2. 方案二

对于95句的用于当作标准的数值的数据,提取了每个音节的10个点的基频值之后,根据被标注的音节的声调,分成5类(这个是标贝开源数据里的分类,对应汉语普通话的1,2,3,4和轻声),这个方案不计算平均值,对于测试样本,用测试样本的10个点,来和每个类别中的所有样本计算距离,最终根据类别,计算这个类别里距离的平均值,显然,我们将平均距离最小的那个认为是属于这个类别的,如图所示,我们认为这个测试样本应该是声调类别3。
在这里插入图片描述

五、步骤

1. 提取训练集的数据

这一步完全参考前面的文章,Praat脚本-009 | 提取时长和基频。通过脚本计算出作为标准值的95句话的所有的基频数值。

在这里插入图片描述

2. 提取测试集的数据

同样,我们也提取出留作测试的5句话的结果。
在这里插入图片描述

3. 第一方案实现

先按照第一种方案,我们将前面提到的标准值的数据result_duration_pitch.txt,拷贝到Excel中,这里为了进行分类排序,在Excel中使用一个函数将每个音节的声调值单独提取出来。增加一列,在这里输入=right(b2),回车之后,会把B2单元格的声调值提取出来。

在这里插入图片描述
然后通过拖动C2单元格右下角的黑点,自动填充这一列。
在这里插入图片描述
接下来按分类这一列,排序。
在这里插入图片描述
接下来,我们在Excel里,先根据分类这一列排序,再点击数据菜单里的,分类汇总,在出来的对话框里,分类字段选择分类汇总方式选择平均值汇总项Pitch1-Pitch10都选上,最后点确定。这样就计算出了每个分类这10个Pitch点的平均值。
在这里插入图片描述
现在点击表格左上角的2这个位置。
在这里插入图片描述
这样就得到了这5个分类的平均值。
在这里插入图片描述
现在将这平均值拷贝到记事本,或者notepad++这样的软件里,请注意不要直接拷贝到Excel里。然后再保存为一个平均值的结果。
在这里插入图片描述
最后,我们利用Python脚本,得到最终的结果。Part-05\P05_002_pitch_distance\p05_002_compute_Euclidean_Distance.py。这里的一个输入是刚才在Excel里得到的每个类别的平均值result_duration_pitch_average.txt,一个是作为测试的5句话提出来的结果result_duration_pitch_test.txt,最后是得到方案一的结果。
在这里插入图片描述
运行这个脚本,得到的结果是。
在这里插入图片描述

4. 第二方案实现

第二种方案,我们直接将操作都在Python脚本里进行,直接修改好输入输出,运行Python脚本就好。
在这里插入图片描述
这样也得到类似的结果。
在这里插入图片描述

5. 结果分析

仔细观察计算出的结果,其实总的正确率并不高,两种方案中,第一种方案稍好一些,正确率在60%左右,而方案二正确率不到60%,这里面有很多原因,首先在语流中,每一类声调未必完全按照教科书上的声调形式,再者,我们选为标准的数据也是随机的一批,并且也并没有严格挑选标注,数量上也很少。有兴趣的朋友可以利用更多的数据进行实验。或者用自己手头上的跟声调有关的数据验证。

六、获取脚本

https://github.com/feelins/Praat_Scripts
https://github.com/feelins/Python-linguistics

本站所有Praat脚本或者Python脚本都可以在上述github的项目目录里找到,如果日常对代码、脚本操作比较熟练的可通过下载、安装、配置github for windows在自己的电脑上通过git clone将代码下载到本机,这样的好处是可以跟主站及时更新代码。
不想费如此脑筋,可以通过点击如下图Code位置所示,下载整站的代码,可直接使用。经常打开github网站比较缓慢的同学,可以搜索一下如何加速打开,比如使用uu加速器之类,会有所改善。
在这里插入图片描述

在这里插入图片描述

版权说明

1、版权归本公众号“极地语音工作室”,原名“语音处理小站”所有;

2、未经本站或者作者允许, 不得任意转载本文内容,否则将视为侵权;

3、转载或者引用本文内容请注明来源及原作者;

4、对于不遵守此声明或者其他违法使用本站内容者,本人依法保留追究权等。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

极地语音工作室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值