金融风控-神经网络语音识别模型介绍(附代码)
前言
在金融风控领域里,逻辑回归,评分卡,集成树算法是信用风险计算的核心算法。
实际上,金融风控领域覆盖面很广。人脸识别和语音识别也有广泛应用。贷前n要素检测和反欺诈部门会应用人脸识别技术。

催收部门会应用到语音识别模型。今天就介绍一下基础的语音识别模型建模,并提供python代码。

今天我们将看到CNN(卷积神经网络)应用于语音识别应用的示例。
我们基于 CNN 深度学习算法的机器学习模型的目标是对一些简单的单词进行分类,从 0 到 9 的数字开始。
为了提取语音的独特特征,我们将首先采用在ASR(自动语音识别)领域使用的语音编码过程,称为梅尔频率倒谱系数或更简单的MFCC。
借助 MFCC 技术,我们将能够将口头说出的每个单词编码为向量序列,每个向量有 13 个值长,代表 MFCC 算法系数。
在我们的例子中,即由个位数表示的单个单词,我们将使用 48 x 13 矩阵对每个单个数字进行编码。

上图显示了MFCC编码过程中涉及的主要模块链:语音信号在时域中被分割成几个具有适当持续时间(通常为 25-40 ms)的帧。
对于每个分段,我们将计算功率谱密度。结果作为一系列部分重叠滤波器(滤波器组)的输入提供,这些滤波器计算与功率谱的不同频率范围相对应的能量谱密度。
每帧获得 26 个系数,由每个滤波器下游的能量谱结果组成。最后将结果通过离散余弦变换或DCT(离散余弦变换)进行处理。
DCT 具有能够通过尽可能最好地使用低频来编码信号特征的特性:这是一个有用的特性,因为我们正在处理语音信号,其主要特性在 300 到 3400 Hz 之间。
最终结果:在此过程结束时,MFCC为我们提供了13 个有用的系数,我们将通过部署一些最佳分类器(在本例中基于CNN)与适当的机器学习算法一起使用。
就训练阶段而言,我们将使用这里提供的名为Free Spoken Digit Dataset的数据集:它是由不同的人根据不同的环境和时间发音从 0 到 9 的数字的大约2000 段录音。
对于我们的分类器,我们将使用具有不同级别的卷积神经网络,如下所示:

现在让我们看看一些代码和性能!
我们可以将一些有用的库导入到我们的 Python Jupyter Notebook 中:
import pandas as pdfrom sklearn.model_selection import train_test_splitimport pickleimport matplotlib.pyplot as pltimport matplotlib.ticker as tickerfrom IPython.display import HTMLimport numpy as npfrom sklearn import preprocessingimport matplotlib.pyplot as pltfrom scipy.io import wavfile as wavimport scipyfrom python_speech_features import mfccfrom python_speech_features import logfbank
import tensorflow as tf
from keras.models import Sequentialfrom keras.layers import Dense, Flatten, Activation, Dropout, LSTMfrom keras.layers import Conv2D, MaxPooling2D, GlobalMaxPooling2Dfrom keras.optimizers import SGDimport os
让我们分析一条随机语音消息,例如“ 0_jackson_0.wav ”文件:

N = sig1.shape[0]L = N / ratef, ax = plt.subplots()ax.plot(np.arange(N) / rate, sig1)ax.set_xlabel(‘Time [s]’)ax.set_ylabel(‘Amplitude [Base-ten signed range (per sample)]’);
出于好奇,现在让我们看看将 MFCC 函数应用于信号的结果:
mfcc_feat = mfcc(sig1,rate,nfft=512)plt.imshow(mfcc_feat[0:20,:])
我们还可以可视化一种频谱图:实际上它是关于信号每个时间帧的 DCT 的 13 个输出……在这里我们可以看到前 20 个。

现在是我们开始认真做事的时候了。
首先,我们将2000个录音文件导入到一个特殊的向量列表中,然后将其进行适当的转换和分离,从而获得用于学习的有用值和用于预测的目标标签:
soundfile = os.listdir(‘/Users/diego/Diego/Xenialab/AI/jupyter/digits’)data=[]for i in soundfile:(rate,sig) = wav.read(‘/Users/diego/Diego/Xenialab/AI/jupyter/digits/’+i)data.append(sig)
#set the independent varsize = 48X=[]for i in range(len(data)):mfcc_feat = mfcc(data[i],rate,nfft=512)mfcc_feat = np.resize(mfcc_feat, (size,13))X.append(mfcc_feat)X = np.array(X)
#set the target labely = [i[0] for i in soundfile]Y = pd.get_dummies(y)
目标标签无非就是2000个录音文件按照发音数字的矩阵值“1”。
让我们看看这个矩阵的前三行:
print(Y[0:3])
0 1 2 3 4 5 6 7 8 9
0 0 0 0 0 0 1 0 0 0 0
1 0 0 0 1 0 0 0 0 0 0
2 0 0 0 0 1 0 0 0 0 0
因此,前三个加载的录音对应于数字五、三和四。
让我们将目标标签转换成合适的矩阵:
Y = np.array(Y)
我们还可以输出自变量 X 的格式以更好地理解:
print(X.shape)
(2000, 48, 13)
因此,X 由2000 个 48 x 13矩阵组成,对应于使用MFCC函数为每个语音记录提取的特征。
现在是时候使用卷积神经网络来执行学习过程了。我们再看一下:

这种类型的架构还可以用于许多其他应用,包括图像识别和多种分类。在本例中,让我们应用它来实现我们的目标:语音识别。
model = Sequential()
#Convolution layers
model.add(Conv2D(8, (3, 3), activation=’relu’, input_shape=(size, 13,1)))
model.add(Conv2D(8, (3, 3), activation=’relu’))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))
#Flatteningmodel.add(Flatten(input_shape=(size, 13,1)))
#1st fully connected Neural Network hidden-layer
model.add(Dense(64))
model.add(Dropout(0.16))
model.add(Activation(‘relu’))
#2nd fully connected Neural Network hidden-layer
model.add(Dense(64))
model.add(Dropout(0.12))
model.add(Activation(‘relu’))
#Output layer
model.add(Dense(10))
model.add(Activation(‘softmax’))
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 46, 11, 8) 80
_________________________________________________________________
conv2d_2 (Conv2D) (None, 44, 9, 8) 584
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 22, 4, 8) 0
_________________________________________________________________
dropout_1 (Dropout) (None, 22, 4, 8) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 704) 0
_________________________________________________________________
dense_1 (Dense) (None, 64) 45120
_________________________________________________________________
dropout_2 (Dropout) (None, 64) 0
_________________________________________________________________
activation_1 (Activation) (None, 64) 0
_________________________________________________________________
dense_2 (Dense) (None, 64) 4160
_________________________________________________________________
dropout_3 (Dropout) (None, 64) 0
_________________________________________________________________
activation_2 (Activation) (None, 64) 0
_________________________________________________________________
dense_3 (Dense) (None, 10) 650
_________________________________________________________________
activation_3 (Activation) (None, 10) 0
=================================================================
Total params: 50,594
Trainable params: 50,594
Non-trainable params: 0
现在让我们使用SGD优化器编译模型:
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss=’binary_crossentropy’,optimizer=sgd,metrics=[‘accuracy’])
我们需要将训练数据和测试数据分开,并使它们具有适当的大小,以便我们的 CNN 网络将其识别为适当的张量:
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.25)x_train = x_train.reshape(-1, size, 13, 1)x_test = x_test.reshape(-1, size, 13, 1)
让我们拟合模型并评估性能:
history = model.fit(
x_train,
y_train,
epochs=18,
batch_size=32,
validation_split=0.2,
shuffle=True
)
model.evaluate(x_test, y_test, verbose=2)
Train on 1200 samples, validate on 300 samples
Epoch 1/18
1200/1200 [==============================] - 1s 469us/step - loss: 0.3319 - accuracy: 0.8967 - val_loss: 0.2683 - val_accuracy: 0.9070
Epoch 2/18
1200/1200 [==============================] - 0s 256us/step - loss: 0.2534 - accuracy: 0.9066 - val_loss: 0.1943 - val_accuracy: 0.9217
...
...
Epoch 18/18 1200/1200 [==============================] - 0s 254us/step - loss: 0.0444 - accuracy: 0.9837 - val_loss: 0.0425 - val_accuracy: 0.9880
Out[24]:
[0.039418088585138324, 0.9860000610351562]
以下是loss函数(损失)和准确性:

结论:一点也不差!
我们必须对 CNN 的各种参数进行一些研究才能得到这样的结果。
让我们通过预测测试数据集中可用的记录消息之一来尝试推理。
#Print the sound to be predicted
sound_index = 10
y_test[sound_index]
array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0], dtype=uint8)
在这种情况下,数字是六。
这是使用我们的模型做出的预测:
pred = model.predict(x_test[sound_index].reshape(-1,size,13,1))
print(“\n\033[1mPredicted digit sound: %.0f”%pred.argmax(),”\033[0m \n “)
print(“Predicted probability array:”)
print(pred)
Predicted digit sound: 6
Predicted probability array:
[[3.8950305e-02 9.8831032e-04 7.7098295e-02 8.1201904e-02 2.2223364e-03
4.8808311e-04 6.2295502e-01 1.0375674e-03 1.6901042e-01 6.0477410e-03]]
神经网络语音识别模型就为大家介绍到这里,欢迎各位同学学习python数据科学相关知识《从0到1Python数据科学之旅》,包含多个实战案例,提供数据集和代码下载。

如果有更高需求朋友,例如研究生,博士生论文,企业建模需求,可商务联系up主,我们快速帮你们解决问题,节省大量时间。

版权声明:文章来自公众号(python风控模型),未经许可,不得抄袭。遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

