我正在用Python为我的家人构建一个个人语音助手,使用放置在房子里的覆盆子Pi单元和一个中央服务器。在
Pis循环16khz音频从arecord通过一个环形缓冲区,保持两秒的窗口。个人模特雪童,基特,艾,非常允许地设置,测试窗口并将匹配的剪辑发送到中央服务器。在
在那里,剪辑被转换成MFCC使用librosa,一个基于Tensorflow的(tflearn,really)DNN检查充当二级过滤器。每个新剪辑都保存到一个队列中,这样我可以在以后重新训练模型之前遍历并标记它们。在
这有点管用,但还不够好——比如,我妻子会告诉你,当她打开堆肥桶时,她很喜欢醒来。即使训练数据中有大量随机的砰砰声和砰砰声,巨大的噪音也常常使它混淆。在
在简化了示例代码并进行了一些更改以减少要聚合的时间段数之后,我得出了以下结论: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)
我是这样训练的:
^{pr2}$
输入数据细分如下: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
Wake word(yes/no)训练通过将样本分成两类,一类是所有的误报,另一类是所有名字的联合(除去猜测)。在
经过10个时代,我得到了这样的损失,这似乎很好:| Adam | epoch: 010 | loss: 0.07699 - acc: 0.9907 | val_loss: 0.37000 - val_acc: 0.8916 -- iter: 3172/3172
问题是,我不知道是记住了训练数据还是真的学到了什么。在
那么,如何调整这个系统呢?添加和删除层、更改维度和更改随机数感觉像是魔术。在
什么是一个合理的方法来提高(真正最大化)这个检测系统的准确性?谢谢!在