[PYTHON] Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren

Was ist Sprachidentifikation?

Mit einem Wort, um die Sprache anhand der Sprachdaten zu identifizieren. Zum Beispiel von den Sprachdaten "Guten Morgen, gutes Wetter" bis "Diese Sprachdaten sind auf Japanisch!" Aus den Sprachdaten "Buenas Tardes" geht hervor, dass diese Sprachdaten auf Spanisch sind!

Der Verwendungszweck besteht darin, die Sprache für jemanden zu identifizieren, der nicht weiß, welche Sprache er spricht. Es scheint, dass bestehende automatische Übersetzer Informationen wie "Englisch" und "Spanisch" im Voraus angeben müssen. Daher gibt es keine Möglichkeit, es für jemanden zu übersetzen, der nicht weiß, welche Sprache er spricht. (Ich denke.)

Also für diejenigen, die nicht wissen, welche Sprache sie sprechen Identifizieren Sie die Sprache mithilfe der Sprachidentifikation → Übersetzen Es wird so verwendet. (Ich denke.)

Gründe für die Verwendung von CNN

Es gibt verschiedene Methoden zur Sprachidentifikation, aber diesmal habe ich versucht, CNN zu verwenden. Der Grund ist, dass ich zufällig einen leicht verständlichen Artikel auf Englisch gefunden habe. (http://yerevann.github.io/2015/10/11/spoken-language-identification-with-deep-convolutional-networks/)

Dieser Artikel scheint beim Sprachidentifizierungswettbewerb des Top-Programmierers im Jahr 2015 auf Platz 10 eingestuft worden zu sein, daher habe ich ihn nach dem Studium ausprobiert.

Datensatz verwendet

Im obigen Artikel bestand das Problem darin, 66.176 10-Sekunden-MP3-Dateien, die im Voraus erstellt wurden, in 176 Sprachen zu klassifizieren.

Aber diesmal bin ich VoxForge (http://www.voxforge.org/) Ich habe Audiodateien im WAV-Format in Englisch, Französisch und Spanisch verwendet, von denen ich sie erhalten habe. Sie können jede von der folgenden URL herunterladen. Ich habe es mit dem Befehl wget wegen der großen Menge an Audiodaten bekommen.

http://www.repository.voxforge1.org/downloads/SpeechCorpus/Trunk/Audio/Main/16kHz_16bit/
http://www.repository.voxforge1.org/downloads/fr/Trunk/Audio/Main/16kHz_16bit/
http://www.repository.voxforge1.org/downloads/es/Trunk/Audio/Main/16kHz_16bit/

Vorverarbeitung

Da CNN verwendet wird, wird die Audiodatei im WAV-Format jeder oben erhaltenen Sprache in ein Bild konvertiert.

Dieses Mal habe ich ein "Melspektogramm" verwendet, bei dem die horizontale Achse die Zeit, die vertikale Achse die Frequenz und der Schatten des Bildes die Intensität anzeigt. Mit einer Bibliothek namens librosa können Sie ganz einfach ein Melspektogramm aus einer WAV-Datei abrufen.

Unten finden Sie den Code zum Konvertieren einer WAV-Datei in ein Mel-Spektrogramm. (Ich denke, der gleiche Code funktioniert für MP3-Dateien)

#Eingang:Pfad der Audiodatei
#Ausgabe:Melspektogrammbild von Audiodaten(192×192)

import librosa as lr

def wav_to_img(path, height=192, width=192):
    signal, sr = lr.load(path, res_type='kaiser_fast')
    if signal.shape[0] < sr: #Wenn die WAV-Datei weniger als 3 Sekunden beträgt
        return False, False
    else:
        signal = signal[:sr*3] #Extrahieren Sie nur die ersten 3 Sekunden
        hl = signal.shape[0]//(width*1.1)
        spec = lr.feature.melspectrogram(signal, n_mels=height, hop_length=int(hl))
        img = lr.amplitude_to_db(spec)**2
        start = (img.shape[1] - width)  // 2 
        return True, img[:, start:start+width] 

Der vorherige Datensatz enthält Daten für einige Sekunden bis einige zehn Sekunden. Dieses Mal habe ich nur die ersten 3 Sekunden aus den Daten von 3 Sekunden oder mehr in den Daten extrahiert und verwendet. Daten unter 3 Sekunden werden nicht verwendet.

Alle Audiodaten in dem durch die folgende Funktion angegebenen Ordner werden in ein Melspektogrammbild konvertiert und gespeichert.

#Konvertiert alle Audiodateien im angegebenen Ordner in Spektrogrammbilder und speichert sie im angegebenen Ordner

import os
import glob
import imageio

def process_audio(in_folder, out_folder):
    os.makedirs(out_folder, exist_ok=True)
    files = glob.glob(in_folder)
    start = len(in_folder)
    files = files[:]
    for file in files:
        bo, img = mp3_to_img(file)
        if bo == True:
            imageio.imwrite(out_folder + '.jpg', img)

Wählen Sie wie unten gezeigt den Ordner für die Audiodaten jeder Sprache im ersten Argument und den Ausgabezielordner im zweiten Argument aus und führen Sie ihn aus. Tun Sie dies für alle Sprachen und konvertieren Sie alle Audiodateien in Melspektogramme.

#Unten finden Sie den Pfad zum Speichern der Audiodatei und den Pfad zur Ausgabe
process_audio('data/voxforge/english/*wav', 'data/voxforge/english_3s_imgp/')

Datenaufteilung

Speichern Sie den Melspectogram-Ordner für jede oben erhaltene Sprache in einer HDF5-Datei. Es ist etwas umständlich, aber speichern Sie das Melspectogram-Bild für jede oben im HDF5-Format gespeicherte Sprache im folgenden Pfad. Zielpfad: 'data / voxforge / 3sImg.h5'

import dask.array.image
import h5py
dask.array.image.imread('data/voxforge/english_3s_img/*.jpg').to_hdf5('data/voxforge/3sImg.h5', english)
dask.array.image.imread('data/voxforge/french_3s_img/*.jpg').to_hdf5('data/voxforge/3sImg.h5', french)
dask.array.image.imread('data/voxforge/spanish_3s_img/*.jpg').to_hdf5('data/voxforge/3sImg.h5', spanish)

Teilen Sie in Trainingsdaten, Validierungsdaten und Testdaten auf.

import h5py
#Bitte bestimmen Sie die Datengröße usw. selbst unter Berücksichtigung des erhaltenen Melspektogrammbildes usw.
data_size = 60000
tr_size = 50000
va_size = 5000
te_size = 5000

x_english = h5py.File('data/voxforge/3sImg.h5')['english']
x_french = h5py.File('data/voxforge/3sImg.h5')['french']
x_spanish =  h5py.File('data/voxforge/3sImg.h5')['spanish']

x = np.vstack((x_english[:20000], x_french[:20000], x_spanish[:20000]))

del x_french
del x_english
del x_spanish

x = da.from_array(x, chunks=1000)

#Vorbereitung auf korrekte Antwortdaten
y = np.zeros(data_size)
#0 Bezeichnungen für Englisch, Französisch und Spanisch,1,2
y[0:20000] = 0
y[20000:40000] = 1
y[40000:60000] = 2

#Daten mischen und teilen
import numpy as np

shfl = np.random.permutation(data_size)
training_size = tr_size
validation_size = va_size
test_size = te_size

#Für jede Abteilung von Trainingsdaten, Auswertung und Testgröße wird ein zufällig vorbereiteter Index shfl zugewiesen.
train_idx = shfl[:training_size] 
validation_idx = shfl[training_size:training_size+validation_size] 
test_idx = shfl[training_size+validation_size:] 

#Erstellen Sie Trainingsdaten, Auswertungen und Testgrößen mit dem zugewiesenen Index
x_train = x[train_idx]
y_train = y[train_idx]
x_vali = x[validation_idx]
y_vali = y[validation_idx]
x_test = x[test_idx]
y_test = y[test_idx]

#Bildnormalisierung
x_train = x_train/255
x_vali = x_vali/255
x_test = x_test/255

#Formtransformation zum Lernen
x_train = x_train.reshape(tr_size, 192, 192, 1)
x_vali = x_vali.reshape(va_size, 192, 192, 1)
x_test = x_test.reshape(te_size, 192, 192, 1)

#Ein heißer Vektor von Lehrerdaten
y_train = y_train.astype(np.int)
y_vali = y_vali.astype(np.int)
y_test = y_test.astype(np.int)

Mit der obigen Verarbeitung kann es in Trainingsdaten, Validierungsdaten und Testdaten unterteilt werden.

Struktur des verwendeten CNN

Die verwendete Netzwerkstruktur ist wie folgt. Sie können es hier frei ändern. Das Framework verwendete Keras.

import tensorflow as tf
from tensorflow.python import keras
from tensorflow.python.keras import backend as K
from tensorflow.python.keras.models import Model, Sequential, load_model
from tensorflow.python.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout, Input, BatchNormalization,  Activation
from tensorflow.python.keras.preprocessing.image import load_img, img_to_array, array_to_img, ImageDataGenerator

i = Input(shape=(192,192,1))
m = Conv2D(16, (7, 7), activation='relu', padding='same', strides=1)(i)
m = MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(m)
m = BatchNormalization()(m)

m = Conv2D(32, (5, 5), activation='relu', padding='same', strides=1)(m)
m = MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(m)
m = BatchNormalization()(m)

m = Conv2D(64, (3, 3), activation='relu', padding='same', strides=1)(m)
m = MaxPooling2D()(m)
m = BatchNormalization()(m)

m = Conv2D(128, (3, 3), activation='relu', padding='same', strides=1)(m)
m = MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(m)
m = BatchNormalization()(m)

m = Conv2D(128, (3, 3), activation='relu', padding='same', strides=1)(m)
m = MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(m)
m = BatchNormalization()(m)

m = Conv2D(256, (3, 3), activation='relu', padding='same', strides=1)(m)
m = MaxPooling2D(pool_size=(3, 3), strides=2, padding='same')(m)
m = BatchNormalization()(m)

m = Flatten()(m)
m = Activation('relu')(m)
m = BatchNormalization()(m)
m = Dropout(0.5)(m)

m = Dense(512, activation='relu')(m)

m = BatchNormalization()(m)
m = Dropout(0.5)(m)

o = Dense(3, activation='softmax')(m)

model = Model(inputs=i, outputs=o)
model.summary()

Ich habe unten gelernt. Da die Tendenz bestand, schnell zu überlernen, war die Anzahl der Trainingsdaten gering oder das Modell schlecht. Etwa 5 Epochen reichen aus. Es tut mir leid, dass ich überhaupt nicht darüber nachdenken konnte.

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train, y_train, batch_size=32, epochs=5, verbose=1, validation_data=(x_vali, y_vali), shuffle = True)

Ergebnis

Dies ist das Ergebnis der Testdaten.

model.evaluate(x_test, y_test)

[0.2763474455833435, 0.8972]

Es fühlt sich so an, als ob Sie es bei etwa 90% richtig vorhersagen können.

Tatsächlich enthalten die Trainingsdaten und die Testdaten jedoch viele der gleichen menschlichen Sprachdaten, sodass ich die Genauigkeit für hoch halte.

Wenn Sie die Genauigkeit genauer überprüfen möchten 'data/voxforge/english_3s_imgp/' Daten, die vor dem Mischen nicht in den Daten verwendet wurden, in diesem Beispiel

x_english = h5py.File('data/voxforge/3sImg.h5')['english']
x_french = h5py.File('data/voxforge/3sImg.h5')['french']
x_spanish =  h5py.File('data/voxforge/3sImg.h5')['spanish']

x = np.vstack((x_english[20000:], x_french[20000:], x_spanish[20000:]))

Ich denke, dass Sie die Genauigkeit genauer überprüfen können, indem Sie die Daten von verwenden. Übrigens war die richtige Antwortrate für jede Sprache zu diesem Zeitpunkt wie folgt.

Englisch: 0.8414201183431953 Französisch: 0,7460106382978723 Spanisch: 0,8948035487959443

Ich kann Französisch nicht sehr gut identifizieren.

Zusammenfassung

Dieses Mal habe ich nach dem Studium die Spracherkennung mit CNN versucht. Es tut mir leid, dass es Orte geben kann, an denen die Erklärung aufgrund eines Ansturms auf dem Weg unzureichend ist. Ich habe die Grundidee am Anfang vorgestellt, aber Sie können sie unter der folgenden URL überprüfen. Wenn Sie also gut Englisch können, möchten Sie vielleicht dort nachsehen. (http://yerevann.github.io/2015/10/11/spoken-language-identification-with-deep-convolutional-networks/)

Vielen Dank für das Lesen bis zum Ende.

Recommended Posts

Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, das Wissensdiagramm mit OpenKE zu ergänzen
Ich habe versucht, das Bild mithilfe von maschinellem Lernen zu komprimieren
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die Anzeigenoptimierung mithilfe des Banditenalgorithmus zu simulieren
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
[TF] Ich habe versucht, das Lernergebnis mit Tensorboard zu visualisieren
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren (Re-Challenge)
Ich habe versucht, das Zugriffsprotokoll mit Node.js auf dem Server auszugeben
Ich habe versucht, Azure Speech to Text zu verwenden.
Ich habe versucht, den Befehl umask zusammenzufassen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich versuchte das Weckwort zu erkennen
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Ich habe versucht, die grafische Modellierung zusammenzufassen.
Ich habe versucht, das Umfangsverhältnis π probabilistisch abzuschätzen
Ich habe versucht, die COTOHA-API zu berühren
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
Ich habe versucht, das Gesichtsbild mit sparse_image_warp von TensorFlow Addons zu transformieren
Ich habe versucht, die Trefferergebnisse von Hachinai mithilfe der Bildverarbeitung zu erhalten
Ich habe versucht, die Ähnlichkeit der Frageabsicht mit Doc2Vec von gensim abzuschätzen
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 3: Reguläre Ausdrücke 25-29]
Ich habe versucht, mehrere Servomotoren MG996R mit dem Servotreiber PCA9685 zu steuern.
Ich habe versucht, verschiedene Sätze mit der automatischen Zusammenfassungs-API "summpy" zusammenzufassen.
Ich habe versucht, die Phase der Geschichte mit COTOHA zu extrahieren und zu veranschaulichen
Ich habe die übliche Geschichte ausprobiert, Deep Learning zu verwenden, um den Nikkei-Durchschnitt vorherzusagen
Mit COTOHA habe ich versucht, den emotionalen Verlauf des Laufens von Meros zu verfolgen.
Ich habe das VGG16-Modell mit Keras implementiert und versucht, CIFAR10 zu identifizieren
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Ich habe Web Scraping versucht, um die Texte zu analysieren.
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, beim Trocknen der Wäsche zu optimieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, WAV-Dateien mit Pydub zu synthetisieren.
Ich habe versucht, PyCaret mit der schnellsten Geschwindigkeit zu verwenden
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Qiita Job Ich habe versucht, den Job zu analysieren
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
LeetCode Ich habe versucht, die einfachen zusammenzufassen
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
Ich habe versucht, das Problem des Handlungsreisenden umzusetzen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Summpy zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, ESPCN zu verwenden