【Day9】 Speaker Identification 介绍与 D_VECTOR 实做

旧时代的 Speaker Identification

同一人讲不同话,再转成 Mel 之後还是不同的东西,那我们又该如何判断出一句话是哪个人讲的呢 ?

  • 这样的任务在深度学习大红大紫之前就有人做过了,那时候用的是名叫高斯混合模型 (GMM) 的方法,他是由很多个高斯分布的线性组合而成的,这个方法在理论上是可以拟合所有的类型分布。

  • 有了 GMM 之後,接着又延伸出了 i-vector 的演算法,相对於 GMM 这种生成模型是类别确定的 (类别之外的无法被 GMM 处理,实际上也不可能训练一个全人类的声音分类器),i-vector 它转而去寻找一个 hidden variable space,让每个人都是这个空间里的一员。

  • 到这里传统的做法就告一段落了(自己也没有深入去研究怎麽算的 XD),但如果你对 GMM 有兴趣的化可以参考这篇论文

新时代的 Speaker Identification

  • 在 D_VECTOR 出现以前 i-vector 框架可以说是毫无对手,整整占据了 Speaker Identification 这个项目长达 14 ~ 15 年之久,而接下来要介绍的这个 D_VECTOR 就纯粹的只有 DNN 架构,没有任何复杂又劝退的机率模型,大大降低了这项任务的门槛,是划时代的变革,尽管我们用 DNN 去学到的东西跟 i-vector 是相同的,都是在寻找 hidden variable space,然而 D_VECTOR 的模型架构却十分的简单。

把它训练模型写出来就长这个样子

  # class 看你用几种
  def build_model(input_size,hidden_size = 256,n_class = 5):
      model = Sequential(
            [  
               Dense(hidden_size,input_shape=(input_size,)),
               Activation('relu'),
               ########################
               Dense(hidden_size),
               Activation('relu'),
               Dropout(0.5),
               Dense(hidden_size),
               Activation('relu'),
               Dropout(0.5),
               ###################################
               # D_VECTOR 的源头就在下面这一层提出来  #
               ###################################
               Dense(dim_emb,name="class_dense"), 
               Activation('softmax')   
            ]
        )
     return model
  • 在训练的时候输入 x 就是语音的特徵 (梅尔倒频系数或是你可以参考 paper 的作法),目标 y 则是类别标签,loss 采用 categorical_crossentropy

  • 在评估的时候输入 x 只通过最後一层 Dense 再把结果做 L2 norm 然後累加出来做平均(或是 PCA)就炼成了 D-VECTOR,也就是 Speaker Embedding。

  • 当然 D_VECTOR 的模型也有许多变体,像是你可以把 Dense 改 LSTM,或是用 Convlution 去达成,我们上面做的是最古老的版本。

评估我的 D-VECTOR 有没有起做用

比方说现在有 N 个不同的人,模型也照这五人训练了,那要怎麽评估模型有用呢?

  1. 从这 N 人的测试资料集算出平均的 D-VECTOR

  2. 从这 N 人再取不在资料集的语音算 D-VECTOR

  3. 计算两 D-VECTOR 的 Cosin 距离,各自对应的都该是最短距离

     from sklearn.metrics.pairwise import cosine_similarity
     result = []
     #  ave_dv 有 5 人的平均 D-VECTOR
     for test_dv in ave_dv:
         tmp = []
         # valid_dvs 有 5 人不在资料集的 D-VECTOR
         for valid_dv in valid_dvs:
             res = cosine_similarity([test_dv], [valid_dv])
             tmp.append(res)
         result.append(tmp)
    

小结 & 碎念

今天我们简单介绍也实做了 D_VECTOR ,明天开始我们终於要正式进入声音转换的部分了!

台风要来了,大家记得做个防台准备吧!

参考资料

D_Vector Implement
D_Vector Paper

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  问题整理(一)Day5

>>:  Day 9 - 间距使用方式

网路是怎样连接的(五)Socket API

思考重点 如何将应用程序消息委托给协议栈发送? socket是调用那些函式进行收发操作? 核心知识 ...

【零基础成为 AI 解梦大师秘笈】Day30 - Django 整合部署 AI model

AI 解梦最终秘笈 前言 系列文章简介 大家好,我们是 AI . FREE Team - 人工智慧自...

iOS APP 开发 OC 第二十四天,funtion 参数是否可以nil?

tags: OC 30 day 我在swift读书会上发起了这个疑问,得到非常多人的解惑,因此发起这...

[Day 16] Data! — 资料就是我的超能力

Data is the hardest part of ML and the most impor...

Day20_CSS语法3

ID选择器(ID selector) : 符合指定id的HTML元素做为要套用样式规则的对象,命名格...