Walleclipse / Deep_Speaker-speaker_recognition_system

Keras implementation of ‘’Deep Speaker: an End-to-End Neural Speaker Embedding System‘’ (speaker recognition)
245 stars 81 forks source link

关于改小网络结构 #68

Closed Jesse-Ccc closed 3 years ago

Jesse-Ccc commented 3 years ago
   您好,看了您的文档,准确率能达到98%左右。现在我需要用一个小的网络去做声纹识别,能够识别十人以内,能否将网络参数量减小到几万。同时其准确率会下降大概多少。另外,最后的512映射层只是普通的全连接层吗,是否有其他的操作?
   期待您的回复。
Walleclipse commented 3 years ago

你好,models.py里面的convolutional_model_simple 是比较小的模型,参数是7M(70万)。 如果你们想用更小参数的模型,可以考虑进一步减少该模型的参数(比如减少层数减少weight的维度等)。或者可以考虑一些轻量化的CNNs,比如ShuffleNetSqueezeNet 等。github 上都可以找到相应的代码可供参考,比如shufflenetV2,只需要把输入与输出改成符合声纹识别的就好。

Jesse-Ccc commented 3 years ago

非常感谢您的回复,目前我已經将模型改小到十多万参数量,只是不知道效果怎么样,还需要测试一下。另外对比一下其他的小模型吧。

Jesse-Ccc commented 3 years ago

你好,models.py里面的convolutional_model_simple 是比较小的模型,参数是7M(70万)。 如果你们想用更小参数的模型,可以考虑进一步减少该模型的参数(比如减少层数减少weight的维度等)。或者可以考虑一些轻量化的CNNs,比如ShuffleNetSqueezeNet 等。github 上都可以找到相应的代码可供参考,比如shufflenetV2,只需要把输入与输出改成符合声纹识别的就好。

您好,一般的声纹识别是分为三个阶段的。您能否讲讲这个代码是如何对应这几个阶段的。这个代码的流程是否为先预训练一个模型,然后把注册人的语句(比如一句注册的话)放进去再训练。最后得到这个特定注册人的模型。十分期待您的回复。如果方便,希望加下您的微信,方便交流,我的微信是cx854187669

Walleclipse commented 3 years ago

你好, 我不是特别清楚声纹识别的三个阶段。 这个代码的流程是,先准备训练数据集(包括需要注册的所有人),随后进行训练,模型的输出是一段语音的embedding。 测试阶段输入某一个语音,得到该语音的embedding后可以和之前在训练数据集上已知的人的embedding进行相似度计算来确定是否是该人。

Jesse-Ccc commented 3 years ago

十分感谢您的回复。我最近又看了一下这份代码,和您说的是差不多的。我其实想问的是实际应用时是如何工作的。大概流程是先通过一批数据训练一个通用的说话人模型(对应开发阶段),然后根据将注册人的语音输入这个通用模型得到注册人的embedding(对应注册阶段),最后在识别时根据当前说话人语句,从通用模型提取出embedding和注册人的embedding进行对比就可以进行识别。

Walleclipse commented 3 years ago

你好, 这个代码的 train.py 应该对应开发阶段:一批数据训练一个通用的说话人模型.
注册阶段应该对应inference, 大概用法是 embedding = model.predict(input_utter), 可以查看issue 30.
得到embedding后你可以和训练阶段的不同人的embedding进行对比,比如计算cosine similarity等.

Jesse-Ccc commented 3 years ago

多谢多谢

Jesse-Ccc commented 3 years ago

您好,最近又研究了一下您的代码。于是有这么几个问题: 1.我在使用model.predict(),然后计算相似度判断两段语音是否为同一人。比如当我第一次注册语音为唤醒词:‘‘小度小度‘’,第二次验证时,我使用’‘小爱同学’‘验证,能否区分唤醒的词语,不同的唤醒词不应该识别成功。我的问题就是训练出的模型能否区分唤醒词,我想让不同的唤醒词不能识别。其中我看到提取特征采用的fbank,这个特征是能否区分识别的词语差异。 2.我目前想在自己的数据集上进行实验,目的是能让模型只能根据第一次注册的词语进行识别成功,其他的词语是不能识别成功的。同时第一次注册可以根据需要制定不同的,比如‘’小度小度‘’,‘’小爱同学‘’等。注册完后只能该注册人说出注册时的词语才能识别成功。我的训练集中同一个人是否要有多个唤醒词的语句,训练集未出现过的词语,当我注册时是否也能成功。 3.我在训练时采用cnn+gru的结构,发现loss值很难下降,目前是1.几。请问您在训练时是用的什么配置训练多久停止的,多少step。我目前用的两张rtx2080ti,发现训练也很慢,请问该代码是否支持双卡训练。 十分感谢您之前的回复,感激不尽。期待您能帮我答疑解惑。

Walleclipse commented 3 years ago
  1. fbank其实也可以区分词语差别,但关键在于你的训练语料。如果你训练语料里,同一个人说的不同内容的语音都属于一个类,那显然最终的模型是无法区分的,就比如说我训练的这个模型。但是你在设计训练语料时你已经把同一个人的不同内容分开了,也就是同一个人的不同内容属于negative sample,那么可能可以区别不同内容。但是由于这个项目是针对说话者识别的,所以语义上的鉴别能力可能不是特别强。
  2. 是的,你的训练集中要有一个人多个内容的语音,但是你要注意,多个内容的语音要属于不同的类别,而不是像该repo的数据集一样,属于同一个类别。也就是一个人的唤醒词是一个类别,非唤醒词是其他类别。
  3. 说实话,gru模型我也没能训练成功,我最后用的是CNN模型。你可以查看实验报告,里面写了一些细节。
Jesse-Ccc commented 3 years ago

感谢您的回复,我大概懂你意思了,感谢您的答疑解惑,自己也有了一定的想法。我也看了百度的那篇论文。目前我只是简单的在1700人、每人3句的数据集上训练大概1000itr。 1.在训练中我发现loss值极其不稳定,不知道是数据的问题还是我使用的cnn+gru结构。 2.如果在该结构上使用attention,该使用哪种attention,目前我也在看一些在声纹项目使用attention的论文,但是不知道使用哪种或是有什么好的项目。 再次感谢您的耐心指导。

Walleclipse commented 3 years ago
  1. 我建议你首先训练cnn模型,等没有问题再考虑gru模型。gru训练存在很多问题。
  2. 最典型的attention就是把mean(比如 models.py 中的134行)操作改成加权平均,而这个权重就是来自于attention。