我正在用Python为我的家人建立一个个人语音助手,使用遍布整个房子的Raspberry Pi单元和一个中央服务器。
Pis从arecord
通过环形缓冲区循环16khz音频,保持两秒窗口。来自snowboy.kitt.ai的个人模型,非常巧妙地设置,测试窗口并将匹配的剪辑发送到中央服务器。
在那里,使用librosa
将剪辑转换为MFCC,并且基于Tensorflow(真实的,真实的)DNN检查作为辅助过滤器。每个新剪辑都会保存到队列中,以便我可以在重新训练模型之前运行并标记它们。
它有点工作,但还不够好 - 我的妻子会告诉你,当她打开堆肥桶时,它喜欢醒来。即使训练数据中有大量随机的爆炸和猛烈撞击,但是大声的噪音经常会让人感到困惑。
关于代码,起点来自此YouTube视频(不要笑,我发现它很有帮助!):https://www.youtube.com/watch?v=u9FPqkuoEJ8
在简化示例代码并进行一些更改以减少收敛的纪元数之后,我最终得到了这个:
def build_model(categories):
import tflearn
tflearn.init_graph(num_cores=16, gpu_memory_fraction=0.5)
net = tflearn.input_data([None, WIDTH, HEIGHT])
net = tflearn.lstm(net, 128)
net = tflearn.fully_connected(net, 128)
net = tflearn.fully_connected(net, 128)
net = tflearn.fully_connected(net, 128)
net = tflearn.fully_connected(net, len(categories), activation='softmax')
net = tflearn.regression(net, optimizer='adam', loss='categorical_crossentropy')
return tflearn.DNN(net, tensorboard_verbose=3)
我这样训练:
model.fit(inputs, targets, shuffle=True, n_epoch=10, validation_set=0.2, show_metric=True, run_id=run_id)
输入数据细分如下:
3 cal.wav
2950 false_positive.wav
7182 guess_negative.wav
16 guess_positive.wav
1 heather.wav
30 jennie.wav
1 jim.wav
4 leo.wav
40 simon.wav
14 teddy.wav
1098 wade.wav
唤醒词(是/否)训练通过将样本分为两类来进行操作,一个是所有的false_positives,另一个是所有名称的联合(减去猜测)。
在10个时代之后,我得到了这个损失,这看起来很不错:
| Adam | epoch: 010 | loss: 0.07699 - acc: 0.9907 | val_loss: 0.37000 - val_acc: 0.8916 -- iter: 3172/3172
问题是,我无法判断它是否记住了训练数据,或者它是否真的学到了什么。
那么,我该如何调整这个系统呢?添加和删除图层,更改尺寸以及更改随机数感觉就像是黑魔法。
改善(最大化,真正)检测系统准确性的理性方法是什么?谢谢!