Kaldi Spracherkennungstechnologie (7) ----- Training GMM

Kaldi Spracherkennungstechnologie (7) ----- GMM

Ausbildung GMM

Im vorherigen Artikel haben wir über die Vorteile von GMM im Vergleich zu DTW gesprochen, also wie erhalten wir Schulungs-GMM?

Der Schulungsprozess von GMM ist wie folgt:

Bildbeschreibung hier einfügen

Der gesamte Prozess ist in 10 Links unterteilt, von denen sich 5 auf das Alignment beziehen.Zum besseren Verständnis werden nur 2 dieser 10 Links (train_mono-Einzelfaktor-Trainingsmodell und align_si-Alignment) besprochen, und die anderen werden grundsätzlich ausgeführt Optimierung, jeder, der in diesem Bereich involviert ist, kann Baidu in Zukunft selbst durchführen. Der allgemeine Prozess besteht darin, zuerst ein Gaußsches Modell zu trainieren, das Gaußsche Modell zu verwenden, um die Trainingsdaten auszurichten, und dann die ausgerichteten Daten zu verwenden, um ein Gaußsches Modell zu trainieren. Trainieren Sie zum Beispiel (das Bild rechts oben) zuerst ein Monophonmodell, verwenden Sie dann das Monophonmodell, um die Trainingsdaten auszurichten, und trainieren Sie dann basierend auf diesen ausgerichteten Daten ein Triphonmodell und verwenden Sie dann das Triphonmodell align Richten Sie die Trainingsdaten aus, verwenden Sie dann lda, mllt und andere Algorithmen, um das GMM-Modell neu zu bewerten, dann richten Sie die Trainingsdaten aus, führen Sie dann sprecherunabhängige und verwandte Operationen am Modell durch und richten Sie schließlich die Trainingsdaten erneut aus. Der gesamte Prozess des GMM-Trainingsmodells ist wie folgt. Im Allgemeinen gilt: Je besser das Modell trainiert wird, desto genauer wird die Ausrichtung, was die Genauigkeit der Spracherkennung verbessert.

Training GMM – Mono-Trainingsprozess

Schauen wir uns an, wie das monophone Modell trainiert wird: Um ein Modell zu trainieren, muss es zunächst ein Startmodell geben, und dann iteratives Training auf diesem Startmodell. Kaldi ruft also gmm-init-mono auf, um das Modell zu initialisieren, das die Features in den Trainingsdaten verwendet, um das Modell zu initialisieren. Nachdem das Modell initialisiert wurde, ist es an der Zeit, ein Diagramm zu erstellen. Es gibt mehrere Eingaben für dieses Diagramm, darunter das initialisierte Modell, L.fst in der lang-Datei und den Text im Wörterbuch und die Trainingsdaten. Das generierte Ergebnis ist a Satz bis auf Phonemebene Komprimiertes Paket (gz) der fst.

Bildbeschreibung hier einfügen

Nachdem wir die ersten beiden Schritte abgeschlossen haben, erfordert die Verwendung der extrahierten Merkmale, die der von uns erstellten FST-Karte entsprechen, eine Ausrichtung. Der dritte Schritt verwendet einheitliches Alignment (gleiches Alignment in der Abbildung).Wie bereits erwähnt, zerlegt FST den Satz der Labeldatei in Wörter, Wörter, Phoneme und dann den Zustand in HMM.

Zum besseren Verständnis verfeinern wir nur die Phoneme im Bild, teilen das Wort (China) in Zeichen (Zhongheguo) und dann in Phoneme (zh, ong1, g, uo2) auf. Jedes Wort hat 2 Phoneme , a insgesamt 4 Phoneme, die gelben vertikalen Balken oben stellen ein Rahmenmerkmal dar (MFCC-Merkmal), die einheitliche Ausrichtung hier ist davon auszugehen, dass es 4 Phoneme und 100 Rahmenmerkmale gibt, jedes Phonem wird gleichmäßig in 25 Rahmenmerkmale aufgeteilt, jeweils den Mittelwert finden und Varianz dieser 25 Rahmenmerkmale, und Sie können das entsprechende Gaußsche Modell erhalten.

Der untere Teil des Bildes ist unser Triphone-Modell (unter Berücksichtigung der Co-Aussprache), das Triphone-Modell hat eine große Datenmenge, daher wird Entscheidungsbaum-Clustering in Kaldi verwendet, um einige Phoneme mit ähnlicher Aussprache in eine Kategorie zu gruppieren, dann konzentrieren Sie sich auf das Training . Nach einheitlichem Alignment werden wir das Modell neu bewerten. Das Initialisierungsmodell wird zufällig aus einem Teil der Trainingsdaten ausgewählt. Jetzt haben wir die Eigenschaften aller Audiodaten gezählt und durch einheitliches Alignment den entsprechenden Zustand und Sprung jedes Frame-Features Wendewahrscheinlichkeit. Basierend auf diesen Informationen evaluieren wir das Modell neu.Der nächste Schritt besteht darin, die Daten mit dem neu evaluierten Modell abzugleichen (Schritt 5). Zu diesem Zeitpunkt verwenden wir, anstatt eine einheitliche Ausrichtung zu verwenden, die Statistiken nach dem neu evaluierten Kombiniert mit dem vorherigen ersten, um neue Ausrichtungsinformationen zu erzeugen, kann dieser Prozess einfach als ein Modell verstanden werden, das den Trainingssatz dekodiert und die jedem Datenrahmen entsprechenden Merkmale in das GMM einfügt, das jedem Phonem oder jedem Zustand entspricht, um die zu berechnen Wahrscheinlichkeit, das Phonem mit der höchsten Wahrscheinlichkeit ist das Phonem, das diesem Frame entspricht.Wie wir bereits gesagt haben, entspricht jedes Phonem 25 Frames.Nach diesem Schritt ändert sich das entsprechende Phonem (unter der Annahme,dass das erste Phonem 20 Frames entspricht). Basierend auf diesen Ausrichtungsinformationen können wir das Verhältnis der Anzahl der Sprünge jedes Phonems zur Gesamtzahl der Sprünge statistisch berechnen, so dass wir die Sprungwahrscheinlichkeit jedes Zustands im HMM-Netzwerk neu schätzen und diesen Zustand dann aktualisieren können Übergangswahrscheinlichkeiten und jeder Nach den Ausrichtungsinformationen eines Frames können wir unser GMM-Modell neu bewerten (Sprung von Schritt 6 zu Schritt 4). Auf diese Weise wird das Modell wiederholt neu bewertet, neue Ausrichtungsinformationen werden generiert, der Übergang Wahrscheinlichkeit berechnet, und dann wird das Modell neu bewertet. Die spezifische Anzahl solcher Wiederholungen wird von uns festgelegt, und der Standardwert ist 40 Wiederholungen.

train_mono.sh wird zum Trainieren von GMM verwendet

Schauen wir uns an, wie das monophone Modell in Kaldi trainiert wird, indem das Skript train_mono.sh im Step-Ordner aufgerufen wird. Insbesondere wenn Sie Multi-Thread-Parameter verwenden, darf die Anzahl von nj die Anzahl der Sprecher (spekerid) nicht überschreiten, die die Anzahl der Threads durch die Anzahl der Sprecher dividiert.

train_mono.sh Verwendung:

./steps/train_mono.sh 
Usage: steps/train_mono.sh [options] <data-dir> <lang-dir> <exp-dir>
 e.g.: steps/train_mono.sh data/train.1k data/lang exp/mono
main options (for others, see top of script file)
  --config <config-file>                           # config containing options
  --nj <nj>                                        # number of parallel jobs
  --cmd (utils/run.pl|utils/queue.pl <queue opts>) # how to run jobs.

Referenz: Erste Schritte mit Kaldi im Detail train_mono.sh offizielles Dokument

Bereiten Sie zuerst die Kaldi-Umgebung vor

. ~/kaldi/utils/path.sh
mkdir H_learn
cd ~/kaldi/data

Führen Sie dann das Skript aus

./steps/train_mono.sh --nj 2 --cmd "run.pl" H/kaldi_file_test L/lang H/mono

Ausführliche Erklärung der Parameter:
Der erste Parameter: –nj Mehrere Threads werden parallel trainiert ( Hinweis: Wenn die Merkmale jedes Sprechers extrahiert werden, kann die Anzahl von nj die Anzahl der Sprecher nicht überschreiten ) Der zweite Parameter: run.pl führt den dritten aus
lokal
Parameter: Feature-Ordner (einschließlich cmvn- und Original-mfcc-Features, siehe Spalte Blogbeitrag fünf)
Vierter Parameter: lang-Ordner (lang-Ordner im L-Ordner)
fünfter Parameter: Ausgabe-GMM-Trainingsdatenordner (monophones Modell).

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Trainieren Sie GMM – Generieren Sie Dateien

Nachdem wir train_mono.sh zum Trainieren des Monophonmodells verwendet haben, haben wir diese Dateien generiert. Das erste und wichtigste ist das Modell (mdl, wobei 0.mdl das initialisierte Modell darstellt; 40.mdl das Ergebnis von 40 Iterationen darstellt; final.mdl stellt das endgültige Modell dar), gefolgt von der Datei am Ende von occs, die einfach als globale Statistik verstanden werden kann, die die Informationen jedes Phonems oder jedes Phonems zählt, das mehreren Zuständen entspricht. ali..gz sind die Ausrichtungsinformationen, und die Ausrichtungsinformationen werden bei jeder Iteration des Modells aktualisiert. fst..gz sind Grid-Informationen, die einige FST-Informationen sind, die wir bereits erwähnt haben. Baum ist ein Entscheidungsbaum, der einige Phoneme mit ähnlicher Aussprache in einer Kategorie zusammenfasst, was für die Berechnung bequem ist. Das Protokoll stellt das während des Trainingsvorgangs erstellte Protokoll dar. Wenn während des Trainingsvorgangs ein Fehler auftritt, können Sie darin grundsätzlich die entsprechende Fehlermeldung finden.
Bildbeschreibung hier einfügen
*.mdl: Modell 0.mdl stellt das initialisierte Modell dar, 40.mdl stellt das Ergebnis von 40 Iterationen dar, final.mdl stellt das Endergebnis dar.
*.occs: die Anzahl der Vorkommen jedes PDFs
ali.*.gz: Ausrichtungsinformationen
fst.*.gz: Rasterinformationen
Baum: Entscheidungsbaum
Protokoll: Trainingsprozessprotokoll

Trainings-GMM – endgültige Modellansicht

Konvertieren Sie final.mdldie Daten in Text und geben Sie sie in final_mdl.txtText aus (--binary=false bedeutet, keine binären Daten zu verwenden)

gmm-copy --binary=false final.mdl final_mdl.txt

vim final_mdl.txt Öffnen Sie die Datei wie folgt:

Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Dieser Teil der Informationen befindet sich in der Topo-Datei, die generiert wurde, als wir G.fst vor den ersten 23 Zeilen generierten. Wir können die entsprechenden HMM-Zustände zeichnen, das heißt, die Zustände 6–909 teilen sich einen HMM3-Zustand und 1–5 (stille Phoneme) teilen sich einen HMM5-Zustand.Die 24. Zeile 2727 repräsentiert die Anzahl unserer Entscheidungsbaum-Cluster. In den Entscheidungsbauminformationen: Die erste Spalte ist der Phonemindex (Telefon-ID), die zweite Spalte ist der HMM-Zustand und die dritte Spalte ist der PDF-Index (Entscheidungsbaumklasse).
Bildbeschreibung hier einfügen
Bildbeschreibung hier einfügen

Wir können sehen, dass unsere Phoneme insgesamt 909 haben, warum können sie also in 2737 Kategorien gruppiert werden? Wie in der Abbildung zu sehen ist, gehören von Zeile 25 bis Zeile 49 in der zweiten Spalte von 25 Zeilen alle zu stummen Phonemen (warum? Die Seriennummern sind alle 0-4, 5 Zustände, nur stumme Phoneme haben 5 Zustände). . Schließlich können wir die Formel für die Anzahl der Cluster erhalten als:

Die Anzahl der Entscheidungsbaumklassen = Anzahl der stummen Phoneme * 5 + nicht stumme Phoneme * 3

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Da der Entscheidungsbaum viele andere Informationen enthält, können Sie die Informationen des lokalen Entscheidungsbaums öffnen, um sie selbst anzuzeigen. Die Informationen in <LogProbs> sind die Übergangswahrscheinlichkeit jeder Klasse, und die Zahl in <Dimension> ist das Dreifache der Eingabe Merkmal (MFCC) Dies liegt daran, dass die Eingabemerkmale einen Unterschied erster Ordnung und einen Unterschied zweiter Ordnung gemacht haben, plus das ursprüngliche Merkmal die Nummer 39 ist, <numpdfs> die Nummer unserer Entscheidungsbaumklassen ist und jeder Klasse entsprechen kann ein Gaußsches Mischungsmodell (GMM). Das Folgende ist die Beschreibung der 656 GMMs in der Abbildung. Die Beschreibung eines Gaußschen Modells benötigt nur den Mittelwert und die Varianz (wissen Sie es). Wenn es sich um ein gemischtes Gaußsches Modell handelt, sind mehrere Gaußsche Kombinationen erforderlich. Jede Die Gewichtung der Gaußschen gemischtes Gaußsches. Wenn beispielsweise das Gewicht <weights> in der obigen Abbildung 2 Gewichte enthält, bedeutet dies, dass das gemischte Gaußsche, das die Wahrscheinlichkeit dieses Phonems beschreibt, aus 2 einzelnen Gaußschen zusammengesetzt ist. Die jeweiligen Gewichte sind XXX, XXX, the Durchschnitt hat 39 Spalten, eine Gaußsche entspricht einem 39-dimensionalen Durchschnitt und zwei Gaußsche Zahlen haben zwei Durchschnitte. Ebenso ist die Varianz gleich. Neben Gewichten gibt es auch einen Hyperparameter <gconsts>, der ebenfalls einem Gauß entspricht. Nicht zu viel in die Tiefe Einführung hier.

Trainings-GMM – final.occs-Ansicht

Schauen wir uns als nächstes die final.occs-Datei an, die einfach als globale Statistik verstanden werden kann, die Informationen zu jedem Phonem zählt oder wie vielen Zuständen jedes Phonem entspricht. Das heißt, eine Beschreibung jedes HMM-Netzwerks. Wir haben bereits erwähnt, dass jedes Phonem in BEIS (entsprechend mehreren Zuständen) unterteilt werden kann, wir wissen, dass das stumme Phonem des HMM 5 Zustände hat (BEIS + 5 Zustände von sich selbst) und das nicht stummgeschaltete Phonem BEI 3 Zustände hat. occs besteht darin, jedes Phonem aufzuteilen und Statistiken separat zu erstellen. Übergangszustand ist eine Beschreibung jedes Zustands, wobei die Zahl in der Zählung von pdf angibt, wie oft diese Kante erscheint.

Statistik jedes Phonems oder Informationen mehrerer Zustände, die jedem Phonem entsprechen

show-transitions phones.txt final.mdl final.occs > final_occs.txt

vim final_occs.txtÖffnen Sie die Datei wie folgt:

Bildbeschreibung hier einfügen

Schulungs-GMM – Ausrichtungsinformationen anzeigen
# 1 解压  
gzip -d ali.1.gz

Die Merkmale werden auf Frame-Ebene erwähnt, und das Training wird auch auf Frame-Ebene trainiert. Was ist das Ergebnis des Trainings? Sie können den Befehl ali-to-phones verwenden, um zu überprüfen, welche Frames welchem ​​Phonem entsprechen. Jede Zahl in der Abbildung stellt eine Phonem-ID dar. Für eine einfachere Betrachtung müssen wir die Phonem-ID in das entsprechende Phonem umwandeln.

# 2 使用ali-to-phones进行查看
ali-to-phones --per-frame=true final.mdl ark:ali.1 ark,t:ali.1.txt

Welches Phonem entspricht jeder Telefon-ID? Verwenden Sie das Skript int2sym.pl, um die Phonem-ID in das entsprechende Phonem umzuwandeln, und wir können die Zeitinformationen für jedes Phonem sehen.

# 3 将音素id转换为对应的音素
~/kaldi/data/utils/int2sym.pl -f 2- phones.txt <ali.1.txt >ali.1.phones

Wie lange dauert jedes Phonem? Beispielsweise können Sie diesen Satz „neunundzwanzig Grad einstellen" mit der Audioanzeigesoftware überprüfen und verifizieren. Da wir ein einzelnes Phonem-Trainingsmodell verwenden, ist die Ausrichtung möglicherweise nicht ganz genau, sodass das Modell trainiert werden muss wiederholt.

# 4 各音素的对齐时间信息
ali-to-phones --ctm-output=true final.mdl ark:ali.1 -| ~/kaldi/data/utils//int2sym.pl -f 5 phones.txt >ali.1.time

Bildbeschreibung hier einfügen

Training GMM – fsts.*.gz-Ansicht

Was hier gespeichert wird, sind die ersten Netzwerkstrukturinformationen, die jeder Anweisung entsprechen, daher werde ich hier nicht ins Detail gehen.

# 1、解压  
gzip -d fsts.1.gz
# 2、查看
fstcopy ark:fsts.1 ark,t:fsts.1.txt
vim fsts.1.txt

Bildbeschreibung hier einfügen

Trainings-GMM – Entscheidungsbaumansicht
  • Textvorschau
tree-info tree

Bildbeschreibung hier einfügen

num-pdfs 683 bedeutet: die Anzahl der Entscheidungsbaum-Klassen, die insgesamt in 683 Klassen unterteilt sind Die
Position des Entscheidungsbaums ist 0, wenn es sich um ein 3-Phonem handelt, ist hier 1 (zentral bedeutet das mittlere Phonem, das vordere ist 0, und die Rückseite ist 2)

  • visueller Entscheidungsbaum
draw-tree phones.txt tree | dot -Gsize=8,10.5 -Tps | ps2pdf - tree.pdf

Bildbeschreibung hier einfügen

Der Entscheidungsbaum kann mit dem Draw-Tree-Befehl visuell gezeichnet werden. Da der Entscheidungsbaum sehr groß ist, wird hier nur ein Teil davon abgefangen und nicht vollständig angezeigt. Sie können ihn zur Ansicht im PDF-Format öffnen. Wie aus der obigen Abbildung ersichtlich ist, ist das stille SIL-Phonem ein untergeordneter Knoten, der 5 Knoten (0–4 Knoten) entspricht, und das Phonem ua5 entspricht 3 Knoten (5–7 Knoten), was dem entspricht, was erwähnt wurde oben (5 Zustände für stummgeschaltete Phoneme, 3 Zustände für nicht stummgeschaltete Phoneme)

align_si.sh für die Ausrichtung

zum Ausrichten

Nachdem das monophone Modell trainiert wurde, können wir das monophone Modell verwenden, um die Trainingsdaten auszurichten. Der Ausrichtungsbefehl lautet align_si.sh, dies ist der zweite Schritt des GMM-Trainingsmodells.

cd ~/kaldi/data
./steps/align_si.sh --nj 2 --cmd "run.pl" H/kaldi_file_test L/lang  H/mono H/mono_ali 

Ausführliche Erklärung der Parameter:
Der erste Parameter: –nj Mehrere Threads werden parallel trainiert ( Hinweis: Wenn die Merkmale jedes Sprechers extrahiert werden, kann die Anzahl von nj die Anzahl der Sprecher nicht überschreiten ) Der zweite Parameter: run.pl führt den dritten aus
lokal
Parameter: Feature-Ordner (einschließlich cmvn- und Original-mfcc-Features)
Vierter Parameter: Lang-Ordner (Lang-Ordner im L-Ordner)
Fünfter Parameter: Monophon-Trainingsmodell-Ordner
Sechster Parameter: After-Alignment-Datenordner für

Bildbeschreibung hier einfügen

Training GMM – sehen Sie sich die von mono_ali.sh generierten Inhalte an

Bildbeschreibung hier einfügen

# 1、解压  
gzip -d ali.1.gz
# 2、生成各音素的对齐时间信息
ali-to-phones --ctm-output=true final.mdl ark:ali.1 -|~/kaldi/data/utils/int2sym.pl -f 5 phones.txt >ali.1.time

Bildbeschreibung hier einfügen

ps: In ähnlicher Weise können wir auch den Befehl ali-to-phones verwenden, um die Ausrichtungsinformationen anzuzeigen.

GMM trainieren – Vergleich von mono- und mono_ali-Ausrichtungsinformationen

Bildbeschreibung hier einfügen

Wir können unsere Ausrichtungsinformationen mit den Ausrichtungsinformationen beim Mono-Training vergleichen.Es ist ersichtlich, dass die Gesamtzahl der Zeilen der beiden Dateien nicht viel unterschiedlich ist, und die meisten der Ausrichtungsinformationen sind nicht viel unterschiedlich, was darauf hinweist, dass die Ausrichtungsfähigkeit von Das monophone Modell ist genau so und muss geändert werden Neuer Algorithmus zur Verbesserung der Ausrichtungsfähigkeit des Modells.

Ich denke du magst

Origin blog.csdn.net/yxn4065/article/details/129146948
Empfohlen
Rangfolge