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.)
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.
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/
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/')
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.
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)
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.
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