我正在尝试使用Keras和傅里叶变换来创建一个基于神经网络的说话人识别系统,处理的语音样本是我和我的朋友持续3秒钟说“eeeee”。现在的问题是,如果我们给神经网络输入另一个人的语音(同样是3秒钟的“ee”),它仍然会输出100%的概率认为是我们其中之一。我使用softmax输出数据,所以对于我的朋友输出大约是[1, 0],对我则是[0, 1]。有时候输出会是[0.95, 0.05]。
除了输入另一个人的数据时,它仍然会输出像[1,0]这样的结果之外,其他情况运行良好,但我期望它会给出像[0.6, 0.4]这样的结果,因为这是另一个人的声音。我还尝试使用了MFCC的两个特征,但似乎也没用。我想增加第三个输出并用随机样本进行训练是否可行(我自己并不认为这样做有效,因为它无法针对所有不同的输入进行训练)?或者我该如何尝试解决这个问题?我已经为这个问题挣扎了很长时间,任何帮助都将不胜感激!
回答:
神经网络本质上不过是高级的特征提取器和插值器。
对于它从未见过的数据,不应期望有什么特定的表现,这与使用DTFT、MFCC或I-Vectors无关,这是数据驱动算法的基本原则。
仅作为方法论的解释,不应过于字面理解,通过寻找两个说“eeeeeeeee”的说话人之间的差异,可以通过找出平均音高并基于这个不太有信息量的特征来决定。
那么,当引入一个新的语音时,你认为会发生什么?
最后一点 – 有很多方法可以解决这种退化情况,你很可能会遇到一些过拟合。这也可能导致对样本外数据出现意外的结果。
关于一般问题,有几种不同的方法,但我推荐采用两阶段的方法:
- 使用1类SVM或类似方法,识别语音是否属于
你或你的朋友
这一类 - 你训练的神经网络。
另一种选择是收集足够的“一般说话人”的样本,并将其作为第三类添加。这种方法在某些情况下被称为分类中的OOS(样本外)类别。这可以为你提供一些不错的搜索资料 🙂