一、研究目的
二、相似度概念
三、数据说明
四、技术方案
- 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。
对于95句的用于当作标准的数值的数据,提取了每个音节的10个点的基频值之后,根据被标注的音节的声调,分成5类(这个是标贝开源数据里的分类,对应汉语普通话的1,2,3,4和轻声),这个方案不计算平均值,对于测试样本,用测试样本的10个点,来和每个类别中的所有样本计算距离,最终根据类别,计算这个类别里距离的平均值,显然,我们将平均距离最小的那个认为是属于这个类别的,如图所示,我们认为这个测试样本应该是声调类别3。
五、步骤 1. 提取训练集的数据
这一步完全参考前面的文章,Praat脚本-009 | 提取时长和基频。
通过脚本计算出作为标准值的95句话的所有的基频数值。
同样,我们也提取出留作测试的5句话的结果。
先按照第一种方案,我们将前面提到的标准值的数据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
,最后是得到方案一的结果。
运行这个脚本,得到的结果是。
第二种方案,我们直接将 *** 作都在Python脚本里进行,直接修改好输入输出,运行Python脚本就好。
这样也得到类似的结果。
仔细观察计算出的结果,其实总的正确率并不高,两种方案中,第一种方案稍好一些,正确率在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条)