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

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

基频曲线的距离应用

  • 一、研究目的


  • 二、相似度概念


  • 三、数据说明


  • 四、技术方案

    • 1. 方案一
    • 2. 方案二

  • 五、步骤

    • 1. 提取训练集的数据
    • 2. 提取测试集的数据
    • 3. 第一方案实现
    • 4. 第二方案实现
    • 5. 结果分析

  • 六、获取脚本

  • 版权说明


一、研究目的

我们已经知道如何利用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、对于不遵守此声明或者其他违法使用本站内容者,本人依法保留追究权等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/578413.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存