最近用python做了VQLBG的说话人识别实验,记录一下。若是有错恳请指出。
矢量量化的基本原理
将若干个标量数据组成一个矢量(或者是从一帧语音数据中提取的特征矢量)在多维空间给予整体量化,从而可以在信息量损失较小的情况下压缩数据量。矢量量化有效地应用了矢量中各元素之间的相关性,因此可以比标量量化有更好的压缩效果。
设有个维特征矢量(在维欧几里德空间中),其中第个矢量可记为:
可被看作是语音信号中某帧参数组成的矢量。将维欧几里得空间无遗漏地划分成个互不相交的子空间,即满足
这些子空间称为胞腔。在每一个子空间找一个代表矢量,则个代表矢量可以组成矢量集为:
这样,就组成了一个矢量量化器,被称为码书或码本;成为码失或码字;内矢量的个数,则叫做码本长度或码本尺寸。不同的划分或不同的代表矢量选取方法就可以构成不同的矢量量化器。
当矢量量化器输入一个任意矢量进行矢量量化时,矢量量化器首先判断它属于哪个子空间,然后输出该子空间的代表矢量。也就是说,矢量量化过程就用代表的过程,或者说把量化成,即
式中,为量化器函数。由此可知,矢量量化的全过程就是完成一个从维欧几里得空间中的矢量到维空间有限子集的映射:
下面以为例来说明矢量量化过程。当时,所得到的是二维矢量。
即我们有N个二维的特征矢量,第个二维矢量为,则所有可能的就是一个二维空间。
矢量量化就是先把这个平面划分成块互不相交的子区域,然后从每一块中找出一个代表矢量,这就构成了一个有块区域的二维矢量量化器,下图就是一个码本尺寸为的二维矢量量化器,共有7块区域和7个码字表示代表值,码本是。
如果利用该量化器对一个矢量进行量化,那么首先要选择一个合适的失真测度,然后根据最小失真原理,分别计算用各码矢代替所带来的失真。其中,产生最小失真值时所对应的那个码矢,就是矢量的重构矢量(或称恢复矢量),或者成为矢量被量化成了那个码矢。
说话人识别系统通常包括两个过程:训练和识别。而关键在于训练上。
训练步骤
步骤:
- 从训练语音提取特征矢量,得到特征矢量集。
- 选择合适的失真测度,并通过码本优化算法生成码本。
- 重复训练修正优化码本。
- 存储码本。
如果用表示训练用特征矢量与训练出的码本的码字之间的畸变,那么最佳码本设计就是再一定的条件下,使得畸变的统计平均值达到最小。这里,表示对的全体所构成的集合以及码本的所有码字进行统计平均。为了实现这一目的,应该遵循以下两条原则:
- 根据选择相应的码字时应遵从最近邻准则,可表示为:
- 设所有选择码字(即归属于所表示的区域)的输入矢量的集合为,那么应使此集合中的所有矢量与之间的畸变值最小。如果与之间的畸变值等于他们的欧式距离,那么容易证明应等于中所有矢量的质心,即应由下式表示:
这里代表中所包含的矢量的个数。
根据这两条原则,可以得到一种码本设计的递推算法——LBG算法。整个算法实际上就是上述两个条件的反复迭代过程,即从初始码本中寻找最佳码本的迭代过程。它由对初始码本进行迭代优化开始,一直到系统性能满足要求或不再有明显的改进为止。
LBG步骤
具体实现步骤如下:
- 设定码本和迭代训练参数:设全部输入训练矢量的集合为;设置码本的尺寸为;设置迭代算法的最大迭代次数为;设置畸变改进阈值为。
- 设定初始化值:设置个码字的初值;设置畸变初值;设置迭代次数初值。
- 假定根据最近邻准则将分成了个子集,即当时,下式应成立:
- 计算总畸变:
- 计算畸变改进量的相对值:
- 计算新码本的码字
- 判断是否小于。若是,转入(9)执行;否则转入(2)执行。
- 判断是否小于。若否,转入(9)执行;否则,令,转入(3)执行。
- 迭代终止;输出作为训练成的码本的码字,并且输出总畸变。
识别步骤
识别步骤如下:
- 录制音频,提取音频特征
- 与所有码本进行距离计算,产生最小的距离的码本即是最相像的人。
gitee
https://gitee.com/squid_feng/VQLBG.git
只要运行VQSystem.py文件即可体验。