金融风控-神经网络语音识别模型介绍(附代码)
前言
在金融风控领域里,逻辑回归,评分卡,集成树算法是信用风险计算的核心算法。
实际上,金融风控领域覆盖面很广。人脸识别和语音识别也有广泛应用。贷前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 pd
from sklearn.model_selection import train_test_split
import pickle
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from IPython.display import HTML
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt
from scipy.io import wavfile as wav
import scipy
from python_speech_features import mfcc
from python_speech_features import logfbank
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense, Flatten, Activation, Dropout, LSTM
from keras.layers import Conv2D, MaxPooling2D, GlobalMaxPooling2D
from keras.optimizers import SGD
import os
让我们分析一条随机语音消息,例如“ 0_jackson_0.wav ”文件:

N = sig1.shape[0]
L = N / rate
f, 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 var
size = 48
X=[]
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 label
y = [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版权协议,转载请附上原文出处链接及本声明。