导入需要的库
使用Keras搭建网络。更方便快捷。
import numpy as np
import os
from keras.models import Model
from keras.optimizers import Adam
from keras.utils import Sequence
from scipy.io import wavfile
from keras.regularizers import l2 # 正则化器
import warnings
warnings.filterwarnings('ignore')
from keras.layers import (
Input,
Dense, # 一维全连接层
Conv2D,
Lambda,
Activation,
Flatten,
Dropout,
Bidirectional, # RNN的双向封装器,对序列进行前向和后向计算。
LSTM,
Reshape,
TimeDistributed # 这个封装器将一个层应用于输入的每个时间片,输入至少为 3D,且第一个维度应该是时间所表示的维度。
)
数据预处理
提前准备好24类语音指令,用ffmpeg转化格式为wav,设置音频采样率为16000,分为训练集和测试集。命名格式采用‘order_label.wav’,order为整体的序号,label为指令的标签,0~23。
三个标准化的函数如下,分别用于调整相对大小、去除前后没有声音的片段、增添一小段空白。
def normalize(snd_data):
"Average the volume out"
times = 5.0/max(abs(i) for i in snd_data)
r = []
for i in snd_data:
r.append(i*times)
return r
def trim(snd_data):
"Trim the blank spots at the start and end"
def _trim(snd_data):
snd_started = False
r = []
for i in snd_data:
if not snd_started and abs(i)>0.7:
snd_started = True
r.append(i)
elif snd_started:
r.append(i)
return r
# Trim to the left
snd_data = _trim(snd_data)
# Trim to the right
snd_data.reverse()
snd_data = _trim(snd_data)
snd_data.reverse()
return snd_data
def add_silence(snd_data):
n = int((35000-len(snd_data))/2)
m = 35000-len(snd_data)-n
r = [0 for i in range(n)]
r.extend(snd_data)
r.extend([0 for i in range(m)])
return r
def reprocess(label,data):
res = []
res1 = []
for f in data:
path = os.path.join('./audioNet/data',label,f)
_,sig = wavfile.read(path)
sig=normalize(sig)
sig=trim(sig)
if len(sig)>35000:
continue
sig=add_silence(sig)
res.append(sig)
res1.append(int