Создайте модель распознавания речи с помощью Keras.

Распознавание речи широко используется в нашей жизни - от Siri до устройств умного дома. Этот проект распознавания речи предназначен для использования набора данных задачи распознавания речи Kaggle для создания модели Keras поверх Tensorflow и прогнозирования голосовых файлов.

Ссылка на набор данных задачи распознавания речи Kaggle приведена ниже:



Прием и обработка данных:

Подобно распознаванию изображений, наиболее важной частью распознавания речи является преобразование аудиофайлов в массивы 2X2.

Частота дискретизации и необработанная волна аудиофайлов:

Частота дискретизации аудиофайла представляет собой количество отсчетов звука, передаваемых в секунду, и измеряется в Гц. На следующем изображении показано соотношение между необработанной звуковой волной и частотой дискретизации «постельного» аудиофайла:

train_audio_path = 'C:\\Users\\...\\train\\audio'
filename = '\\bed\\00f0204f_nohash_0.wav'
sample_rate, samples = wavfile.read(str(train_audio_path) + filename)
ipd.Audio(samples, rate=sample_rate)
print(sample_rate)
print(samples)

# visualize this audio wave:
fig = plt.figure(figsize=(14, 8))
plt.plot(samples)
plt.title('Raw wave of ' + filename)
plt.ylabel('Wave')
plt.show()

Далее я представлю два важных атрибута аудиофайлов:

Спектрограмма:

Спектрограмма - это спектрально-временное представление звука. Горизонтальное направление спектрограммы представляет время, вертикальное направление представляет частоту. (1) Спектрограммы могут использоваться как способ визуализации изменения частотного содержания нестационарного сигнала во времени.

Формула спектрограммы (2) приведена ниже:

Я использовал код со следующих сайтов, чтобы вычислить и визуализировать log_spectrogram:

Https://www.tensorflow.org/api_guides/python/contrib.signal https://github.com/Tony607/tf_audio_signal/blob/master/tf_audio_signal.ipynb

def log_spectrogram(file, label):
    sample_rate, samples = wavfile.read(str(train_audio_path) + '\\'+label+'\\' + file)
    signals = tf.cast(tf.reshape(samples, [1,-1 ]),tf.float32) 
    spectrogram = signal.stft(signals, frame_length=1024, frame_step= 512)
    magnitude_spectrograms = tf.abs(spectrogram)
    log_offset = 1e-6
    #When compressing with a logarithm, it's a good idea to use a stabilizing offset 
    #to avoid high dynamic ranges caused by the singularity at zero.
    log_magnitude_spectrograms = tf.log(magnitude_spectrograms + log_offset)
    return log_magnitude_spectrograms

Затем постройте log_spectrogram выборочных данных: кровать.

log_spe_bed = log_spectrogram(train.file[0],train.label[0]).numpy()
array_bed = log_spe_bed.astype(np.float)[0]
fig = plt.figure(figsize=(14,8))
#plt.ylabel("Freqs in Hz")
plt.xlabel("Log_Spectrogram")
plt.imshow(np.swapaxes(array_bed,0,1).T)

Частотный кепстральный коэффициент Mel (MFCC):

Частотный кепстральный коэффициент Mel (MFCC) - это функция, которая широко используется в автоматическом распознавании речи и говорящего. Шкала Mel связывает воспринимаемую частоту или высоту звука чистого тона с его фактической измеренной частотой. Люди гораздо лучше распознают небольшие изменения высоты звука на низких частотах, чем на высоких. Включение этой шкалы делает наши характеристики более близкими к тому, что слышат люди. (3)

def mfcc(file=train['file'].tolist(), label=train['label'].tolist()):
    sample_rate, samples = wavfile.read(str(train_audio_path) + '\\'+label+'\\' + file)
    if len(samples) < 16000:
        samples = np.pad(samples, (0,16000-len(samples)), 'linear_ramp')
    else:
        samples = samples[:16000]
    signals = tf.cast(tf.reshape(samples, [1,-1 ]),tf.float32) 
    spectrogram = signal.stft(signals, frame_length=1024, frame_step= 512)
    magnitude_spectrograms = tf.abs(spectrogram)
    num_spectrogram_bins = magnitude_spectrograms.shape[-1].value
    lower_edge_hertz, upper_edge_hertz, num_mel_bins = 80.0, 7600.0, 64
    linear_to_mel_weight_matrix = tf.contrib.signal.linear_to_mel_weight_matrix(num_mel_bins, num_spectrogram_bins, sample_rate, lower_edge_hertz,upper_edge_hertz)
    mel_spectrograms = tf.tensordot(magnitude_spectrograms, linear_to_mel_weight_matrix, 1)
# Note: Shape inference for <a href="../../api_docs/python/tf/tensordot"><code>tf.tensordot</code></a> does not currently handle this case.
mel_spectrograms.set_shape(magnitude_spectrograms.shape[:-1].concatenate(linear_to_mel_weight_matrix.shape[-1:]))
    log_offset = 1e-6
    log_mel_spectrograms = tf.log(mel_spectrograms + log_offset)
    num_mfccs = 13
# Keep the first `num_mfccs` MFCCs.
    mfccs = tf.contrib.signal.mfccs_from_log_mel_spectrograms(log_mel_spectrograms)[..., :num_mfccs]
    return mfccs.numpy()[0]

Используя функцию «mfcc», которая определена выше, легко вычислить mfcc аудиофайла «кровать» и визуализировать его MFCC.

mfcc_bed = mfcc(train.file[0],train.label[0])
fig = plt.figure(figsize=(14,8))
plt.ylabel("MFCC (log) coefficient")
plt.imshow(np.swapaxes(mfcc_bed,0,1))

Моделирование данных:

Я построил последовательную модель нейронной сети, которая является самым простым методом построения модели в Keras - она ​​сообщает keras о том, что все слои должны располагаться последовательно. Затем я добавил четыре плотных слоя, которые являются полностью связанными слоями модели.

После построения модели я использовал Adaptive Moment Estimation в качестве оптимизатора, категориальную кроссэнтропию в качестве потерь и точность в качестве показателей для компиляции модели.

# Dense(64) is a fully-connected layer with 64 hidden units.
# in the first layer, you must specify the expected input data shape:
# here, 20-dimensional vectors.
with tf.Session() as sess0:
    assert not tf.executing_eagerly()
    model = Sequential()

    model.add(layers.Dense(32, input_shape=X_train_array.shape[1:], activation='tanh'))
    model.add(Dense(64, activation='tanh'))
    model.add(Dense(128, activation='tanh'))
    
    model.add(Flatten())
    #model.add(Dense(256, activation='relu'))

    model.add(Dense(30))
    model.add(Activation('sigmoid'))
    
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    #Adam, an algorithm for first-order gradient-based optimization of stochastic objective functions, based on adaptive estimates of lower-order moments.
    model.summary()
    
  #  history = model.fit(x=X_train_array, y=y_train_array, epochs=5, verbose=1, validation_split = 0.33, shuffle=True, class_weight=get_class_weights(pd.Series((list(set(labels))),dtype='category').cat.codes.values),batch_size=batch_size) 
    history = model.fit(x=X_train_array, y=y_train_array, epochs=25, verbose=1, validation_split = 0.1, shuffle=True, class_weight=get_class_weights(pd.Series(Y_train,dtype='category').cat.codes.values),batch_size=128) 
    
    model_evaluation = model.evaluate(x=X_test_array, y=y_test_array, batch_size=None, verbose=1)

    prediction = model.predict(X_test_array, batch_size = 128, verbose = 1)
    
    april_tst = model.predict(mfcc_april_test, batch_size = 128, verbose = 1)

    sess0.close()

Я выбрал 25 в качестве количества эпох, т.е. сколько раз модель будет циклически перебирать данные. После прохождения около 20 эпох точность проверки модели повышается до 61% - 62%.

Как видно из двух приведенных выше изображений, точность теста и поезда недостаточно близки друг к другу, что означает, что эту модель можно улучшить, преодолев проблемы чрезмерной подгонки.

Заключение:

  1. Аудиофайл обычно преобразуется в массив, который будет входом для модели Keras.
  2. Спектрограмма и MFCC - это две функции аудиофайлов, которые нужно преобразовать в массивы.
  3. Мы можем изменять слои модели Keras, чтобы повысить точность модели.
  4. Помните о проблемах чрезмерной подгонки, сравнивая точность обучения и тестирования.
  5. Последовательную модель легче модифицировать по сравнению с моделью Keras API.

Заключение:

  1. Чтобы точно предсказать голоса с шумами в «тестовом» аудиофайле в наборе данных Kaggle, мне нужно обработать текущие обучающие данные, добавив фоновый шум.
  2. Поскольку в «тестовом» аудиофайле Kaggle есть неизвестные голоса, мне также нужно добавить «unknown» в качестве одного из моих ярлыков.
  3. Я также могу нормализовать MFC обучающих данных, чтобы увидеть, смогу ли я улучшить точность модели.
  4. Я также могу использовать комбинацию CNN и RNN, чтобы посмотреть, могу ли я улучшить точность модели или нет.

Ссылка:

  1. Пол Боерсма и Дэвид Вининк , Введение 3.1. Просмотр спектрограммы , Институт фонетических наук Амстердамского университета
  2. Википедия: https://en.wikipedia.org/wiki/Short-time_Fourier_transform
  3. Криптография: https://practicalcryptography.com/miscellaneous/machine-learning/guide-mel-frequency-cepstral-coefficients-mfccs/
  4. Крис Динан, Задача распознавания речи Kaggle Tensorflow

Благодарности:

  1. Https://www.kaggle.com/davids1992/speech-presentation-and-data-exploration
  2. Https://www.kaggle.com/ollmer/labels-spectrograms-exploration
  3. Https://github.com/Tony607/tf_audio_signal/blob/master/tf_audio_signal.ipynb
  4. Https://towardsdatascience.com/kaggle-tensorflow-speech-recognition-challenge-b46a3bca2501
  5. Https://www.kaggle.com/kcs93023/keras-sequential-conv1d-model-classification