最近用python做了VQLBG的说话人识别实验,记录一下。若是有错恳请指出。

矢量量化的基本原理

将若干个标量数据组成一个矢量(或者是从一帧语音数据中提取的特征矢量)在多维空间给予整体量化,从而可以在信息量损失较小的情况下压缩数据量。矢量量化有效地应用了矢量中各元素之间的相关性,因此可以比标量量化有更好的压缩效果。

设有whisper 说话人识别 基于vq的说话人识别_后端whisper 说话人识别 基于vq的说话人识别_语音识别_02维特征矢量whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_03(whisper 说话人识别 基于vq的说话人识别_python_04whisper 说话人识别 基于vq的说话人识别_语音识别_02维欧几里德空间whisper 说话人识别 基于vq的说话人识别_后端_06中),其中第whisper 说话人识别 基于vq的说话人识别_后端_07个矢量可记为:
whisper 说话人识别 基于vq的说话人识别_码本_08
whisper 说话人识别 基于vq的说话人识别_语音识别_09可被看作是语音信号中某帧参数组成的矢量。将whisper 说话人识别 基于vq的说话人识别_语音识别_02维欧几里得空间whisper 说话人识别 基于vq的说话人识别_后端_06无遗漏地划分成whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_12个互不相交的子空间whisper 说话人识别 基于vq的说话人识别_python_13,即满足
whisper 说话人识别 基于vq的说话人识别_码本_14
这些子空间whisper 说话人识别 基于vq的说话人识别_码本_15称为胞腔。在每一个子空间whisper 说话人识别 基于vq的说话人识别_码本_15找一个代表矢量whisper 说话人识别 基于vq的说话人识别_语音识别_17,则whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_12个代表矢量可以组成矢量集为:
whisper 说话人识别 基于vq的说话人识别_python_19
这样,whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_20就组成了一个矢量量化器,被称为码书或码本;whisper 说话人识别 基于vq的说话人识别_语音识别_17成为码失或码字;whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_20内矢量的个数whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_12,则叫做码本长度或码本尺寸。不同的划分或不同的代表矢量选取方法就可以构成不同的矢量量化器。

当矢量量化器输入一个任意矢量whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_24进行矢量量化时,矢量量化器首先判断它属于哪个子空间whisper 说话人识别 基于vq的说话人识别_码本_15,然后输出该子空间whisper 说话人识别 基于vq的说话人识别_码本_15的代表矢量whisper 说话人识别 基于vq的说话人识别_语音识别_17。也就是说,矢量量化过程就用whisper 说话人识别 基于vq的说话人识别_语音识别_17代表whisper 说话人识别 基于vq的说话人识别_语音识别_09的过程,或者说把whisper 说话人识别 基于vq的说话人识别_语音识别_09量化成whisper 说话人识别 基于vq的说话人识别_语音识别_17,即
whisper 说话人识别 基于vq的说话人识别_后端_32
式中,whisper 说话人识别 基于vq的说话人识别_python_33为量化器函数。由此可知,矢量量化的全过程就是完成一个从whisper 说话人识别 基于vq的说话人识别_语音识别_02维欧几里得空间whisper 说话人识别 基于vq的说话人识别_后端_06中的矢量whisper 说话人识别 基于vq的说话人识别_语音识别_09whisper 说话人识别 基于vq的说话人识别_语音识别_02维空间whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_38有限子集whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_20的映射:
whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_40
下面以whisper 说话人识别 基于vq的说话人识别_语音识别_41为例来说明矢量量化过程。当whisper 说话人识别 基于vq的说话人识别_语音识别_41时,所得到的是二维矢量。

即我们有N个二维的特征矢量whisper 说话人识别 基于vq的说话人识别_python_04,第whisper 说话人识别 基于vq的说话人识别_后端_07个二维矢量为whisper 说话人识别 基于vq的说话人识别_后端_45,则所有可能的whisper 说话人识别 基于vq的说话人识别_后端_45就是一个二维空间。

矢量量化就是先把这个平面划分成whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_12块互不相交的子区域whisper 说话人识别 基于vq的说话人识别_python_13,然后从每一块中找出一个代表矢量whisper 说话人识别 基于vq的说话人识别_后端_49,这就构成了一个有whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_12块区域的二维矢量量化器,下图就是一个码本尺寸为whisper 说话人识别 基于vq的说话人识别_后端_51的二维矢量量化器,共有7块区域和7个码字表示代表值,码本是whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_52

whisper 说话人识别 基于vq的说话人识别_python_53

如果利用该量化器对一个矢量whisper 说话人识别 基于vq的说话人识别_后端_45进行量化,那么首先要选择一个合适的失真测度,然后根据最小失真原理,分别计算用各码矢whisper 说话人识别 基于vq的说话人识别_语音识别_17代替whisper 说话人识别 基于vq的说话人识别_语音识别_09所带来的失真。其中,产生最小失真值时所对应的那个码矢,就是矢量whisper 说话人识别 基于vq的说话人识别_语音识别_09的重构矢量(或称恢复矢量),或者成为矢量whisper 说话人识别 基于vq的说话人识别_语音识别_09被量化成了那个码矢。

说话人识别系统通常包括两个过程:训练和识别。而关键在于训练上。

训练步骤

步骤:

  1. 从训练语音提取特征矢量,得到特征矢量集。
  2. 选择合适的失真测度,并通过码本优化算法生成码本。
  3. 重复训练修正优化码本。
  4. 存储码本。

如果用whisper 说话人识别 基于vq的说话人识别_语音识别_59表示训练用特征矢量whisper 说话人识别 基于vq的说话人识别_python_04与训练出的码本的码字whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_20之间的畸变,那么最佳码本设计就是再一定的条件下,使得畸变的统计平均值whisper 说话人识别 基于vq的说话人识别_语音识别_62达到最小。这里,whisper 说话人识别 基于vq的说话人识别_后端_63表示对whisper 说话人识别 基于vq的说话人识别_python_04的全体所构成的集合以及码本的所有码字whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_20进行统计平均。为了实现这一目的,应该遵循以下两条原则:

  1. 根据whisper 说话人识别 基于vq的说话人识别_语音识别_66选择相应的码字whisper 说话人识别 基于vq的说话人识别_后端_67时应遵从最近邻准则,可表示为:
    whisper 说话人识别 基于vq的说话人识别_语音识别_68
  2. 设所有选择码字whisper 说话人识别 基于vq的说话人识别_后端_67(即归属于whisper 说话人识别 基于vq的说话人识别_后端_67所表示的区域)的输入矢量whisper 说话人识别 基于vq的说话人识别_语音识别_66的集合为whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_72,那么whisper 说话人识别 基于vq的说话人识别_后端_67应使此集合中的所有矢量与whisper 说话人识别 基于vq的说话人识别_后端_67之间的畸变值最小。如果whisper 说话人识别 基于vq的说话人识别_语音识别_66whisper 说话人识别 基于vq的说话人识别_码本_76之间的畸变值等于他们的欧式距离,那么容易证明whisper 说话人识别 基于vq的说话人识别_后端_67应等于whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_72中所有矢量的质心,即whisper 说话人识别 基于vq的说话人识别_后端_67应由下式表示:
    whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_80
    这里whisper 说话人识别 基于vq的说话人识别_语音识别_81代表whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_72中所包含的矢量的个数。

根据这两条原则,可以得到一种码本设计的递推算法——LBG算法。整个算法实际上就是上述两个条件的反复迭代过程,即从初始码本中寻找最佳码本的迭代过程。它由对初始码本进行迭代优化开始,一直到系统性能满足要求或不再有明显的改进为止。

LBG步骤

具体实现步骤如下:

  1. 设定码本和迭代训练参数:设全部输入训练矢量whisper 说话人识别 基于vq的说话人识别_语音识别_66的集合为whisper 说话人识别 基于vq的说话人识别_python_84;设置码本的尺寸为whisper 说话人识别 基于vq的说话人识别_python_85;设置迭代算法的最大迭代次数为whisper 说话人识别 基于vq的说话人识别_语音识别_86;设置畸变改进阈值为whisper 说话人识别 基于vq的说话人识别_码本_87
  2. 设定初始化值:设置whisper 说话人识别 基于vq的说话人识别_python_85个码字的初值whisper 说话人识别 基于vq的说话人识别_码本_89;设置畸变初值whisper 说话人识别 基于vq的说话人识别_语音识别_90;设置迭代次数初值whisper 说话人识别 基于vq的说话人识别_码本_91
  3. 假定根据最近邻准则将whisper 说话人识别 基于vq的说话人识别_python_84分成了whisper 说话人识别 基于vq的说话人识别_python_85个子集whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_94,即当whisper 说话人识别 基于vq的说话人识别_python_95时,下式应成立:
    whisper 说话人识别 基于vq的说话人识别_码本_96
  4. 计算总畸变whisper 说话人识别 基于vq的说话人识别_语音识别_97
    whisper 说话人识别 基于vq的说话人识别_语音识别_98
  5. 计算畸变改进量whisper 说话人识别 基于vq的说话人识别_后端_99的相对值whisper 说话人识别 基于vq的说话人识别_python_100:
    whisper 说话人识别 基于vq的说话人识别_后端_101
  6. 计算新码本的码字whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_102
    whisper 说话人识别 基于vq的说话人识别_语音识别_103
  7. 判断whisper 说话人识别 基于vq的说话人识别_python_100是否小于whisper 说话人识别 基于vq的说话人识别_码本_87。若是,转入(9)执行;否则转入(2)执行。
  8. 判断whisper 说话人识别 基于vq的说话人识别_python_106是否小于whisper 说话人识别 基于vq的说话人识别_语音识别_86。若否,转入(9)执行;否则,令whisper 说话人识别 基于vq的说话人识别_python_108,转入(3)执行。
  9. 迭代终止;输出whisper 说话人识别 基于vq的说话人识别_whisper 说话人识别_102作为训练成的码本的码字,并且输出总畸变whisper 说话人识别 基于vq的说话人识别_语音识别_97

识别步骤

识别步骤如下:

  1. 录制音频,提取音频特征
  2. 与所有码本进行距离计算,产生最小的距离的码本即是最相像的人。

gitee

https://gitee.com/squid_feng/VQLBG.git

只要运行VQSystem.py文件即可体验。