同一人讲不同话,再转成 Mel 之後还是不同的东西,那我们又该如何判断出一句话是哪个人讲的呢 ?
有了 GMM 之後,接着又延伸出了 i-vector 的演算法,相对於 GMM 这种生成模型是类别确定的 (类别之外的无法被 GMM 处理,实际上也不可能训练一个全人类的声音分类器),i-vector 它转而去寻找一个 hidden variable space,让每个人都是这个空间里的一员。
到这里传统的做法就告一段落了(自己也没有深入去研究怎麽算的 XD),但如果你对 GMM 有兴趣的化可以参考这篇论文
把它训练模型写出来就长这个样子
# 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 去达成,我们上面做的是最古老的版本。
比方说现在有 N 个不同的人,模型也照这五人训练了,那要怎麽评估模型有用呢?
从这 N 人的测试资料集算出平均的 D-VECTOR
从这 N 人再取不在资料集的语音算 D-VECTOR
计算两 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
思考重点 如何将应用程序消息委托给协议栈发送? socket是调用那些函式进行收发操作? 核心知识 ...
AI 解梦最终秘笈 前言 系列文章简介 大家好,我们是 AI . FREE Team - 人工智慧自...
tags: OC 30 day 我在swift读书会上发起了这个疑问,得到非常多人的解惑,因此发起这...
Data is the hardest part of ML and the most impor...
ID选择器(ID selector) : 符合指定id的HTML元素做为要套用样式规则的对象,命名格...