WEBVTT

00:05.440 --> 00:11.650
Da wir nun in der letzten Vorlesung die drei großen Themengebiete,

00:11.810 --> 00:16.130
vier großen Themengebiete in der Spracherkennung besprochen hatten,

00:17.550 --> 00:20.810
angefangen mit der Vorverarbeitung, danach die akustische

00:20.810 --> 00:24.130
Modellierung, die Sprachmodellierung und die Suche, gehen wir jetzt

00:24.130 --> 00:29.190
und schauen uns noch ein paar kleinere Vertiefungen an in den

00:29.190 --> 00:30.010
einzelnen Gebieten.

00:30.010 --> 00:37.250
Und heute schauen wir uns insbesondere an das Gebiet der Adaption in

00:37.250 --> 00:38.690
der automatischen Spracherkennung.

00:43.870 --> 00:47.530
Wie wir schon mehrmals betont haben und wie wir auch ganz am Anfang

00:47.530 --> 00:52.350
der Vorlesung schon gesehen hatten, sind automatische Spracherkenne

00:54.990 --> 00:55.630
Musterklassifikationssysteme.

00:55.830 --> 00:59.510
Sie bekommen ein Muster rein, vergleichen das Muster gegen Modelle,

01:00.010 --> 01:03.890
berechnen Wahrscheinlichkeiten, dass bestimmte Modelle dieses Muster

01:03.890 --> 01:08.450
hervorgebracht haben, das Sprachmodell, das akustische Modell, und

01:08.450 --> 01:13.170
suchen dann nach dem Modell, das mit der höchsten Wahrscheinlichkeit

01:13.170 --> 01:14.570
dieses Muster hervorgebracht hat.

01:14.910 --> 01:18.550
Es ist also ein insgesamt generatives Modell, das wir da verwenden

01:18.550 --> 01:24.510
mithilfe der HMMs, der Sprachmodelle und der Fundamentalformel der

01:24.510 --> 01:25.210
Spracherkennung.

01:25.870 --> 01:29.810
Wir hatten ganz am Anfang mal angefangen, mit einfachen Templates zu

01:29.810 --> 01:33.350
arbeiten, mit einfachen Referenzmustern, zum Beispiel mit dem DTW oder

01:33.350 --> 01:34.990
dem One-Stage Dynamic Programming.

01:35.970 --> 01:41.630
Und da sieht es halt so aus, dass insbesondere da man mit solchen

01:41.630 --> 01:45.250
Distanzen zwischen Referenzmustern und neu aufgenommenen Mustern

01:45.250 --> 01:45.690
arbeitet.

01:46.430 --> 01:49.610
Und auch bei der statistischen Spracherkennung macht man im Prinzip

01:49.610 --> 01:53.450
nicht viel anderes, außer dass jetzt halt diese Distanzberechnung

01:53.450 --> 01:56.950
zwischen der Referenz, zwischen dem Referenzmuster und der neuen

01:56.950 --> 01:58.750
Aufnahme ein bisschen komplizierter wird.

01:58.990 --> 02:02.050
Statt des Referenzmusters haben wir ein ganzes Modell, bestehend aus

02:02.050 --> 02:04.110
Sprachmodell und akustischem Modell.

02:04.570 --> 02:07.730
Und statt Distanzen haben wir Wahrscheinlichkeiten, mit denen dieses

02:07.730 --> 02:11.990
Modell, diese Muster aus der Vorverarbeitung der neuen Aufnahme

02:11.990 --> 02:13.330
hervorgebracht haben.

02:14.830 --> 02:17.770
Das heißt aber insbesondere, dass wir sehr sensitiv sind gegen

02:17.770 --> 02:18.710
Variabilität.

02:19.570 --> 02:23.290
Wir hatten ganz am Anfang der Vorlesung gesagt, Variabilität ist das,

02:23.390 --> 02:24.670
was Spracherkennung schwierig macht.

02:25.170 --> 02:28.830
Jeder Mensch spricht selbst dieselbe Wortfolge unterschiedlich aus,

02:28.930 --> 02:32.050
selbst unter den gleichen Bedingungen, wenn er sie ein zweites Mal

02:32.050 --> 02:32.390
spricht.

02:32.930 --> 02:35.130
Unterschiedliche Sprecher haben unterschiedliche Akzente,

02:35.250 --> 02:37.370
unterschiedliche Räume haben unterschiedliche Akustiken,

02:37.510 --> 02:40.310
unterschiedliche Mikrofone haben unterschiedliche Charakteristiken.

02:40.670 --> 02:42.850
Ich kann Umgebungsgeräusche haben, etc., etc.

02:43.030 --> 02:46.750
Und alles das sorgt dafür, dass dieses Muster, das ich klassifizieren

02:46.750 --> 02:50.430
möchte, das aus meiner Vorverarbeitung herausfällt, variiert von

02:50.430 --> 02:54.770
Sprecher zu Sprecher, von Situation zu Situation.

02:56.490 --> 02:59.290
Wir hatten gesehen in der Vorverarbeitung, wie man ein bisschen

02:59.290 --> 03:02.850
versuchen kann, diese Sprechervariabilität herauszubekommen.

03:04.230 --> 03:06.810
Die Vorverarbeitung hatte zwei große Ziele.

03:07.350 --> 03:09.410
Was waren die zwei großen Ziele der Vorverarbeitung?

03:11.950 --> 03:12.430
Irgendeiner.

03:12.990 --> 03:13.890
Was sind die zwei?

03:13.990 --> 03:15.550
Warum machen wir Vorverarbeitung?

03:15.630 --> 03:17.510
Warum nehmen wir nicht einfach das Audiosignal, wie es ist?

03:18.130 --> 03:20.550
Das hatte zwei Gründe, die wir dafür gesagt haben.

03:23.520 --> 03:27.320
Erstens, wir wollen wichtige, für die Klassifikation wichtige

03:27.320 --> 03:31.560
Informationen extrahieren und betonen, unwichtige wegwerfen und wir

03:31.560 --> 03:32.860
wollen die Datenrate reduzieren.

03:33.780 --> 03:38.400
Und in dieser Vorverarbeitung haben wir bestimmte Sachen automatisch

03:38.400 --> 03:43.320
schon herausgefiltert und normalisiert, die jetzt die Variabilität

03:43.320 --> 03:43.800
betrifft.

03:44.220 --> 03:47.220
Zum Beispiel, wenn wir Keppstrahlkoeffizienten verwenden, sind wir

03:47.220 --> 03:50.460
automatisch inhärent lautstärkend unabhängig.

03:50.760 --> 03:53.300
Das heißt zum Beispiel, eine Variabilität wie die Lautstärke des

03:53.300 --> 03:54.380
Signals wird herausgenommen.

03:55.220 --> 03:59.400
Wenn wir eine Mailskalierung durchführen, wird die genaue Position der

03:59.400 --> 04:00.320
Formanten verwischt.

04:00.920 --> 04:03.960
Die landet da in irgendwelchen grob auflösenden Filterbänken.

04:04.700 --> 04:08.460
Man kann, das konnten wir uns anschauen im Spektrogramm, wenn man das

04:08.460 --> 04:12.740
mailskaliert hatte, konnte man zum Beispiel den genauen Ort der

04:12.740 --> 04:16.000
Fundamentalfrequenz nicht mehr so richtig schön feststellen.

04:16.120 --> 04:17.300
Das war alles irgendwie so verschmiert.

04:17.380 --> 04:19.720
Da kam es auf ein paar Hertz hoch oder runter nicht mehr drauf an.

04:20.300 --> 04:24.200
Auf die Art und Weise hat man eine gewisse Sprecher-Normalisierung

04:24.200 --> 04:24.580
gemacht.

04:25.120 --> 04:27.140
Im Keppstrom haben wir geliftert.

04:27.720 --> 04:29.780
Wir haben die Mikrostruktur weggeworfen und wir haben die

04:29.780 --> 04:30.880
Makrostruktur behalten.

04:31.480 --> 04:35.640
Auch damit wirft man sprecherspezifische und situationsspezifische

04:36.300 --> 04:37.260
Informationen weg.

04:37.460 --> 04:40.740
Wir haben gesehen, wie man mit einer Keppstrahl-Mittelwertsubstraktion

04:40.740 --> 04:43.660
zum Beispiel ein bisschen den Kanal versuchen kann abzuziehen und

04:43.660 --> 04:44.640
heraus zu normalisieren.

04:45.360 --> 04:47.680
Aber auch wenn man das alles macht, das sind keine perfekten

04:47.680 --> 04:50.880
Techniken, die helfen zwar ein bisschen die Variabilität zu

04:50.880 --> 04:53.940
reduzieren, aber sie werden sie nicht hundertprozentig los.

04:54.440 --> 04:57.220
Das heißt, das Muster, das wir klassifizieren, wird immer noch

04:57.220 --> 05:01.940
variieren in Abhängigkeit von bestimmten Umgebungsbedingungen.

05:02.080 --> 05:03.100
Welcher Sprecher ist das?

05:03.200 --> 05:03.820
Ganz prominent.

05:04.380 --> 05:05.780
In welcher Umgebung nehme ich auf?

05:05.860 --> 05:07.940
Mit welchem Mikrofon nehme ich auf?

05:08.240 --> 05:10.080
In welchem Zustand bestimmt sich der Sprecher?

05:11.360 --> 05:14.840
Auch auf der Sprachmodellseite haben wir das ähnliche Problem.

05:17.080 --> 05:19.740
Wir hatten gesagt, wir haben Variabilität zum Beispiel auf

05:19.740 --> 05:23.860
Signalebene, aber wir haben auch Variabilität auf linguistischer

05:23.860 --> 05:24.180
Ebene.

05:24.980 --> 05:27.900
Unterschiedliche Domänen verlangen unterschiedliche Vokabularien.

05:28.440 --> 05:33.080
Und unser Spracherkenner kann immer nur die Wörter erkennen, die er in

05:33.080 --> 05:34.260
seinem Suchvokabular hat.

05:34.760 --> 05:38.880
Das, was in dem ArcMax unter dem ArcMax steht, da steht die Menge

05:38.880 --> 05:42.040
aller Wortfolgen und die ist definiert durch das Suchvokabular des

05:42.040 --> 05:44.760
Erkenners und nur diese Wortfolgen können wir erkennen.

05:45.660 --> 05:49.140
Und unser Sprachmodell, zum Beispiel das N-Gramm-Sprachmodell, wird

05:49.140 --> 05:53.060
auf großen Textmengen trainiert, die idealerweise aus dieser Domäne

05:53.060 --> 05:56.360
kommen, die wir hinterher erkennen wollen, damit halt die Schätzungen

05:56.360 --> 06:01.360
der Wahrscheinlichkeiten möglichst auf diese Domäne aus der hinterher

06:01.360 --> 06:02.820
die Testdaten kommen, passen.

06:03.740 --> 06:06.740
Das heißt aber auch, dass wenn ich die Domäne wechsle, ich zum

06:06.740 --> 06:09.880
Beispiel Probleme bekomme, dass ich plötzlich Wörter sehe, die ich

06:09.880 --> 06:13.180
nicht in meinem Suchvokabular habe, weil ich das Suchvokabular anhand

06:13.180 --> 06:16.400
von Beispieltexten, Trainingstexten aus einer anderen Domäne aufgebaut

06:16.400 --> 06:16.660
habe.

06:18.060 --> 06:22.380
Ich werde bestimmte Wortfolgen plötzlich in den Testdaten sehen, die

06:22.380 --> 06:26.580
ich vorher nicht immer im Sprachmodell Training gesehen habe.

06:26.980 --> 06:29.460
Die Texte, die ich bekomme, sind häufig geschriebene Texte,

06:29.700 --> 06:30.960
Zeitungstexte zum Beispiel.

06:31.440 --> 06:34.320
Die Sprache, die ich reinbekomme, ist je nach Domäne unter Umständen

06:34.320 --> 06:35.760
etwas sehr Spontansprachliches.

06:36.040 --> 06:41.400
Konversationen zwischen Personen, Terminfindungen, Steuerung,

06:42.600 --> 06:45.420
Vorlesungen, die gehalten werden, die jetzt auch von der Sprache her

06:45.420 --> 06:47.120
nicht unbedingt geschriebenen Texten entsprechen.

06:47.980 --> 06:50.620
Das heißt, da habe ich auch einen Mismatch.

06:51.080 --> 06:56.400
Und wenn ich dann jetzt da zum Beispiel das Problem habe, ich habe auf

06:56.400 --> 06:59.380
Zeitungstexten trainiert und als nächstes kommt einer und liest

06:59.380 --> 07:01.480
Märchen vor, dann wird das nicht gut funktionieren.

07:01.700 --> 07:02.560
Dann muss ich etwas machen.

07:03.820 --> 07:08.280
Beim Sprachmodell, beim Thema Sprachmodelle hatten wir schon eine

07:08.280 --> 07:10.240
Technik gesehen, was man da machen kann.

07:11.900 --> 07:14.280
Die hatte sich damit beschäftigt, dass ich halt häufig viel

07:14.280 --> 07:17.720
geschriebene Texte habe, Zeitungstexte, aber wenig geschriebene Texte

07:17.720 --> 07:22.140
zum Beispiel von Konversationen, wo sich Leute miteinander

07:22.140 --> 07:22.580
unterhalten.

07:23.300 --> 07:24.560
Was konnte man da machen?

07:24.680 --> 07:26.660
Was war da eine Technik, die man anwenden konnte?

07:30.240 --> 07:33.980
Was war die Standardtechnik da, um diesen Domänen-Mismatch besser in

07:33.980 --> 07:37.280
den Griff zu bekommen, um damit leben zu können, dass ich häufig sehr

07:37.280 --> 07:40.240
viel Trainingsmaterial in der falschen Domäne habe und nur sehr wenig

07:40.240 --> 07:41.980
Trainingsmaterial in der richtigen Domäne?

07:42.220 --> 07:43.460
Was war da die Standardtechnik?

07:44.560 --> 07:48.520
Ja, aber wir hatten da insbesondere gesehen als Standardwerkzeug die

07:48.520 --> 07:52.000
Interpolation, dass ich mir ein Hintergrundsprachmodell trainiere auf

07:52.000 --> 07:55.060
diesen großen Mengen an Texten, die jetzt nicht auf meine Domäne

07:55.060 --> 07:56.060
passen.

07:56.060 --> 08:00.880
Und Ziel des Hintergrundsprachmodells war es, allgemein Sprache in

08:00.880 --> 08:03.960
dieser Zielsprache zu modellieren.

08:04.460 --> 08:07.240
Und das habe ich dann interpoliert mit einem Sprachmodell, das nur auf

08:07.240 --> 08:11.540
sehr wenig Trainingstexten trainiert war, wo teilweise die Schätzungen

08:11.540 --> 08:14.780
bestimmter N-Gramme nicht robust waren oder sehr viele N-Gramme aus

08:14.780 --> 08:16.440
der allgemeinen Sprache auch nicht vorkamen.

08:16.900 --> 08:19.040
Und auf die Art und Weise konnte ich mich so ein bisschen auf diese

08:19.040 --> 08:20.840
Zieldomäne adaptieren.

08:21.840 --> 08:25.100
Das war zum Beispiel dann eine Möglichkeit der Adaption.

08:25.440 --> 08:29.420
Und diese Möglichkeiten der Adaption hat man nicht nur jetzt in dieser

08:29.420 --> 08:32.840
Form für dieses Sprachmodell, sondern die hat man auch auf allen

08:32.840 --> 08:36.840
Ebenen in der Vorverarbeitung, im akustischen Modell und natürlich

08:36.840 --> 08:38.080
auch im Sprachmodell.

08:38.740 --> 08:44.160
Und die Idee, die dahinter steckt, ist häufig, ich habe Daten aus

08:44.160 --> 08:48.280
einer bestimmten Domäne, die sind transkribiert, die liegen als

08:48.280 --> 08:52.080
elektronischer Text vor und auf denen kann ich trainieren.

08:52.540 --> 08:56.840
Aber diese Domäne entspricht nicht unbedingt der Domäne auf der ich

08:56.840 --> 08:57.760
hinterher testen muss.

08:58.860 --> 09:02.320
Oder es kann auch sein, ich trainiere für ein bestimmtes Szenario, ein

09:02.320 --> 09:05.420
Spracherkennungssystem und dann wird dieses Spracherkennungssystem

09:05.420 --> 09:06.940
angewandt in der Domäne.

09:08.000 --> 09:11.540
Und das soll da für eine gewisse Zeit laufen, idealerweise über Jahre

09:11.540 --> 09:14.200
und die Domäne ändert sich.

09:15.680 --> 09:18.680
Nachrichten verändern sich, es kommen andere Themen hoch, man spricht

09:18.680 --> 09:20.220
über andere Themen.

09:20.680 --> 09:25.100
Wenn ich zum Beispiel ein Spracherkennungssystem trainiert habe, um

09:25.100 --> 09:29.560
die Tagesthemen zu verschriften, dann habe ich viele Jahre Tagesthemen

09:29.560 --> 09:33.840
gesammelt, die verschriftet, funktioniert wunderbar, insbesondere auf

09:33.840 --> 09:36.380
dem Studiosprecher, da gibt es eh nur 3, 4 Studiosprecher, da habe ich

09:36.380 --> 09:39.340
in meinen Trainingsdaten tonnenweise Material von gesehen und dann

09:39.340 --> 09:40.900
wechselt der Studiosprecher.

09:40.940 --> 09:43.460
Allerdings nachdem ich das System halt schon rausgegeben habe.

09:43.600 --> 09:44.980
Plötzlich ist ein anderer Studiosprecher.

09:45.880 --> 09:47.680
Theoretisch müsste ich jetzt wieder zurückgehen und von dem

09:47.680 --> 09:50.300
Studiosprecher Daten transkribieren und das dann in das System

09:50.300 --> 09:52.780
einpflegen, damit das dann wieder so super toll funktioniert auf

09:52.780 --> 09:55.420
diesem neuen Sprecher, wie es für die alten Bekanntensprecher

09:55.420 --> 09:55.940
funktioniert.

09:56.400 --> 09:58.480
Ist natürlich nicht realistisch in der Praxis.

10:00.900 --> 10:02.060
Themen ändern sich.

10:02.420 --> 10:05.600
Heute ist es Syrien, morgen ist es vielleicht Lateinamerika,

10:05.700 --> 10:08.240
übermorgen ist es wieder Südafrika oder vielleicht ist irgendwann mal

10:08.240 --> 10:09.540
was irgendwo in Australien los.

10:09.720 --> 10:13.800
Kommen plötzlich ganz andere Namen, andere Bezüge etc.

10:14.020 --> 10:16.220
Es gibt Wahlen, die Politiker wechseln sich etc.

10:17.060 --> 10:22.060
Das heißt auch dadurch, dass ein System halt eine Weile im Einsatz

10:22.060 --> 10:25.340
ist, ändert sich die Welt drum herum und die Domäne, für die es

10:25.340 --> 10:27.700
gedacht ist, ist zwar von der generischen Beschreibung immer noch

10:27.700 --> 10:31.880
gleich, aber die Daten, die aus dieser Domäne kommen, ändern sich.

10:36.390 --> 10:38.350
Sprecherabhängigkeit versus Sprecherunabhängigkeit ist ein

10:38.350 --> 10:39.150
Paradebeispiel.

10:39.610 --> 10:43.690
Wenn ich Spracherkennungssysteme genau auf einen Sprecher zuschneide,

10:44.530 --> 10:46.930
wenn ich von ihnen zehn Stunden Sprache nehme und darauf ein

10:46.930 --> 10:50.810
Spracherkennungssystem trainiere, kann das super sie erkennen.

10:50.890 --> 10:53.230
Wenn sie dem dann Texte diktieren und ich von der Domäne her das

10:53.230 --> 10:55.490
richtige Sprachmodell habe, können wir da ganz super tolle

10:55.490 --> 10:57.970
Sprachergebnisse liefern.

10:58.970 --> 11:01.130
Jetzt kann ich natürlich nicht von jedem, der hinterher in ein

11:01.130 --> 11:03.970
Spracherkennungssystem reinsprechen soll, erstmal zehn Stunden Daten

11:03.970 --> 11:05.170
sammeln und die transkribieren.

11:05.810 --> 11:08.410
Also hatten wir uns gesagt, okay, wir behelfen uns mit so einer

11:08.410 --> 11:08.750
Krücke.

11:09.290 --> 11:11.590
Wir nehmen nämlich einen Sprecher, wir nehmen möglichst viele

11:11.590 --> 11:15.050
Sprecher, auf denen trainieren wir und dann hoffen wir, dass das, was

11:15.050 --> 11:19.370
bei herauskommt, irgendwie repräsentativ ist für beliebige Sprecher,

11:19.430 --> 11:23.530
sodass wenn ein neuer Sprecher reinspricht, das auch funktionieren

11:23.530 --> 11:23.770
wird.

11:24.250 --> 11:26.950
In der Praxis ist es aber immer noch so, dass ein sprecherabhängiges

11:26.950 --> 11:29.290
System nach wie vor immer besser sein wird als ein

11:29.830 --> 11:30.570
sprecherunabhängiges System.

11:30.950 --> 11:33.130
Kann man sich auch leicht vorstellen, wenn man sich da vorstellt, man

11:33.130 --> 11:37.270
hat diese Gauss-Mixtur- Modelle, die werden trainiert und je mehr

11:37.270 --> 11:40.010
unterschiedliche Sprecher ich bringe, desto mehr Variabilität bringe

11:40.010 --> 11:40.450
ich da rein.

11:41.290 --> 11:44.070
Die Variabilität kann eine Gauss-Mixtur durch zwei Dinge auffangen.

11:44.130 --> 11:47.290
Die erste Möglichkeit ist, dass es mehrere Gauss- Mixturen für

11:47.290 --> 11:50.370
unterschiedliche Variationen hat und da die Mittelwerte hin

11:50.370 --> 11:50.830
verschiebt.

11:50.830 --> 11:53.650
Aber da komme ich auch irgendwann an die Grenzen, weil pro Gauss

11:53.650 --> 11:58.350
-Mixtur brauche ich ein bestimmtes Trainingsmaterial plus das müssen

11:58.350 --> 12:00.810
ja auch noch andere Varianzen abgebildet werden.

12:01.130 --> 12:03.570
Und die andere Möglichkeit ist, dass ich die Varianz der Gauss

12:03.570 --> 12:05.790
-Glocken, der einzelnen Gauss-Glocken breiter mache.

12:06.370 --> 12:08.910
Wenn ich natürlich die Varianz der einzelnen Gauss-Glocken breiter

12:08.910 --> 12:09.830
mache, werden die unspezifischer.

12:11.170 --> 12:14.790
Das heißt, die schlagen nicht mehr so stark an auf das, wofür sie

12:14.790 --> 12:18.550
anschlagen sollen, für das Polyfon, für das sie stehen, sondern die

12:18.550 --> 12:22.890
schlagen dann an für beliebige Sprache, für Sachen, für die sie auch

12:22.890 --> 12:23.310
nicht stehen.

12:23.430 --> 12:25.070
Das heißt, ich mache da Modellierungsfehler.

12:25.670 --> 12:28.990
Deswegen schöner ist es, wenn ich möglichst von meinem Muster her mich

12:28.990 --> 12:30.990
auf einen Sprecher einschieße.

12:32.570 --> 12:35.430
Aber ich kann halt nicht erstmal zehn Stunden Sprache aufnehmen.

12:35.870 --> 12:39.970
Das heißt, idealerweise wäre es so, dass ich zum Beispiel ein

12:39.970 --> 12:43.070
sprecherunabhängiges System trainiert habe und dann kommt ein neuer

12:43.070 --> 12:47.610
Sprecher und fängt an zu diktieren und nur indem ich dem Sprecher

12:47.610 --> 12:51.470
zuhöre, mache ich meine Modelle besser, spezifischer für diesen

12:51.470 --> 12:51.810
Sprecher.

12:53.030 --> 12:55.710
Früher hatte man so einen Mittelweg gewählt, dass man nicht gesagt

12:55.710 --> 12:58.590
hat, okay, ich will jetzt erstmal zehn Stunden reinsprechen und

12:58.590 --> 12:59.190
transkribieren.

12:59.330 --> 13:02.010
Früher, wenn man ein Diktiersystem gekauft hat, das kann sein, dass es

13:02.010 --> 13:05.530
heutzutage immer noch so ist, würde Sinn machen, hat man halt ein

13:05.530 --> 13:08.490
sprecherunabhängiges System genommen und dann hat man dem Sprecher,

13:08.970 --> 13:13.310
dem neuen Sprecher, der da diktieren will, gesagt, lies doch mal bitte

13:13.310 --> 13:15.470
15 Minuten Text vor.

13:15.610 --> 13:18.190
Und hat dem Text gegeben, 15 Minuten hat er den vorgelesen.

13:18.190 --> 13:22.370
Damit mit diesen 15 Minuten kann ich nicht ein komplett neues Modell

13:22.370 --> 13:25.850
von Grund auf trainieren, das auf diesen Sprecher passt, aber ich kann

13:25.850 --> 13:31.090
mein sprecherunabhängiges Modell so modifizieren, dass es besser auf

13:31.090 --> 13:32.370
diesen neuen Sprecher passt.

13:33.430 --> 13:38.530
Und das Ganze, diese Art der Anpassung, nennt sich Adaption.

13:40.030 --> 13:43.410
Die erste Idee, die man da haben kann, ist die Adaption des

13:44.030 --> 13:45.070
akustischen Modells.

13:46.770 --> 13:49.610
Wir verwenden sprecherunabhängiges Modell als Grundlage.

13:50.110 --> 13:55.170
Wir haben wenig Material vom Zielsprecher und passen jetzt das Modell

13:55.170 --> 13:58.670
auf diesen Zielsprecher an.

13:59.030 --> 14:00.470
Das ist erstmal so das generische.

14:01.170 --> 14:04.490
Und dann kann man sich so grundlegende Sachen überlegen.

14:04.610 --> 14:08.610
Man kann sich zum Beispiel ein bestimmtes Merkmal herausnehmen, zum

14:08.610 --> 14:09.630
Beispiel die Grundfrequenz.

14:10.450 --> 14:13.010
Man kann feststellen, okay, der Sprecher hat jetzt eine bestimmte

14:13.010 --> 14:15.710
Grundfrequenz, hat einen besonders tiefen oder besonders hohen Stimme

14:15.710 --> 14:21.410
und weiß dann, was das bedeutet für das Modell und kann das Modell

14:21.410 --> 14:24.270
dann versuchen, zum Beispiel so zu transformieren, dass es besser auf

14:24.270 --> 14:28.330
diese andere abweichende Grundfrequenz von dem Durchschnitt, den das

14:28.330 --> 14:31.490
Modell hat, anzuwenden.

14:32.010 --> 14:37.410
Die umgekehrte Möglichkeit ist, dass man sich die Merkmale, die man

14:37.410 --> 14:42.410
extrahiert, hernimmt und dann die Merkmale versucht so zu

14:42.410 --> 14:47.250
transformieren, dass sie besser auf dieses Durchschnittsmodell passen.

14:47.450 --> 14:50.430
Das Durchschnittsmodell wurde so trainiert, dass es auf so eine

14:50.430 --> 14:52.090
durchschnittliche Grundfrequenz passt.

14:52.230 --> 14:54.390
Jetzt habe ich einen Sprecher, dessen Grundfrequenz weicht ab.

14:54.870 --> 14:59.030
Dann transformiere ich die Merkmale so, verzerre ich das Spektrum, das

14:59.030 --> 15:02.390
herauskommt so, dass es besser auf ein Spektrum passt, als hätte es

15:02.390 --> 15:03.770
diese Grundfrequenz.

15:06.930 --> 15:11.670
Jetzt ist natürlich die Frage, wo bekommt man diese Sachen her?

15:11.770 --> 15:14.770
Man muss ja irgendwie, man kann den Sprecher nicht fragen, sag mal,

15:14.830 --> 15:16.230
mit was für einer Grundfrequenz sprichst du denn?

15:16.330 --> 15:18.370
Ah, 300 Hertz, super, dann weiß ich.

15:18.770 --> 15:20.610
Das muss ich ja irgendwie automatisch schätzen.

15:21.410 --> 15:24.770
Und dann muss ich ja auch irgendwie wissen, wie verändere ich denn

15:24.770 --> 15:25.210
mein Modell?

15:25.290 --> 15:27.950
Wie verändere ich mein Spektrum, wenn ich jetzt weiß, wie das Ganze im

15:27.950 --> 15:28.710
Durchschnitt abweicht?

15:29.150 --> 15:30.710
Da gibt es keine handgeschriebenen Regeln.

15:30.830 --> 15:35.030
Wenn jetzt Grundfrequenz 50 Hertz höher, dann Gauss-Glocke 1, dann

15:35.030 --> 15:37.530
muss der Mittelwert nach da verschoben werden und die Varianz so

15:37.530 --> 15:40.430
gequetscht und Gauss-Glocke 3455 in die Richtung.

15:40.990 --> 15:43.670
Auch das muss irgendwie datengetrieben passieren.

15:43.790 --> 15:45.410
Das muss maschinell gelernt werden.

15:48.170 --> 15:49.750
Das hatten wir schon gesagt.

15:51.230 --> 15:55.730
So eine Konormalisierung hatten wir schon beim Capstrum.

15:55.990 --> 15:59.050
Wir hatten gesehen, dass das Capstrum zum Beispiel Signalenergie, also

15:59.050 --> 16:02.010
ob einer laut oder leise spricht, fast ignoriert.

16:02.370 --> 16:05.430
Die Signalenergie beim Capstrum fließt nur in die Berechnung des 0.

16:05.670 --> 16:06.430
Koeffizienten ein.

16:06.890 --> 16:10.370
Alle anderen Capstralkoeffizienten sind automatisch völlig unabhängig

16:10.370 --> 16:11.350
von der Signalenergie.

16:12.950 --> 16:16.250
Und jetzt kann man so ein bisschen hergehen und sich überlegen, was

16:16.250 --> 16:19.410
sind das denn so die möglichen Sachen, in denen ein Sprecher variiert.

16:21.330 --> 16:23.950
Wir hatten schon gesagt, er kann zum Beispiel in der Grundfrequenz

16:23.950 --> 16:26.710
variieren.

16:27.330 --> 16:30.790
Jetzt hatten wir aber schon gesehen, bei der Mailskalierung wird die

16:30.790 --> 16:34.910
Grundfrequenz, die genaue Position der Grundfrequenz, wird sowieso

16:34.910 --> 16:38.030
verschoben, wird sowieso verschmiert.

16:38.370 --> 16:39.830
Das kennen wir nicht so genau.

16:40.410 --> 16:43.330
Was aber durchaus interessant ist, ist dann auch zum einen die

16:43.330 --> 16:45.530
Position der Oberschwingungen.

16:46.150 --> 16:48.930
Und dann interessiert uns natürlich insbesondere die Position der

16:48.930 --> 16:52.410
Formanten, also die Frage, welche, wie viel der Oberschwingung schlägt

16:52.410 --> 16:54.090
denn besonders stark an und wo liegt die.

16:54.930 --> 16:59.610
Und das wird halt bestimmt nicht so sehr durch die Länge der

16:59.610 --> 17:02.810
Stimmlippen, durch die Grundfrequenz, sondern das wird unter anderem

17:02.810 --> 17:08.110
bestimmt, also welcher wird zu einem Formant und die wievielte

17:08.110 --> 17:09.750
Oberschwingung ist denn dann der Formant?

17:10.290 --> 17:13.370
Das wird bestimmt durch die Länge des Vokaltraktes und die Form des

17:13.370 --> 17:14.110
Vokalkraktes.

17:15.350 --> 17:18.150
Dann können wir uns halt auf bestimmte Stimmcharakteristiken

17:18.150 --> 17:18.590
einsprechen.

17:18.770 --> 17:21.050
Zum Beispiel, der eine hat einen Sprachfehler und lispelt, der andere

17:21.050 --> 17:22.610
nuschelt, der andere spricht wieder sehr nasal.

17:23.650 --> 17:25.730
Wir haben sowas wie regionale Akzente.

17:26.130 --> 17:28.970
Das heißt also, Vokale können zum Beispiel eine andere Klangfarbe

17:28.970 --> 17:29.390
bekommen.

17:29.990 --> 17:33.490
Ich kann andere Phoneme verwenden für ein und dasselbe Wort.

17:35.070 --> 17:37.650
Die einen sprechen besonders schnell, die anderen sprechen besonders

17:37.650 --> 17:39.130
langsam.

17:40.810 --> 17:46.590
Der eine betont bestimmte Wörter oder Silben besonders stark etc.

17:46.750 --> 17:47.010
etc.

17:47.270 --> 17:51.830
Dann habe ich Sprachakzente, also Fremdsprachler versus

17:51.830 --> 17:52.730
Muttersprachler.

17:53.190 --> 17:55.050
Hören sich unterschiedlich an, haben unterschiedliche

17:55.050 --> 17:55.830
Charakteristiken.

17:56.650 --> 17:58.930
Dann muss ich mir was überlegen, wie kann ich unterschiedliche

17:58.930 --> 18:02.150
Mikrofon - charakteristiken mit denen umgehen.

18:02.510 --> 18:03.690
Wie kann ich mit Hall umgehen?

18:03.810 --> 18:07.130
Hall ist etwas, das auf Signalebene das Signal stört.

18:07.410 --> 18:08.890
Kann ich das irgendwie rausbekommen?

18:09.350 --> 18:12.610
Kann ich sowas wie Hintergrundgeräusche versuchen raus zu adaptieren,

18:12.690 --> 18:13.450
zu normalisieren?

18:14.010 --> 18:15.130
Was ist mit übersprechen?

18:15.270 --> 18:17.810
Das heißt, wenn ich in meinem Mikrofon noch irgendeinen anderen

18:17.810 --> 18:19.910
Sprecher höre, dann will ich den ja auch nicht erkennen.

18:25.860 --> 18:29.480
Das Besondere bei der Adaption oder was die Adaption vom Training

18:29.480 --> 18:30.640
unterscheidet ist.

18:32.540 --> 18:35.840
Auch beim Training haben wir insbesondere beim EM-Training diese

18:35.840 --> 18:39.560
Situation, ich brauche ja erstmal irgendein Modell, das ich mir

18:39.560 --> 18:42.660
irgendwo vom Himmel her zaubere und dieses Modell kann ich dann

18:42.660 --> 18:44.680
mithilfe des EM-Algorithmuses besser machen.

18:44.940 --> 18:46.440
Ich brauche irgendwo ein initiales Modell.

18:47.080 --> 18:50.080
Jetzt könnte man da sagen, ja gut, das ist ja hier das gleiche.

18:50.360 --> 18:53.500
Das sprecherunabhängige Modell ist halt genauso ein initiales Modell

18:53.500 --> 18:57.220
wie das zufällig initialisierte oder das mit irgendwelchen Labels

18:57.220 --> 18:59.100
initialisierte Modell.

18:59.160 --> 19:01.660
Darauf mache ich ein... und dann wende ich ein Training an.

19:02.220 --> 19:05.620
Der Unterschied bei der Adaption zum Training ist, beim Training

19:05.620 --> 19:08.760
werden immer alle Parameter angepasst.

19:08.860 --> 19:11.260
Beim EM-Algorithmus, wenn ich den einmal über die Trainingsdaten

19:11.260 --> 19:16.700
überlaufen lasse, passt der mir danach alle Parameter meines Modells

19:16.700 --> 19:16.980
an.

19:17.660 --> 19:21.220
Bei der Adaption habe ich in der Regel aber deutlich zu wenig

19:21.220 --> 19:24.060
Trainingsdaten, um alle Parameter anpassen zu können.

19:24.440 --> 19:29.220
Werde zum Beispiel für bestimmte Parameter nur sehr wenig

19:29.220 --> 19:33.280
Trainingsdaten sehen und jetzt schätze ich diese Parameter auf sehr

19:33.280 --> 19:36.240
wenigen Trainingsdaten, die zwar charakteristisch sind, aber trotzdem

19:36.240 --> 19:39.460
so wenig sind, dass ich gar nicht robust meinen Parameter darauf

19:39.460 --> 19:40.020
schätzen kann.

19:40.620 --> 19:44.660
Sondern das kann sein, dass ich dann ins Overfitting komme oder auf

19:44.660 --> 19:47.440
zufälligen Ausreißern meine Parameter völlig verhunze.

19:48.180 --> 19:51.060
Andere Parameter werde ich überhaupt kein Trainingsmaterial haben.

19:51.400 --> 19:52.960
Die werden dann überhaupt nicht angepasst.

19:53.680 --> 19:56.560
Das ist aber schade, weil ich ja aus den Adaptionsdaten vielleicht so

19:56.560 --> 20:00.020
eine grobe Tendenz absehen kann, die ich auf alle Trainingsdaten

20:00.020 --> 20:00.660
anwenden kann.

20:01.520 --> 20:05.780
Das heißt, bei der Adaption kommt man dann dahin, dass ich nicht im

20:05.780 --> 20:09.800
regulären Training alle Parameter so anpasse, wie ich es im regulären

20:09.800 --> 20:13.960
Training mache, sondern ich muss irgendwie aus diesen Adaptionsdaten

20:13.960 --> 20:19.280
abstrahieren können, um eine in der Regel Transformation zu finden,

20:19.500 --> 20:21.380
die mir meine Parameter ändert.

20:21.840 --> 20:26.380
Aber die Transformation selber muss deutlich weniger Parameter haben

20:26.380 --> 20:29.060
als die Anzahl derjenigen Parameter, die ich verändere.

20:30.400 --> 20:36.700
Einfaches Beispiel, da hat einer, der spricht halt zufälligerweise so,

20:36.780 --> 20:39.380
dass alles zehn Hertz nach oben verschoben ist.

20:40.320 --> 20:41.360
Dann kann ich mir das umrechnen.

20:41.400 --> 20:42.840
Was bedeutet das denn in meinem CapStrom?

20:43.360 --> 20:46.040
Und dann kann ich in meinem CapStrom die Mittelwerte aller Gauss

20:46.040 --> 20:49.040
-Glocken einfach entsprechend in die Richtung verschieben.

20:50.420 --> 20:52.220
Da brauche ich genau einen Parameter.

20:52.660 --> 20:55.320
Das ist nämlich die Distanz, oder sagen wir mal zwei Parameter.

20:55.660 --> 20:59.000
Die Distanz, also um wie viel und in welche Richtung verschiebe ich

20:59.000 --> 21:00.580
denn in diesen multidimensionalen Raum?

21:01.160 --> 21:04.980
Und dieser Vektor, der eine gewisse Länge hat und eine gewisse

21:04.980 --> 21:10.220
Richtung zeigt, hat genauso viele Parameter zum Beispiel wie die

21:10.220 --> 21:12.740
Dimension meines Merkmalsvektors, 42.

21:13.200 --> 21:17.380
Und mit dem kann ich dann 60.000 Parameter automatisch adaptieren,

21:17.440 --> 21:19.420
wenn ich diesen einschätze.

21:19.800 --> 21:23.680
Das wäre eine einfache additive Transformation, einfach auf alle

21:23.680 --> 21:26.560
Mittelmerzvektoren, die ich habe, mit noch mal ein Vektor drauf

21:26.560 --> 21:26.880
addiert.

21:27.440 --> 21:27.780
Fertig.

21:29.720 --> 21:33.580
Und diesen einen Vektor kann ich dann halt, der hat nur 42 Parameter,

21:33.740 --> 21:38.140
relativ robust auf den wenigen Adaptionsdaten haben, die ich habe,

21:38.200 --> 21:38.460
schätzen.

21:39.460 --> 21:44.100
Das heißt, ich habe hier irgendwo unadaptierte Modelle, bekomme diese

21:44.100 --> 21:49.240
wenigen Adaptionsdaten rein, schätze darauf eine Transformation, die

21:49.240 --> 21:52.520
deutlich weniger Parameter hat als die unadaptierten Modelle.

21:53.220 --> 21:57.480
Diese geschätzte Transformation wende ich auf die unadaptierten

21:57.480 --> 22:01.600
Modelle an und bekomme meine adaptierten Modelle.

22:02.300 --> 22:04.920
Und jetzt gibt es hier noch einen Pfeil, der zeigt von den

22:04.920 --> 22:09.140
unadaptierten Modellen in die Transformationsschätzung rein.

22:09.900 --> 22:12.340
Und das liegt daran, ich muss ja irgendwie diese Transformation

22:12.340 --> 22:12.920
schätzen.

22:13.080 --> 22:16.580
Ich muss ja irgendwie schätzen können, macht die Transformation, wenn

22:16.580 --> 22:19.180
ich die Parameter so wähle, das Ganze besser oder macht die

22:19.180 --> 22:21.900
Transformation das Ganze schlechter, wenn ich die Parameter so wähle.

22:22.260 --> 22:24.600
Und dann muss ich irgendwie optimale Parameter finden.

22:25.120 --> 22:28.380
Und um diese Schätzung durchzuführen, ist eine bestimmte

22:28.380 --> 22:31.860
Transformation eher gut oder eher schlecht, verwende ich die

22:31.860 --> 22:37.240
unadaptierten Modelle, um daraus im Prinzip zu gucken, okay, das sind

22:37.240 --> 22:41.140
die unadaptierten Modelle, das passiert, wenn ich die unadaptierten

22:41.140 --> 22:44.440
Modelle auf die Adaptionssprache loslasse, wie kann ich denn jetzt die

22:44.440 --> 22:48.860
Transformation verändern, anpassen, so dass hinterher adaptierte

22:48.860 --> 22:49.820
Modelle besser sind.

22:52.620 --> 22:58.100
Wenn ich so auf die Art und Weise meine Adaption durchführe, kann ich

22:58.100 --> 23:03.080
erst mal prinzipiell unterschiedliche Operationsmodi unterscheiden.

23:03.780 --> 23:07.620
Das Erste wäre Batch-Verarbeitung oder auf gut Deutsch

23:07.620 --> 23:09.820
Stapelverarbeitung versus Incremental.

23:10.380 --> 23:14.660
Die Idee dahinter ist, wo bekomme ich die Adaptionsdaten her.

23:15.240 --> 23:18.880
Bei diesem ersten Beispiel mit dem Diktiersystem, bitte mal 15 Minuten

23:18.880 --> 23:25.060
reinsprechen, kriege ich auf einen Stapel in einer großen Menge 15

23:25.060 --> 23:30.000
Minuten Adaptionsdaten, kann die einmal anwenden, also einmal komplett

23:30.000 --> 23:33.080
von vorne, hinten durchverarbeiten, auf das Modell anwenden, bekomme

23:33.080 --> 23:34.100
ein adaptiertes Modell.

23:34.960 --> 23:39.440
Das gegenteilige Szenario wäre, ich lasse den Sprecher einfach

23:39.440 --> 23:45.460
losdiktieren und während er so losdiktiert, sammle ich Daten über ihn

23:45.460 --> 23:49.160
und mache dadurch im Laufe der Zeit, je mehr Daten ich habe, desto

23:49.160 --> 23:52.600
besser wird meine Transformation, desto mehr Parameter kann meine

23:52.600 --> 23:55.480
Transformation haben, so im Laufe der Zeit wird dann halt meine

23:55.480 --> 23:57.060
Transformation immer besser und besser.

23:57.060 --> 24:00.740
Das wäre die Art der inkrementellen Adaption, dass man je mehr

24:00.740 --> 24:05.740
Trainingsdaten man hat, desto besser, größer, mächtiger wird die

24:05.740 --> 24:06.740
Adaption, die ich schätze.

24:08.080 --> 24:10.480
Dann unüberwacht versus überwacht.

24:11.200 --> 24:14.440
Wieder das erste Szenario, hier ist ein Text, lies mir mal vor.

24:15.320 --> 24:17.280
Dann weiß ich, was der Sprecher vorgelesen hat.

24:17.380 --> 24:21.300
Ich weiß genau, das Audio, das er jetzt spricht, entspricht dem, was

24:21.300 --> 24:21.880
er vorliest.

24:22.000 --> 24:24.300
Ich habe die Transkription dessen, was er gesagt hat.

24:24.800 --> 24:28.020
Oder noch aufwändiger, ich lasse den 15 Minuten vorlesen, das manuell

24:28.020 --> 24:29.300
transkribieren, weiß ich auch.

24:30.200 --> 24:34.080
Oder lasse den 15 Minuten sprechen, transkribiere das manuell, weiß

24:34.080 --> 24:35.100
ich auch, was er gesagt hat.

24:35.160 --> 24:36.140
Ich habe die Supervision.

24:36.260 --> 24:40.460
Ich kann dann überwacht trainieren, ich habe die korrekte Klasse zu

24:40.460 --> 24:41.380
meinen Merkmalsvektoren.

24:42.120 --> 24:45.460
Das zweite Szenario, wo ich ihn einfach mal losdiktieren lasse und ich

24:45.460 --> 24:48.980
höre zu und mache dann meine Adaption im Laufe der Zeit besser, das

24:48.980 --> 24:49.680
ist unüberwacht.

24:50.320 --> 24:51.700
Ich weiß nicht, was der diktiert.

24:52.100 --> 24:55.520
Ich kann nur erkennen mit meinem bisherigen sprecherunabhängigen

24:55.520 --> 24:58.920
Modell, was er vermutlich gesagt hat, was mein Spracherkenner glaubt,

24:58.980 --> 24:59.540
dass es ist.

25:00.280 --> 25:01.440
Das wird Fehler enthalten.

25:02.740 --> 25:05.560
Trotzdem kann ich jetzt aber so tun, als sei das, was ich erkannt

25:05.560 --> 25:09.420
habe, mehr oder minder die korrekte Transkription dessen, was er

25:09.420 --> 25:10.000
gesagt wurde.

25:10.640 --> 25:13.440
Ich kann mir dann zum Beispiel die Konfidenzmaße, über die wir schon

25:13.440 --> 25:18.980
gesprochen hatten, diese wortbasierten Posteriori-

25:18.980 --> 25:22.540
Wahrscheinlichkeiten hernehmen als Konfidenzmaß und damit zum Beispiel

25:22.540 --> 25:25.300
den Einfluss von erkannten Gewichten, wenn ich mal so sehr sicher bin,

25:25.720 --> 25:29.120
dieses Wort habe ich sicher, sicher, sicher richtig erkannt, kann ich

25:29.120 --> 25:32.060
das stärker für die Adaption verwenden als ein Wort, wo ich mir sage,

25:32.140 --> 25:34.060
oh, da bin ich mir überhaupt nicht sicher, ob ich das richtig erkannt

25:34.060 --> 25:34.320
habe.

25:36.300 --> 25:38.240
Dann Training versus Normalisierung.

25:39.500 --> 25:44.300
Man kann diese Adaptionsdaten zum Beispiel für ein EM-Training

25:44.300 --> 25:44.680
verwenden.

25:45.320 --> 25:49.040
Hat halt den Nachteil, dass ich viele Parameter nicht anfassen werde,

25:49.120 --> 25:51.060
für die ich nicht genügend Trainingsdaten habe.

25:52.460 --> 25:53.980
Das ist nicht schlimm, die werden dann nicht verändert.

25:54.100 --> 25:57.020
Das EM-Training ist dann nicht so, dass es sagt, okay, wir werden auf

25:57.020 --> 26:00.260
Null gesetzt, sondern die Daten, die Parameter, für die ich keine

26:00.260 --> 26:03.280
Trainingsdaten gesehen habe, werden in der Regel nicht angefasst.

26:05.360 --> 26:07.540
Und dann irgendwann im Laufe der Zeit, wenn ich das zum Beispiel in

26:07.540 --> 26:10.440
inkrementell durchlaufen lasse, wird die ASR irgendwann

26:10.440 --> 26:11.660
sprecherabhängig.

26:12.680 --> 26:17.620
Schöner ist, wenn ich halt so eine Transformation finde, die die

26:19.820 --> 26:21.520
Variation zwischen den Sprechern minimiert.

26:21.780 --> 26:27.920
Sprich, ich kann zum Beispiel die Eingabe so transformieren, dass ich

26:27.920 --> 26:30.820
sämtliche Sprecherinformationen raustransformiere und die Modelle gar

26:30.820 --> 26:32.700
nicht mehr anfassen muss.

26:33.560 --> 26:35.120
Das nennt man dann Normalisierung.

26:35.260 --> 26:37.980
Man macht das Audio, man macht den Sprecher, den man jetzt bekommt,

26:38.580 --> 26:41.280
den biegt man so um, dass er auf den Standardsprecher, auf den

26:41.280 --> 26:42.160
Normsprecher passt.

26:45.570 --> 26:48.310
Dementsprechend kann ich mir überlegen, was transformiere ich denn?

26:48.910 --> 26:52.730
Transformiere ich die Merkmalsvektoren, die reinkommen, und passe die

26:52.730 --> 26:54.670
so an, dass sie besser auf das Modell passen?

26:55.550 --> 26:57.730
Oder modifiziere ich die Modelle, verschiebe ich die

26:57.730 --> 27:00.930
Mittelwertsvektoren, mache ich irgendwas mit den Varianzen, so dass

27:00.930 --> 27:05.070
sie besser auf das einkommende Signal passen?

27:06.030 --> 27:09.130
Das ist dann die Merkmals- versus die Modelltransformation.

27:14.580 --> 27:17.760
Die Batchadaption ist etwas, das ist eigentlich sehr gut, wenn man ein

27:17.760 --> 27:19.120
System lange Zeit benutzt.

27:19.640 --> 27:20.080
Diktiersystem.

27:20.220 --> 27:24.260
Kann man davon ausgehen, dass das, wenn sich der Sprecher das gekauft

27:24.260 --> 27:26.660
hat und endlich völlig unzufrieden damit ist, dass er das über lange

27:26.660 --> 27:28.940
Zeit lange verwenden wird.

27:29.540 --> 27:32.660
Dann kann man es sich durchaus, dann lohnt sich dieser Trade-off

27:32.660 --> 27:36.840
zwischen Zeit, Aufwand, die es kostet, dass er da 15, 20 Minuten was

27:36.840 --> 27:40.500
vorlesen muss, versus Gewinn, den ich dadurch erziele.

27:40.600 --> 27:43.320
Danach kann er jahrelang ein deutlich besseres System benutzen.

27:44.240 --> 27:47.400
Da kann ich Batchadaption machen.

27:47.660 --> 27:50.380
Ich sollte mir natürlich überlegen, dass die Daten, die ich vorlesen

27:50.380 --> 27:53.640
lasse, die Texte, die ich vorlesen lasse, möglichst gut geeignet sind

27:53.640 --> 27:54.340
für die Adaption.

27:55.000 --> 27:57.840
Das spielt dann so was, sind die Sachen phonetisch balanciert, also

27:57.840 --> 28:00.940
sehe ich möglichst alle Phoneme, sehe ich möglichst alle Polyphone in

28:00.940 --> 28:01.460
irgendeiner Form.

28:01.820 --> 28:04.680
Alle Polyphone werde ich nicht sehen, aber möglichst irgendwie

28:05.840 --> 28:08.460
repräsentativ für möglichst viele Polyphone.

28:09.680 --> 28:14.960
Und in der Regel dann adaptiere ich einmal im Batchmodus, am besten

28:14.960 --> 28:17.660
überwacht auf den Einschreibungsdaten.

28:18.220 --> 28:22.080
Also es macht nichts, macht wenig Sinn zu sagen, hier red mal 15

28:22.080 --> 28:24.860
Minuten frei was rein und dann mache ich eine unüberwachte Adaption,

28:24.980 --> 28:27.360
sondern dann kann ich Ihnen auch sagen, hier liest bitte 15 Minuten

28:27.360 --> 28:30.560
was vor und kann dann überwacht darauf adaptieren, was natürlich dann

28:30.560 --> 28:31.360
auch besser funktioniert.

28:32.940 --> 28:38.880
Wenn ich ein System kürzer verwende, zum Beispiel ich habe fünf Leute,

28:38.980 --> 28:41.020
die treffen sich zu einem Meeting und die haben dann anderthalb

28:41.020 --> 28:44.280
Stunden Meeting und danach möchte ich ein automatisches Transkript

28:44.280 --> 28:48.600
haben, automatischen Protokoll, dann lohnt es sich, dass man so was

28:48.600 --> 28:51.660
wie eine inkrementelle Adaption macht.

28:51.960 --> 28:54.620
Das heißt, je länger jemand dann in der Besprechung spricht, desto

28:54.620 --> 28:58.660
mehr Daten bekomme ich, desto mehr adaptiere ich mich auf ihn und kann

28:58.660 --> 29:00.840
das zum Beispiel nach jedem Satz machen oder wenn ich eine bestimmte

29:00.840 --> 29:04.260
Anzahl, Mindestmenge an Adaptionsdaten gesammelt habe und mache dann

29:04.260 --> 29:08.180
meine Transformation immer wieder weiter, weiter, weiter oder weiter.

29:08.700 --> 29:10.600
In der Regel macht man sowas unüberwacht.

29:12.240 --> 29:16.120
Überwacht macht man das meistens nicht, außer man kann das irgendwie

29:16.120 --> 29:21.560
in den Anwendungsfall reinbauen, so dass man den Benutzer sozusagen

29:21.560 --> 29:22.220
überlistet.

29:23.140 --> 29:27.020
Einfaches Beispiel, ich spiele ein Spiel, so ein Lernspiel zum

29:27.020 --> 29:31.360
Beispiel, wo man Fremdsprache lernen und üben soll und dann spielt er

29:31.360 --> 29:34.960
halt das Spiel, dann lasse ich den jetzt nicht 15 Minuten vorher mal

29:34.960 --> 29:38.560
was vorlesen und sage ihm, pass auf, damit meine Spracherkennung

29:38.560 --> 29:41.160
hinterher im Spiel funktioniert, muss ich dich mal 15 Minuten was

29:41.160 --> 29:41.760
vorlesen lassen.

29:41.840 --> 29:44.280
Sondern man lässt den losspielen, man adaptiert sich auf dem, was er

29:44.280 --> 29:46.380
sagt und dann baut man irgendwo eine Aufgabe ein.

29:46.820 --> 29:50.500
Die Aufgabe lautet, was weiß ich, da sitzt einer, ich bin blind, lese

29:50.500 --> 29:51.520
mir bitte den Text vor.

29:52.300 --> 29:54.800
Und dann auf die Art und Weise kann man dann mehr oder minder das

29:54.800 --> 29:56.120
Ganze zum Beispiel überwacht machen.

29:58.100 --> 30:01.600
Und über solche Tricks kann man halt dann versuchen, Überwachung

30:01.600 --> 30:02.000
reinzubekommen.

30:02.200 --> 30:04.820
Und macht halt das System kontinuierlich besser.

30:07.160 --> 30:10.040
Und dann gibt es noch den dritten Fall, der Autoadaption.

30:10.860 --> 30:14.300
Das ist für eine sehr kurze oder einmalige Benutzung des Autosystems.

30:16.820 --> 30:21.880
Jemand ruft an und möchte Flugtickets reservieren.

30:22.180 --> 30:23.900
Kann man natürlich sagen, ja mach ich doch inkrementell.

30:24.140 --> 30:27.100
Lass ich vorher nicht was vorlesen, sondern den mache ich inkrementell

30:27.100 --> 30:28.060
und lass das loslaufen.

30:28.740 --> 30:32.720
Hat natürlich das Problem, wenn ich dann inkrementell anfange, nach

30:32.720 --> 30:34.480
drei Sätzen ist die ganze Sache eh schon vorbei.

30:35.580 --> 30:40.120
Da ist es dann sinnvoll, dass man, nachdem man eine Audioaufnahme

30:40.120 --> 30:45.800
gemacht hat, vom ersten Satz erkennt, adaptiert und dann nicht zum

30:45.800 --> 30:48.240
nächsten Satz übergeht, sondern gleich die Schleife zurück macht und

30:48.240 --> 30:49.140
das Ding nochmal erkennt.

30:49.960 --> 30:53.040
Damit man schon nach dem ersten Satz ein adaptiertes Modell hat.

30:55.880 --> 31:00.040
Damit man dann nach drei Sätzen schon, hat man zwar dann noch mehr

31:00.040 --> 31:02.120
Material und ist noch besser, aber damit man dann schon nach dem

31:02.120 --> 31:04.820
ersten Satz und nach dem zweiten Satz was hat, warte ich jetzt nicht

31:04.820 --> 31:08.040
erst bis ich zehn Sätze habe und mache die inkrementelle Adaption und

31:08.040 --> 31:10.800
dass dann der elfte Satz adaptiert ist, sondern direkt gleich die

31:10.800 --> 31:12.880
Schleife zurück, erkennen, adaptieren, erkennen.

31:13.340 --> 31:15.940
In der Hoffnung, dass beim zweiten Mal erkennen das Ganze dann schon

31:15.940 --> 31:17.360
besser ist.

31:20.560 --> 31:24.440
Die Idee hatten wir schon, dass man also bei der unüberwachten

31:24.440 --> 31:29.180
Adaption halt einen Erkennungslauf durchführt und dann so tut, als sei

31:29.180 --> 31:33.180
dieser Erkennungslauf die korrekte Transkription, die ich auch bei der

31:33.180 --> 31:37.540
manuellen Transkription bekomme und gewichte gegebenenfalls einzelne

31:37.540 --> 31:40.220
Teile der Transformation noch durch die Konfidenzmaße.

31:41.200 --> 31:45.120
Und bei Überwacht kann ich den entweder den vorgegebenen Text vorlesen

31:45.120 --> 31:48.140
lassen, das nennt man dann Enrollment auf Deutsch Einschreibung oder

31:48.700 --> 31:51.440
eine Möglichkeit wäre natürlich auch, dass der Sprecher Fehler des

31:51.440 --> 31:52.300
Systems korrigiert.

31:53.080 --> 31:57.140
Beispiel Diktatsystem, sollte man meinen, dass der hoffentlich die

31:57.140 --> 31:59.620
Fehler, wenn das System Fehler macht, die irgendwie diktiert nochmal

31:59.620 --> 32:03.740
anders tippt und da kann man auch versuchen, das dann als Überwachung

32:03.740 --> 32:06.540
zu verwenden, wobei man natürlich da auch aufpassen muss, korrigiert

32:06.540 --> 32:09.380
er jetzt, weil das System falsch erkannt hat oder korrigiert er, weil

32:09.380 --> 32:11.000
er sich da vielleicht versprochen hat an der Stelle.

32:11.520 --> 32:15.900
Da muss man dann auch versuchen, ein bisschen zu diagnostizieren,

32:16.000 --> 32:17.080
warum wurde jetzt geändert.

32:19.400 --> 32:23.080
Also Training versus Normalisation haben wir schon gesagt.

32:23.180 --> 32:26.880
Beim Training modifizieren wir nur die Modellparameter, bei denen auch

32:27.940 --> 32:28.820
Adaptionsdaten vorkommen.

32:29.720 --> 32:33.620
Wenn ich unendlich viele Daten habe oder sehr viele Daten habe, wird

32:33.620 --> 32:36.320
es dann irgendwann ein sprecherabhängiges System, weil alle Parameter,

32:36.440 --> 32:38.480
wie beim EM-Training, adaptiert wurden.

32:39.060 --> 32:44.780
Bei der Normalisierung, wenige Daten, aber eine große Transformation,

32:45.060 --> 32:50.740
die trotzdem irgendwie auf alle Daten irgendwie passt, ist natürlich

32:50.740 --> 32:53.160
dann teilweise suboptimal für einige Daten.

32:53.280 --> 32:56.720
Ich generalisiere von Phonemen, die ich gesehen habe in den

32:56.720 --> 33:00.120
Adaptionsdaten, auf andere Phoneme, andere Modelle, die ich nicht

33:00.120 --> 33:03.440
gesehen habe, kann natürlich die Generalisierung unter Umständen nicht

33:03.440 --> 33:05.660
ganz so optimal sein, als hätte ich Daten davon gesehen.

33:08.720 --> 33:13.220
Hier sind Beispiele von einer Merkmalstransformation während einer

33:13.220 --> 33:14.060
Modelltransformation.

33:14.840 --> 33:17.400
Was wir hier sehen, sind erstmal wieder die

33:18.160 --> 33:20.820
Emissionswahrscheinlichkeiten eines HMM-Zustands als GMM.

33:21.620 --> 33:24.460
Ich habe hier K Gaussglocken, ich habe hier die Gewichte der

33:24.460 --> 33:28.360
Gaussglocken, hier vorne den Normalisierungsfaktor und dann E hoch

33:31.920 --> 33:34.920
Merkmalsvektor minus Mittelwertsvektor mal Inversen der

33:34.920 --> 33:35.920
Kovarianzmatrix.

33:36.820 --> 33:41.140
Bei der Merkmalstransformation habe ich jetzt eine Funktion, die auf

33:41.140 --> 33:47.020
dem Merkmal X, auf dem extrahierten Merkmalsvektor X operiert und den

33:47.020 --> 33:49.620
irgendwie entsprechend anpasst, sodass es besser wird.

33:51.500 --> 33:54.900
Umgekehrt bei der Modelltransformation habe ich diese

33:56.880 --> 34:00.360
Adaptionsfunktion F, die auf den Modellen operiert.

34:00.860 --> 34:05.300
Hier zum Beispiel gibt es diese Funktion Fj, die auf den Mittelwerten

34:05.300 --> 34:06.980
operiert, die die Mittelwerte anfasst.

34:07.840 --> 34:11.840
Genauso könnte ich mir eine andere Funktion F anschauen, die zum

34:11.840 --> 34:14.540
Beispiel die Kovarianzmatrix adaptiert.

34:15.040 --> 34:18.360
Oder ich könnte mir noch eine dritte Funktion F anschauen, die die

34:18.360 --> 34:20.380
Gewichte irgendwie transformiert.

34:22.660 --> 34:25.800
Diese Funktion F hier ist global.

34:26.240 --> 34:30.520
Es gibt eine Funktion F, die auf alle Merkmale angewandt wird und

34:30.520 --> 34:33.100
nicht für unterschiedliche Merkmalsvektoren, unterschiedliche

34:33.100 --> 34:34.920
Transformationsmatrixen.

34:35.680 --> 34:39.260
Hier gibt es mehrere Funktionen.

34:39.340 --> 34:40.860
Deswegen haben die einen Index Fj.

34:42.500 --> 34:50.560
Dieser Index j geht von 0 bis einem Wert n, der deutlich kleiner ist

34:50.560 --> 34:53.980
als die Anzahl der Parameter, die ich transformiere.

34:54.620 --> 35:00.740
Ich habe hier K Gaussglocken pro Modell und ich habe vielleicht Groß m

35:00.740 --> 35:06.320
Modelle, dann habe ich K mal m mögliche Mittelwertsvektoren.

35:07.460 --> 35:10.280
Und dieses j sollte natürlich deutlich, deutlich, deutlich, deutlich

35:10.280 --> 35:11.600
kleiner sein als K mal m.

35:12.600 --> 35:16.380
Wenn ich 10.000 Modelle habe, dann sollte das j vielleicht zum

35:16.380 --> 35:20.220
Beispiel 100 sein, damit ich dann mit deutlich weniger Parametern

35:20.220 --> 35:25.020
dieses, dass ich deutlich weniger Funktionen schätzen muss und die

35:25.020 --> 35:27.680
Funktion selber sollte dann selber auch noch deutlich weniger

35:27.680 --> 35:32.340
Parameter haben, die es zu schätzen gilt als dieses K mal m, sodass

35:32.340 --> 35:37.620
dieses j mal Anzahl Parameter vom F deutlich kleiner ist als die

35:37.620 --> 35:39.800
Anzahl der Parameter, die ich transformieren möchte.

35:41.920 --> 35:46.860
Generell gilt, mit so einer Modelltransformation kann ich jederzeit

35:46.860 --> 35:51.380
eine Merkmalstransformation simulieren.

35:53.060 --> 35:58.040
Also wenn ich hier zum Beispiel bei dem x eine Funktion habe, die auf

35:58.040 --> 36:01.760
das x immer 10 drauf addiert, dann kann ich genauso gut eine Funktion

36:01.760 --> 36:05.540
haben, die halt hier die 10 abzieht.

36:06.540 --> 36:09.240
Ist das gleiche.

36:09.460 --> 36:12.460
Und je nachdem, was ich da halt mit dem x global mache, kann ich das

36:12.460 --> 36:17.280
Ganze auch auf dem x sein lassen und entsprechend auf den Parametern

36:17.280 --> 36:19.900
in der Regel anwenden.

36:24.520 --> 36:28.860
Frage ist, wann wende ich die Modelltransformation an?

36:30.540 --> 36:34.300
Ich habe halt eine Trainingsphase und ich habe eine Erkennungsphase.

36:34.940 --> 36:39.220
Während des Trainings der Modelltransformation oder während des

36:39.220 --> 36:45.000
Trainings schätze ich mein Modell, das ich für die Erkennung anwende.

36:46.040 --> 36:50.460
Und dann während der Erkennung selber, wo komme ich jetzt Sprache

36:50.460 --> 36:57.120
rein, schätze eine Modelltransformation, die ich dann anwende und

36:57.120 --> 37:00.660
wobei die Schätzung der Modelltransformation in der Regel von diesen

37:00.660 --> 37:01.680
Modellen auch abhängt.

37:02.260 --> 37:05.840
Und dann werden die Modelle transformiert und gehen in den Erkenner

37:05.840 --> 37:06.100
rein.

37:06.240 --> 37:08.980
Das heißt, die Verbindung wird durchgeschnitten und bei der

37:10.320 --> 37:13.380
Merkmalstransformation ist es entsprechend auch so, dass hier die

37:13.380 --> 37:16.240
Merkmale durch so eine Transformation durchgeschleust werden, die die

37:16.240 --> 37:17.100
Erkennung dann kommt.

37:17.580 --> 37:21.060
Und die Schätzung dieser Merkmalstransformation ist in der Regel auch

37:21.060 --> 37:23.200
abhängig von den Modellen.

37:28.520 --> 37:31.700
Jetzt hat man natürlich die Frage, man muss irgendwie eine Optimierung

37:31.700 --> 37:31.960
haben.

37:32.040 --> 37:34.780
Ich habe also eine Transformation, da habe ich Parameter, ich kann

37:34.780 --> 37:38.320
jetzt die Parameter irgendwie frei wählen und die Frage ist, was sind

37:38.320 --> 37:40.220
gute Parameter, was sind schlechte Parameter?

37:40.700 --> 37:42.280
Brauche ich wieder ein Optimierungskriterium?

37:42.660 --> 37:46.260
Genauso wie ich beim HMM-Training auch ein Kriterium brauche, das mir

37:46.260 --> 37:50.260
sagt, was sind gute Parameter, was sind schlechte Parameter, brauche

37:50.260 --> 37:50.960
ich das hier auch.

37:51.340 --> 37:55.600
Beim HMM hatten wir gesagt, gute Parameter eines HMMs sind diejenigen,

37:55.940 --> 37:58.840
die die Trainingsdaten mit möglichst großer Wahrscheinlichkeit

37:58.840 --> 37:59.940
generieren.

38:00.620 --> 38:03.080
Das hatten wir die Maximum-Likelihood-Schätzung genannt.

38:03.920 --> 38:06.960
Und das können wir auch bei der Schätzung dieser Transformation

38:06.960 --> 38:11.140
natürlich anwenden, dass wir also die Testdaten, die wir reinkommen,

38:12.740 --> 38:16.900
durch die Transformation durchschleusen und dann dafür sorgen, dass

38:16.900 --> 38:20.300
die Transformation auf den Modellen am Ende dafür sorgt, dass die

38:20.300 --> 38:24.460
transformierten Modelle die einkommenden Merkmale mit möglichst größer

38:24.460 --> 38:27.240
Wahrscheinlichkeit hervorbringen.

38:28.120 --> 38:31.900
Man kann versuchen, direkt mit Distanzmaßen zu arbeiten.

38:32.940 --> 38:37.200
Zum Beispiel kann man versuchen, irgendwie die Merkmale so zu

38:37.200 --> 38:41.380
transformieren, dass die Distanz zwischen den Durchschnittsmerkmalen,

38:41.380 --> 38:44.720
die ich im Training verwendet habe und den Merkmalen, die jetzt

38:44.720 --> 38:46.560
reinkommen, möglichst klein wird.

38:47.820 --> 38:51.780
Oder ich habe wieder ein Maximum-Aposteriori-Kriterium, wie insgesamt

38:51.780 --> 38:55.040
bei der Spracherkennung auch, dass ich die wahrscheinlichsten

38:55.040 --> 38:57.400
Parameter finde, gegeben meine Daten.

38:57.840 --> 39:01.960
Das hängt dann natürlich wieder von dem Fall ab, wie ich das schätzen

39:01.960 --> 39:02.220
kann.

39:04.480 --> 39:09.900
Diese Art der Schätzung hat halt wieder den Nachteil, dass wenn ich

39:09.900 --> 39:13.320
keine Daten habe, keine Parameter geändert werden.

39:14.460 --> 39:17.940
Wenn ich nur wenig Daten habe, werden in der Regel nur die Parameter

39:17.940 --> 39:21.900
geändert, für die ich wenig Daten habe und für die, die ich keine

39:21.900 --> 39:23.700
Daten habe, werden die Parameter nicht geändert.

39:23.880 --> 39:30.260
Die haben keinerlei Einfluss auf dieses P von Param gegebenen Daten.

39:31.760 --> 39:34.800
Je mehr Daten ich dann im Laufe der Zeit reinkomme, desto mehr nähere

39:34.800 --> 39:37.440
ich mich dann in der Regel auch der Maximum-Likelihood-Schätzung an.

39:46.570 --> 39:51.210
Wir werden uns jetzt mal ein paar unterschiedliche Adaptionsmethoden

39:52.870 --> 39:53.790
anschauen, beispielshaft.

39:55.470 --> 39:58.270
Wir müssen uns also überlegen, was transformieren wir?

39:58.470 --> 39:59.490
Merkmale oder Modelle?

40:00.570 --> 40:03.470
Dann, was für eine Distanz, was für eine Korrespondenz?

40:03.630 --> 40:07.790
Wollen wir Unterschiede zwischen Sprache und Sprache klein machen?

40:07.970 --> 40:10.650
Wollen wir Unterschiede machen zwischen den Merkmalen der Sprache, die

40:10.650 --> 40:13.850
reinkommt, und den Modellen, den adaptierten Modellen möglichst klein

40:13.850 --> 40:14.270
machen?

40:14.970 --> 40:15.910
Wie transformieren wir?

40:16.050 --> 40:17.750
Haben wir eine parametrische Transformation?

40:17.970 --> 40:18.610
In der Regel ja.

40:18.950 --> 40:23.070
Wie viele Parameter spendieren wir denn dieser Transformation?

40:23.690 --> 40:25.990
Und dann, wie schätzen wir die Parameter der Transformation?

40:27.470 --> 40:31.950
Und was wir uns anschauen werden, sind folgende Transformationen.

40:32.130 --> 40:34.290
An erster Stelle steht so etwas, das nennt sich eine

40:36.590 --> 40:40.190
Vokaltraktlängentransformation, die von der Motivation, Idee dahinter

40:40.190 --> 40:44.190
ist, ich schätze die Länge des Vokaltraktes und nummiere meine

40:44.190 --> 40:48.050
Merkmale entsprechend zurück auf Standard-Vokaltraktlängen.

40:49.290 --> 40:53.110
Die Länge des Vokaltraktes ist genau ein Parameter, den ich schätzen

40:53.110 --> 40:53.350
muss.

40:54.530 --> 40:59.530
Die andere Möglichkeit ist, dass ich meine reinkommenden Merkmale um

40:59.530 --> 41:01.910
konstanten Offset verschiebe.

41:02.410 --> 41:05.570
Hat dann halt so viele Parameter wie die Dimension des

41:05.570 --> 41:06.310
Merkmalsvektors.

41:06.350 --> 41:07.610
Für jede Dimension brauche ich einen.

41:08.690 --> 41:13.330
Oder ich kann zum Beispiel linear transformieren, eine lineare

41:13.330 --> 41:14.210
Abbildung durchführen.

41:14.390 --> 41:18.870
Das heißt, Merkmale mit einer d x d Matrix multiplizieren und dann

41:18.870 --> 41:21.810
noch dieses d große Offset drauf addieren.

41:22.170 --> 41:24.370
Dann habe ich d Quadrat plus d Parameter.

41:25.510 --> 41:29.350
Statt das einmal global zu haben, kann ich auch unterschiedliche

41:29.350 --> 41:33.650
Modelle, unterschiedliche Transformationen, lineare Transformationen

41:33.650 --> 41:34.170
spendieren.

41:34.430 --> 41:37.670
Angenommen, ich habe n unterschiedliche lineare Transformationen und

41:37.670 --> 41:40.790
habe irgendeine Abbildung, die mir sagt, für den Parameter bitte die

41:40.790 --> 41:44.390
Transformation, für den Parameter die Transformation, dann habe ich da

41:44.390 --> 41:46.150
entsprechend n x d Quadrat plus d.

41:47.130 --> 41:52.590
Oder wenn ich nur die Mittelwerte verschiebe, statt linear

41:52.590 --> 41:55.930
transformiere und davon insgesamt m habe, dann hätte ich nur sowas wie

41:55.930 --> 41:56.450
m x d.

41:57.430 --> 42:01.190
Und anhand dieser Auflistung kann man schon sehen ungefähr, welche

42:01.190 --> 42:03.430
Transformation braucht wie viel Daten.

42:04.410 --> 42:08.950
Die offensichtlich ganz wenig, die immer noch ein bisschen wenig, aber

42:08.950 --> 42:09.690
schon ein bisschen mehr.

42:10.190 --> 42:11.270
Da wird schon deutlich mehr.

42:11.370 --> 42:14.730
Da haben wir plötzlich die Dimension, die schon im Quadrat reinfließt,

42:14.770 --> 42:17.330
aber absolut gesehen ist es wenig.

42:18.070 --> 42:21.650
Hier skaliert es dann mit der Anzahl der Transformationen, die ich

42:21.650 --> 42:21.870
habe.

42:22.350 --> 42:25.110
Das hier offensichtlich am meisten bei gleicher Anzahl

42:25.110 --> 42:29.750
Transformationen hat das hier den größten konstanten Faktor und hier

42:29.750 --> 42:31.850
einen kleineren konstanten Faktor bei gleicher Anzahl

42:32.330 --> 42:32.770
Transformationen.

42:33.070 --> 42:35.670
Da muss man sich dann auch überlegen, wie viele Transformationen nehme

42:35.670 --> 42:38.170
ich denn und kann das dann entsprechend abhängig machen, auch wieder

42:38.170 --> 42:42.650
von der Größe, von der Menge der Adaptionsdaten.

42:45.010 --> 42:47.610
Das einfachste ist die Vokaltraktlängen

42:51.490 --> 42:52.250
Nummierung.

42:52.250 --> 42:57.010
Prinzipiell gilt, die Grundfrequenz ist nur abhängig von der Länge der

42:57.010 --> 42:57.490
Stimmbänder.

42:57.810 --> 42:58.910
Die betrachten wir hier nicht.

42:59.690 --> 43:04.790
Was aber abhängig ist von der Länge des Vokaltraktes, ist da, wo die

43:04.790 --> 43:07.310
Resonanzfrequenzen verstärkt auftreten.

43:08.070 --> 43:12.570
Die harmonischen, die Oberschwingungen sind natürlich abhängig davon,

43:13.850 --> 43:15.290
welche Grundfrequenz ich habe.

43:15.590 --> 43:18.830
Vielfache der Grundfrequenzen sind die harmonischen, aber einige

43:18.830 --> 43:23.270
dieser harmonischen werden halt besonders stark verstärkt.

43:23.490 --> 43:24.630
Das sind dann die Resonanzen.

43:25.270 --> 43:28.610
Und wo diese Resonanzen liegen, beim Wievielten der Oberschwingung,

43:29.290 --> 43:31.770
das hängt dann ab von der Länge des Vokaltraktes.

43:32.270 --> 43:36.350
Das ist dann das Beispiel große Flöte, Bassflöte, kleine Flöte,

43:36.670 --> 43:37.330
Piccolo -Flöte.

43:38.150 --> 43:39.610
Das ist das, was hier passiert.

43:39.750 --> 43:42.750
Und dementsprechend Menschen mit langem Vokaltrakt werden eher

43:42.750 --> 43:46.190
niedrige Resonanzfrequenzen haben und werden die Verwandten eher

43:46.190 --> 43:47.890
weiter nach unten verschoben haben.

43:48.250 --> 43:51.670
Umgekehrt Menschen mit kurzem Vokaltrakt werden eher hohe

43:51.670 --> 43:54.650
Resonanzfrequenzen haben, irgendwo weiter nach oben geschoben.

43:55.430 --> 44:00.070
Und die Idee ist jetzt, dass man das Spektrum verzerrt.

44:01.270 --> 44:04.450
Und da muss man ein paar Nebenbedingungen beachten.

44:05.550 --> 44:09.770
Ich male das hier parallel nochmal an der Tafel aus, dann sieht man

44:09.770 --> 44:13.810
besser, wie das da im Bild zustande kommt, was die Idee von dem Bild

44:13.810 --> 44:14.090
ist.

44:18.800 --> 44:22.860
Wie das schon auf der Folie steht, die Vokaltraktlängennomierung ist

44:22.860 --> 44:24.920
etwas, das ich im Spektrum anwende.

44:26.240 --> 44:30.440
Sprich, die Vokaltraktlängennomierung wird nach der Berechnung der DFT

44:32.080 --> 44:32.760
angewandt.

44:35.380 --> 44:41.140
Dementsprechend hier steht nur x als Merkmal und ein transformiertes

44:41.140 --> 44:41.860
Merkmal x.

44:44.400 --> 44:49.020
Für uns ist das natürlich dann entsprechend die Frequenz, die aus dem

44:49.020 --> 44:49.860
Spektrum rauskommt.

44:50.320 --> 44:52.300
Wir schreiben das Ganze hier mal kontinuierlich auf.

44:52.380 --> 44:55.060
In Wirklichkeit hat man natürlich hier diskreten Frequenzbänder.

44:55.840 --> 45:02.220
Hier unten, auf der Achse ist die x-Achse, trage ich sinnigerweise

45:02.220 --> 45:05.060
dann mein Merkmal x auf, das ich habe.

45:06.200 --> 45:10.180
Das Merkmal x geht von 0 Hertz bis... wie viel Hertz?

45:10.240 --> 45:11.100
Was muss da oben stehen?

45:14.980 --> 45:16.420
Bis wie viel Hertz geht mein Merkmal?

45:22.520 --> 45:24.340
Wovon hängt das ab, was da oben steht?

45:27.540 --> 45:28.860
Genau, von der Abtastrate.

45:30.060 --> 45:32.580
Abtastrate ist 16.000, also steht da oben...

45:33.440 --> 45:36.180
genau, sagt mir das Shannon-Theorien.

45:37.240 --> 45:38.520
Okay, nehmen wir mal 8000 an.

45:41.020 --> 45:42.760
f halber, wenn f die Grenzfrequenz ist.

45:44.480 --> 45:49.500
Und was ich jetzt machen möchte, ist, dass ich Frequenzen, die ich

45:49.500 --> 45:53.280
hier habe, verschiebe, auf andere Frequenzen abbilde.

45:55.180 --> 45:57.900
Das ist mein x-Strich, mein adaptiertes.

45:57.980 --> 46:02.220
Ich ordne Frequenzen hier, andere Frequenzen dazu und schiebe die dann

46:02.220 --> 46:02.920
entsprechend rüber.

46:04.380 --> 46:05.760
Jetzt habe ich zwei Nebenbedingungen.

46:07.200 --> 46:12.640
Der Merkmalsvektor, den ich rausbekomme, der geht wieder von 0 bis

46:12.640 --> 46:13.580
8000 Hertz.

46:19.920 --> 46:24.920
Wenn ich jetzt adaptiere, wenn ich von 0 Hertz, irgendwo habe ich bei

46:24.920 --> 46:29.380
0 Hertz irgendwas und das soll jetzt adaptiert werden, dann geht man

46:29.380 --> 46:32.620
in der Regel davon aus, dass was bei 0 Hertz war, das bleibt bei 0

46:32.620 --> 46:32.860
Hertz.

46:33.500 --> 46:36.560
Das heißt, der erste Datenpunkt in meiner Funktion, die man jetzt

46:36.560 --> 46:40.740
abbildet, welche Frequenz wird auf welche abgebildet, sagt hier, was

46:40.740 --> 46:42.920
bei 0 Hertz war, soll bitteschön bei 0 Hertz bleiben.

46:44.720 --> 46:47.000
Andersherum habe ich nicht mit dem Problem, wenn ich sagen würde, was

46:47.000 --> 46:52.680
bei 0 Hertz war, das soll hier bei 50 Hertz rauskommen, was mache ich

46:52.680 --> 46:55.720
denn dann hier damit von 0 bis 50 Hertz?

46:56.080 --> 46:57.200
Da kann ich dann nichts reinschreiben.

46:57.800 --> 46:58.860
Das will man vermeiden.

47:01.020 --> 47:02.840
Genauso bei den 8000 Hertz.

47:03.300 --> 47:06.880
Die 8000 Hertz kann ich jetzt nicht irgendwie hochschieben auf 9000

47:06.880 --> 47:10.320
Hertz, weil die Merkmalsvektoren, die rauskommen sollen, sollen jetzt

47:10.320 --> 47:12.680
nicht in der Länge vergrößert oder verkleinert sein, die sind immer

47:12.680 --> 47:16.100
noch gleich viele, haben gleich viele Koeffizienten, soll also auch

47:16.100 --> 47:17.940
auf 8000 Hertz bleiben.

47:18.160 --> 47:19.840
Das heißt, ich kann sie nicht höher machen.

47:20.240 --> 47:24.180
Wenn ich sie jetzt niedriger mache, wie fülle ich denn dann den oberen

47:24.180 --> 47:24.820
Teil wieder auf?

47:25.020 --> 47:26.020
Das will man auch vermeiden.

47:26.840 --> 47:32.620
Also wird 8000 Hertz auch auf 8000 Hertz abgebildet.

47:32.620 --> 47:35.060
Das sind die beiden Nebenbedingungen meiner Transformation.

47:36.080 --> 47:38.820
Und was jetzt zwischendrin passiert, kann beliebig sein.

47:38.900 --> 47:42.260
Ich kann jetzt hier irgendeine beliebige Funktion einzeichnen, die

47:42.260 --> 47:43.860
Frequenzen auf Frequenzen abbildet.

47:44.340 --> 47:48.160
Und da die Idee ist, dass ich im Prinzip sowas wie so einen globalen

47:48.160 --> 47:51.440
Shift habe, der aber kein Shift ist, weil 0 Hertz und 8000 Hertz sind

47:51.440 --> 47:54.960
oben festgetackert, ist das sowas wie eine Art Gummiband, das ich hin

47:54.960 --> 47:55.620
und her schiebe.

47:56.360 --> 47:59.000
Und dieses Gummiband wird an einer Stelle festgehalten.

48:01.300 --> 48:05.940
Zum Beispiel sage ich, hier die 4000 Hertz

48:10.560 --> 48:17.200
sollen auf 2000 abgebildet werden und der Rest bleibt linear.

48:18.380 --> 48:25.020
Dann kann ich hier zwei Linien zeichnen und habe dann hier so eine

48:25.020 --> 48:26.280
stückweise lineare Abbildung.

48:26.820 --> 48:30.580
Hier wird entmäß dieser Linie, werden Frequenzen auf Frequenzen

48:30.580 --> 48:33.100
abgebildet, also diese Frequenz auf diese, diese auf diese, bis

48:33.100 --> 48:34.600
schließlich 4000 Hertz.

48:35.340 --> 48:39.700
4000 Hertz wird auf 2000 Hertz abgebildet und danach hole ich nach und

48:39.700 --> 48:40.940
nach immer weiter auf wieder.

48:41.620 --> 48:45.560
Dieses Runterdrücken wird weniger dadurch und hinterher wird wieder

48:45.560 --> 48:47.600
8000 Hertz auf 8000 Hertz abgebildet.

48:48.420 --> 48:52.620
Wenn ich also 4000 Hertz auf 2000 Hertz abbilde, dann sage ich also,

48:52.860 --> 48:59.800
okay, das Ganze ist, ich sehe gerade auf der Folie steht es, nicht

48:59.800 --> 49:04.240
richtig, 4000 Hertz wird auf 2000 Hertz abgebildet, dann sage ich,

49:04.620 --> 49:09.040
okay, hier ist ein Sprecher, der spricht eigentlich was mit 4000

49:09.040 --> 49:10.900
Hertz, das eigentlich bei 2000 Hertz sein soll.

49:10.900 --> 49:14.020
Das heißt, dessen Formanten sind nach oben geschoben, der hat eine

49:14.020 --> 49:17.100
besonders hohe Stimme, das heißt, die Formanten müssen runtergeschoben

49:17.100 --> 49:19.520
werden, damit sie wieder auf den Mittelsprecher passen.

49:20.340 --> 49:23.240
Umgekehrt, wenn ich hier jemanden hätte, der 4000 Hertz hat und das

49:23.240 --> 49:27.020
Ganze soll auf 6000 Hertz abgebildet werden, mache ich dann halt

49:27.020 --> 49:33.190
entsprechend so eine stückweise Abbildung, dann ist das also einer,

49:33.490 --> 49:36.990
der hat Sachen, die sind zu weit unten, die müssen, damit es zum

49:36.990 --> 49:39.330
Durchschnitt passt, wieder nach oben geschoben werden, das ist das

49:39.330 --> 49:45.150
eine mit einem sehr langen Vokaltrakt, einer Stimme, die die Formanten

49:45.150 --> 49:46.230
zu weit unten hat.

49:48.150 --> 49:51.290
Und das ist so eine stückweise lineare Funktion, die hat genau einen

49:51.290 --> 49:56.910
Parameter, nämlich, oder die hat zwei Parameter, erstmal per se,

49:57.490 --> 49:59.310
nämlich die Position dieses Punktes.

50:00.870 --> 50:03.110
Jetzt hatten wir vorhin auf der Folie gesagt, die hat nur einen

50:03.110 --> 50:03.630
Parameter.

50:04.250 --> 50:07.590
Und warum hat die nur einen Parameter?

50:09.390 --> 50:12.450
Diese Dimensionen lege ich vorher fest, die verändern ja nicht, ich

50:12.450 --> 50:16.950
nicht, sondern ich sage immer bei der Hälfte, zum Beispiel bei 4000

50:16.950 --> 50:20.970
Hertz, bestimme ich, ob hoch oder runter geschoben werden soll, dann

50:20.970 --> 50:23.770
sind die 4000 Hertz fest und das einzige, was ich jetzt noch bestimme

50:23.770 --> 50:28.190
als Parameter ist, auf was werden denn die 4000 Hertz abgebildet.

50:29.030 --> 50:33.510
Und danach habe ich automatisch diese zwei linearen Stücke, mit der

50:33.510 --> 50:36.110
ich das Spektrum verschiebe.

50:38.350 --> 50:42.190
Und bei diesem festgehaltenen Wert, um wie viel ich den verschiebe,

50:43.030 --> 50:48.530
das nennt man den sogenannten Warping-Faktor, hier mit Alpha

50:48.530 --> 50:48.970
hingeschrieben.

50:49.210 --> 50:53.710
Das sagt mir, ob ich den Vokaltrakt, ob der zu lang ist oder ob er zu

50:53.710 --> 50:54.230
kurz ist.

51:02.350 --> 51:04.210
Frage ist, wie schätze ich jetzt das Alpha?

51:05.030 --> 51:06.950
Und da habe ich zwei Möglichkeiten.

51:07.230 --> 51:09.810
Das eine ist wissensgetrieben und das andere ist datengetrieben.

51:10.510 --> 51:17.810
Bei der wissensgetriebenen habe ich ein Wissen, dass ich schätze, wo

51:17.810 --> 51:21.950
sind meine Formanten und Grundfrequenz und berechne das Verhältnis von

51:21.950 --> 51:23.270
Formanten zu Grundfrequenz.

51:23.850 --> 51:27.510
Das heißt, ich weiß, liegen die Formanten im Verhältnis zur

51:27.510 --> 51:32.490
Grundfrequenz eher hoch oder eher niedrig und aus diesem Verhältnis

51:32.490 --> 51:35.510
kann ich die Verzerrung ableiten und dann mein Alpha direkt als Formel

51:35.510 --> 51:35.810
schätzen.

51:37.490 --> 51:41.710
Oder ich kann es so machen, dass ich das Ganze mit Maximum-Likelihood

51:41.710 --> 51:42.390
-Schätzung habe.

51:43.070 --> 51:46.050
Also angenommen, ich habe eine überwachte Adaption, ich weiß, was

51:46.050 --> 51:46.790
gesprochen wurde.

51:47.550 --> 51:52.050
Dann kann ich jetzt ausrechnen, okay, bei diesem Alpha werden die

51:52.050 --> 51:55.590
Adaptionsdaten von dem Modell mit der und der Wahrscheinlichkeit

51:55.590 --> 51:56.210
hervorgebracht.

51:56.830 --> 52:00.450
Und dann kann ich mein Alpha so variieren, dass diese

52:00.450 --> 52:03.310
Wahrscheinlichkeit, mit der die Adaptionsdaten hervorgebracht wurden,

52:03.410 --> 52:04.190
maximiert werden.

52:05.550 --> 52:07.950
Jetzt könnte man sich überlegen, ja, da muss ich halt Funktionen

52:07.950 --> 52:10.190
ableiten auf den Trainingsdaten und Parameter schätzen.

52:10.290 --> 52:13.530
Das ist nur ein Parameter und der ist auch nicht sonderlich hibbelig,

52:13.650 --> 52:15.610
was jetzt den genauen Parameter angeht.

52:16.010 --> 52:20.130
Da probiere ich einfach 10 durch oder probiere ich halt 20 durch und

52:20.130 --> 52:23.070
wähle mir dann den aus, für den es am besten funktioniert.

52:23.370 --> 52:26.190
Nennt sich dann das Ganze als ganze Gitter-Suche.

52:32.770 --> 52:33.610
Bringt das was?

52:33.730 --> 52:37.750
Ich meine, das ist ja eine relativ billige, relativ einfache Art der

52:37.750 --> 52:38.270
Adaption.

52:40.270 --> 52:42.330
Hat man halt mal ausprobiert in

52:46.790 --> 52:50.850
Experimenten und zwar auf eine unüberwachte Art und Weise.

52:52.650 --> 52:59.850
Ich habe eine Aufnahme von einem Satz, ich dekodiere den Satz, erhalte

52:59.850 --> 53:04.170
so eine Hypothese H, tue so, als sei diese Hypothese das tatsächlich

53:04.170 --> 53:08.670
Gesagte und finde dann mit so einer Gitter-Suche einen Alpha, das am

53:08.670 --> 53:12.490
besten funktioniert und dann dekodiere ich noch mal mit diesem neuen

53:12.490 --> 53:12.870
Alpha.

53:14.050 --> 53:15.930
Und das Ganze dann im Batch-Modus.

53:16.090 --> 53:18.850
Das heißt, ich habe einen Sprecher, den dekodiere ich einmal komplett

53:18.850 --> 53:23.890
durch, erhalte viele Hypothesen, bestimme wahrscheinlichste Alpha auf

53:23.890 --> 53:26.950
all diesen Hypothesen, dekodiere den gesamten Sprecher noch mal einmal

53:26.950 --> 53:27.210
neu.

53:28.210 --> 53:32.670
Und wenn man sich das anschaut, auf zwei verschiedenen Sätzen, einmal

53:32.670 --> 53:36.110
Switchboard unterhalte dich über ein Gegebenensthema, Call Home

53:36.110 --> 53:40.390
unterhalte dich mit deiner Familie, worüber du gerade Lust hast, dann

53:40.390 --> 53:45.410
sieht man, ohne VTLN zu VTLN gewinnt man immer dazu.

53:45.670 --> 53:51.510
In diesem Fall 0,9 Prozent, in diesem Fall sogar 3,3 Prozent.

53:52.770 --> 53:59.210
Sprich, das hier sind so was wie 8 Prozent relativ, mit der ich meine

54:02.350 --> 54:03.310
Fehlerrate senke.

54:03.750 --> 54:11.850
Hier sind das immer noch hin noch so was wie 3 Prozent relativ, mit

54:11.850 --> 54:12.770
der ich meine

54:15.830 --> 54:16.790
Fehlerrate senke.

54:17.330 --> 54:18.570
Das ist schon relativ viel.

54:18.730 --> 54:21.090
Ich meine, das ist, muss man gucken, dadurch, dass man nur so einen

54:21.090 --> 54:24.670
einzigen Parameter schätzt, einen einzigen zusätzlichen Parameter in

54:24.670 --> 54:28.550
einem System, das eh schon 10.000, 20.000, 30.000 Parameter hat,

54:28.990 --> 54:33.050
reduziere ich meine Wortfehlerrate mal so gerade locker flockig um 3

54:33.050 --> 54:36.470
bis 8 Prozent relativ, je nachdem, wie schwierig und wie groß der

54:36.470 --> 54:37.090
Mismatch war.

54:37.650 --> 54:42.530
Das ist also eine Methode, die recht beliebt ist, recht gut

54:42.530 --> 54:48.890
funktioniert und natürlich auch den riesen Vorteil hat, dass sie mit

54:48.890 --> 54:50.150
sehr, sehr wenig Daten auskommt.

54:50.710 --> 54:53.490
Sprich, die kann ich auch dann schon anwenden, wenn ich nur sehr, sehr

54:53.490 --> 54:56.470
wenig Trainingsdaten, Adaptionsdaten für meinen Sprecher habe.

54:56.470 --> 55:00.350
Zum Beispiel in diesem, wo auch einer nur kurz mal so ein

55:00.350 --> 55:03.290
Auskunftssystem anruft, vielleicht so fünf, sechs Sätze überhaupt noch

55:03.290 --> 55:03.770
einspricht.

55:06.190 --> 55:09.610
Von der Theorie her kann man sich jetzt ein bisschen überlegen, wie

55:09.610 --> 55:11.230
sehen denn diese Alphas so aus?

55:12.290 --> 55:17.170
Das Alpha kann man ja datengetrieben schätzen, wie hier, oder man kann

55:17.170 --> 55:20.150
sich überlegen, das muss in Relation stehen zur Grundfrequenz zu

55:20.150 --> 55:24.790
Formanten und letztendlich hängt das ab direkt, irgendwie direkt

55:24.790 --> 55:26.550
korreliert mit der Vokaltraktlänge.

55:27.030 --> 55:29.430
Jetzt kann man sich überlegen, okay, wie müssen die Vokaltraktlängen

55:29.430 --> 55:30.590
aussehen?

55:31.110 --> 55:34.090
Bei den Stimmbändern hat man das schon gesagt, Männer eher hoch,

55:34.190 --> 55:38.710
Frauen eher niedrige Stimmen, Männer haben halt lange Stimmbänder,

55:38.830 --> 55:42.050
weil durch Testosteron wächst das, Frauen haben halt kürzere

55:42.050 --> 55:45.890
Stimmbänder und dann variiert das irgendwie über so einen geschlechter

55:45.890 --> 55:49.290
- spezifischen Mittelwert drumherum und wenn irgendwas in der Natur

55:49.290 --> 55:52.710
variiert, dann ist das meistens normal verteilt, weil halt die

55:52.710 --> 55:54.750
Normalverteilung sehr häufig in der Natur gefunden ist.

55:54.910 --> 55:58.150
Das heißt also, Stimmbänderlängen kann man sehen, sind so normal

55:58.150 --> 56:00.290
verteilt für Frauen und für Männer, jeweils so ein

56:00.290 --> 56:02.590
geschlechterspezifischen Mittelwert, so mit Normalverteilung.

56:02.930 --> 56:05.110
Hatten wir gesehen, glaube ich, sogar schon ein Bild.

56:06.190 --> 56:08.630
Das gleiche Argument gilt natürlich auch für die Vokaltraktlängen.

56:09.230 --> 56:14.410
Auch wieder Länge des Vokaltraktes, genauso wie Körpergröße ist halt

56:14.410 --> 56:17.390
zwischen den Geschlechtern gleich ungleich verteilt, hängt auch wieder

56:17.390 --> 56:19.550
mit Hormonen zu tun, Wachstumshormonen etc.

56:21.110 --> 56:25.310
Und dann Männer haben also in der Regel eher einen langen Vokaltrakt,

56:25.430 --> 56:29.470
Frauen eher einen kürzeren Vokaltrakt, dann kann man für Männer und

56:29.470 --> 56:32.630
für Frauen halt einen Mittelwert bilden, über beide Mittelwerte wieder

56:32.630 --> 56:36.350
eine Gaussglocke legen und kommt dann ungefähr so der Wahrheit nahe.

56:37.410 --> 56:40.230
Im umgekehrten Schluss müsste das bedeuten, wenn ich so diese

56:40.230 --> 56:45.150
Warpfaktoren, diese Alphas auf einer großen Menge Daten schätze, dann

56:45.150 --> 56:47.730
sollte ich ja auch diese beiden Gaussglocken entsprechend

56:47.730 --> 56:48.330
wiederfinden.

56:49.190 --> 56:51.670
Hat man dann entsprechend mal gemacht, die Sprecher nach Männern und

56:51.670 --> 56:54.790
Frauen unterteilt und sich dann abgetragen, wir sehen so diese

56:55.670 --> 57:00.950
Warpfaktoren aus und dann sieht man genau schön diese bimodale

57:00.950 --> 57:01.510
Verteilung.

57:02.210 --> 57:06.190
Hier sieht man, ist so ein gewisser Überlapp, was die Vokal, die

57:06.190 --> 57:07.170
Warpfaktoren angeht.

57:07.250 --> 57:10.450
Das ist ein Histogramm, hier unten abgetragene Warpfaktor, da oben

57:10.450 --> 57:13.310
abgetragen, wie viele Sprecher haben denn diesen jeweiligen

57:13.310 --> 57:13.970
Warpfaktor.

57:14.350 --> 57:17.870
Und dann sieht man halt hier die mit dem niedrigen Warpfaktor, die mit

57:17.870 --> 57:21.690
dem hohen Warpfaktor und hier sieht man, sind so Säulen

57:21.690 --> 57:22.590
übereinandergelegt.

57:22.710 --> 57:26.490
Das ist da, wo die beiden Geschlechter sich entsprechend überschneiden

57:26.490 --> 57:27.350
bei den Warpfaktoren.

57:27.830 --> 57:30.710
Und man sieht, dass man das, was man aus der Theorie erwarten würde,

57:31.310 --> 57:35.450
sehr schön auch in der Praxis dann auch bei den Warpfaktoren

57:35.450 --> 57:36.030
wiederfindet.

57:36.370 --> 57:39.810
Das heißt also, dieser Warpfaktor, den wir uns hier überlegt haben,

57:39.910 --> 57:43.730
mit diesem einen Gummiband und diesem stückweise linearen Warpen der

57:43.730 --> 57:48.450
Frequenzen, scheint das, was wir erwarten würden von den

57:48.450 --> 57:50.450
Vokaltraktlängen her, auch gut abzubilden.

57:51.670 --> 57:53.250
Scheint man nichts falsch gemacht zu haben.

57:54.770 --> 57:58.130
Eine Frage, die man sich auch stellen kann, ist natürlich, okay, hier

57:58.130 --> 58:04.350
ist jetzt so ein Punkt festgelegt worden und der Punkt ist halt, die

58:04.350 --> 58:07.190
beiden Punkte Anfang und Ende sind fest und hier haben wir einen Punkt

58:07.190 --> 58:10.790
festgelegt, da haben wir festgelegt hier, das kann man doch auch noch

58:10.790 --> 58:11.590
komplizierter machen.

58:11.690 --> 58:14.610
Das ist jetzt stückweise linear mit zwei Stücken.

58:15.390 --> 58:19.750
Das kann man in der Tat auch komplizierter machen.

58:19.750 --> 58:21.650
Das ist die Art und Weise, wie wir es machen.

58:22.870 --> 58:24.610
IBM zum Beispiel macht sowas.

58:26.730 --> 58:27.530
Die haben zwei,

58:33.040 --> 58:35.340
die können so etwas machen.

58:36.660 --> 58:39.360
Die haben also zwei Punkte festgelegt und bekommen entsprechend dann

58:39.360 --> 58:40.780
zwei Faktoren raus.

58:41.180 --> 58:43.360
Wenn die eine Gittersuche machen, müssen die halt dann nicht zehn

58:43.360 --> 58:45.400
Werte ausprobieren, sondern zehn mal zehn Werte.

58:46.480 --> 58:47.900
Ist aber auch noch erträglich.

58:48.820 --> 58:50.380
Bringt aber nicht so viel, lohnt sich nicht.

58:57.950 --> 59:00.950
Noch ein Wort zur inkrementellen Adaption.

59:03.290 --> 59:09.590
Wenn man so eine Adaptionstechnik hat, wie die VTLN, hat man immer das

59:09.590 --> 59:10.210
gleiche Problem.

59:10.330 --> 59:13.470
Ich brauche erstmal Daten, um die Adaption zu schätzen und wenn ich

59:13.470 --> 59:16.410
dann meine Erkennung mit den adaptierten Daten machen will, muss ich

59:16.410 --> 59:18.170
nochmal einen zweiten Erkennungsdurchlauf machen.

59:18.750 --> 59:21.310
Wenn man das jetzt so im Batchmodus macht, heißt das, man muss den

59:21.310 --> 59:23.530
gesamten Batch zweimal durchgehen.

59:23.870 --> 59:27.590
Also die Codin-Zeit mal zwei plus noch die Zeit für das Schätzen der

59:27.590 --> 59:29.170
Transformation.

59:29.690 --> 59:31.930
Verlangsamt natürlich das gesamte System deutlich.

59:33.090 --> 59:36.770
Oder man macht halt diese inkrementelle Adaption, dass man auch

59:36.770 --> 59:40.190
wirklich nur einmal durch alle Daten durchgeht und die Adaption halt

59:40.190 --> 59:42.190
im Laufe der Zeit immer besser und besser wird.

59:43.830 --> 59:48.010
Hat natürlich den Nachteil, dass man die Sätze am Anfang mit

59:48.010 --> 59:50.510
schlechteren Modellen erkennt, als die Sätze am Ende hin.

59:52.210 --> 59:54.930
Wenn man es sich nicht leisten kann, zweimal über die Daten drüber zu

59:54.930 --> 59:57.370
gehen, weil man zum Beispiel nicht Batch verarbeitet, sondern in so

59:57.370 --> 01:00:01.250
einem interaktiven Dialogsystem sich befindet, muss man halt es so

01:00:01.250 --> 01:00:01.510
machen.

01:00:01.950 --> 01:00:05.370
Oder wenn man halt will, dass die Rechenzeit nicht so stark leidet,

01:00:05.870 --> 01:00:08.910
dass ich also nicht Ewigkeiten Zeit habe, diesen Batch- Datensatz

01:00:08.910 --> 01:00:11.330
durchzugehen, dass ich es mir halt nicht leisten kann, zweimal über

01:00:12.290 --> 01:00:13.890
alle Testdaten, die ich habe, drüber zu gehen.

01:00:13.990 --> 01:00:14.590
Das dauert zu lange.

01:00:20.000 --> 01:00:20.440
Okay,

01:00:27.660 --> 01:00:29.220
also Ansatz ist sprecherabhängig.

01:00:30.220 --> 01:00:34.800
Es ist hier schlecht aufgeschrieben.

01:00:35.160 --> 01:00:36.320
Also das ist dieses Inkrementelle.

01:00:36.660 --> 01:00:38.740
Jetzt gibt es noch einen anderen Trick, den man machen kann.

01:00:38.900 --> 01:00:43.100
Wenn ich es mir nicht leisten kann, zweimal über die Daten drüber zu

01:00:43.100 --> 01:00:46.600
gehen, kann ich zum Beispiel auch so einen Trick machen, gerade bei

01:00:46.600 --> 01:00:52.000
solchen relativ billigen Ansätzen, dass ich mehrere adaptierte Modelle

01:00:52.000 --> 01:00:54.460
oder mehrere Adaptionen vorrätig habe.

01:00:55.100 --> 01:01:00.240
Zum Beispiel kann ich parallel mit zehn verschiedenen oder fünf

01:01:00.240 --> 01:01:03.520
verschiedenen Warp-Parametern arbeiten.

01:01:04.740 --> 01:01:09.400
Dann, die kann ich parallel dekodieren lassen.

01:01:09.600 --> 01:01:13.120
Angenommen, ich mache normalerweise eine Gitter-HC-Auflösung 10.

01:01:13.620 --> 01:01:15.600
Jetzt will ich nicht zehn parallel dekodieren lassen.

01:01:15.780 --> 01:01:17.520
Ich will nur drei parallel dekodieren lassen.

01:01:17.900 --> 01:01:20.620
Nehme ich mir drei Warp- Parameter her und lasse die dekodieren.

01:01:20.620 --> 01:01:23.520
Einer ist so im Durchschnitt genau die Hälfte.

01:01:23.580 --> 01:01:24.920
1,0 wird gar nichts gemacht.

01:01:25.060 --> 01:01:27.100
Einer ist der Durchschnitt der männlichen, einer ist der Durchschnitt

01:01:27.100 --> 01:01:28.900
der weiblichen Sprecher.

01:01:29.980 --> 01:01:31.080
Dann die dekodieren.

01:01:31.320 --> 01:01:34.120
Habe ich nach dem ersten Dekodierungsdurchlauf drei verschiedene

01:01:36.280 --> 01:01:40.140
Erkennungsergebnisse mit drei unterschiedlichen Scores von den

01:01:40.140 --> 01:01:41.080
Wahrscheinlichkeiten her.

01:01:41.860 --> 01:01:44.280
Entscheide ich mich von den drei, natürlich von denen mit dem höchsten

01:01:44.280 --> 01:01:44.540
Score.

01:01:45.400 --> 01:01:48.220
Das wird vielleicht noch nicht der perfekte Warp-Faktor gewesen sein

01:01:48.220 --> 01:01:49.140
für diese Person.

01:01:50.100 --> 01:01:52.780
Vielleicht ist es zwar ein Mann, aber der weicht ein bisschen von dem

01:01:52.780 --> 01:01:55.880
Durchschnitt ab, aber ich habe schon mal mit etwas deutlich Besserem

01:01:55.880 --> 01:01:59.080
erkannt als dem Nuller, wo ich gar nichts mache.

01:01:59.660 --> 01:02:03.100
Und dann im nächsten Mal kann ich dann entsprechend ausgehen von

01:02:03.100 --> 01:02:08.440
diesem Parameter, der beim ersten Mal in dieser groben Gitter-Suche

01:02:08.440 --> 01:02:12.600
der Beste war, um den drumherum dann nochmal genauer absuchen.

01:02:13.220 --> 01:02:16.480
Auf die Art und Weise kann ich auch die Zeit dafür reduzieren für die

01:02:16.480 --> 01:02:16.960
Gitter -Suche.

01:02:16.960 --> 01:02:21.040
Dass ich also nicht immer das volle Zehnergitter absuche, sondern ich

01:02:21.040 --> 01:02:24.600
gucke erstmal, wo liegt der grob, höher, mittel, niedriger und dann

01:02:24.600 --> 01:02:28.020
suche ich dann in den darauffolgenden Sätzen nur noch so fein

01:02:28.020 --> 01:02:31.200
aufgelöst um diesen vorher grob gefundenen Bereich ab.

01:02:33.100 --> 01:02:35.940
Und auf die Art und Weise kann ich dann halt die Sachen entsprechend

01:02:35.940 --> 01:02:37.520
besser machen.

01:02:40.600 --> 01:02:47.400
Dann ist die Frage, wenn ich so incrementell adaptiere, sammle ich ja

01:02:47.400 --> 01:02:50.420
die Adaptionsdaten, werden immer mehr, immer mehr und die

01:02:50.420 --> 01:02:54.000
Transformation ist in der Regel so gestaltet, dass wenn ich immer neue

01:02:54.000 --> 01:02:57.720
Adaptionsdaten hinzunehme, adaptiere ich die Transformation und zwar

01:02:57.720 --> 01:03:01.560
auf die Art und Weise, dass das, was hinterher rauskommt, so wäre, als

01:03:01.560 --> 01:03:04.600
hätte ich es auf allen Daten geschätzt.

01:03:04.740 --> 01:03:09.600
Kann man zum Beispiel bei so einer einfachen Suche für den Vokaltrakt

01:03:09.600 --> 01:03:11.540
-Längen - Parameter ganz einfach machen.

01:03:11.840 --> 01:03:15.580
Ich muss halt ein paar alte Statistiken vorrätig halten, nämlich wie

01:03:15.580 --> 01:03:19.000
hoch war die Wahrscheinlichkeit mit dem alten Warpfaktor auf den

01:03:19.000 --> 01:03:23.000
bisher gesehenen Daten und wie viele Samples, wie viele Frames waren

01:03:23.000 --> 01:03:24.280
denn die bisher gesehenen Daten.

01:03:24.700 --> 01:03:27.260
Und dann bekomme ich 10 dazu, kann darauf wieder die

01:03:27.260 --> 01:03:30.460
Wahrscheinlichkeit schätzen für die neuen Parameter und werde das dann

01:03:30.460 --> 01:03:33.680
entsprechend gewichtet, der Menge der Daten mit den bisherigen

01:03:33.680 --> 01:03:37.420
Parametern zusammen mischen, bekomme neuen Parameter raus, der genau

01:03:37.420 --> 01:03:41.400
so aussieht, als hätte ich on batch alles bekommen inklusive der neuen

01:03:41.400 --> 01:03:45.040
Adaptionsdaten und darauf den Parameter geschätzt.

01:03:46.400 --> 01:03:49.740
Jetzt kann man sagen, beim Vokaltrakt-Länge scheint das ja sinnvoll zu

01:03:49.740 --> 01:03:52.840
sein, also dass sich die Länge des Vokaltraktes des Sprechers spontan

01:03:52.840 --> 01:03:55.900
ändert, während er da sitzt, ist eher unwahrscheinlich.

01:03:56.620 --> 01:03:59.860
Also der wird jetzt nicht während der Benutzung des Systems wachsen,

01:04:00.260 --> 01:04:02.320
wenn es jetzt nicht gerade ein Kind ist, das ein Diktiersystem über

01:04:02.320 --> 01:04:03.240
viele Jahre verwendet.

01:04:04.440 --> 01:04:07.400
Bei anderen Adaptionen, wie zum Beispiel sich auf den Kanal

01:04:07.400 --> 01:04:10.920
konzentrieren oder auf Umgebungsrauschen oder Positionen, Mund zum

01:04:10.920 --> 01:04:12.800
Mikrofon, kann sich das durchaus ändern.

01:04:13.000 --> 01:04:16.600
Also wenn er längere Zeit am Telefon ist, kann sich der Kanal, die

01:04:16.600 --> 01:04:18.140
Charakteristik des Kanals ändern.

01:04:18.480 --> 01:04:22.400
Wenn er sich in Raum bewegt, ist die Raumcharakteristik anders, je

01:04:22.400 --> 01:04:25.480
nachdem an welcher Stelle er steht, je nachdem wie er den Kopf dreht

01:04:25.480 --> 01:04:25.780
etc.

01:04:26.400 --> 01:04:29.580
Das heißt, es kann durchaus sinnvoll sein, das nicht so zu machen,

01:04:29.700 --> 01:04:33.320
dass man immer alle Adaptionsdaten betrachtet, die man bisher bekommen

01:04:33.320 --> 01:04:37.400
hat, sondern dass man ältere Adaptionsdaten vergisst oder schlechter,

01:04:37.400 --> 01:04:38.380
geringer gewichtet.

01:04:38.920 --> 01:04:42.280
Das entsprechend nennt sich dann Sliding Window, gleitendes Fenster.

01:04:43.220 --> 01:04:46.580
Und das hier ist zum Beispiel so ein Beispiel von Gewichtung.

01:04:47.260 --> 01:04:52.040
Null, aktueller Zeitpunkt, die Zeit in der Vergangenheit, das Gewicht,

01:04:52.160 --> 01:04:55.340
mit dem die Daten einfließen und je älter die Daten sind, desto

01:04:55.340 --> 01:05:00.880
geringeres Gewicht bekommen sie für den Einfluss und die Schätzung der

01:05:00.880 --> 01:05:03.620
aktuellen Transformation.

01:05:08.660 --> 01:05:12.460
Bei der Vokal-Trakt-Längen-Nummierung muss man so ein paar kleinere

01:05:12.460 --> 01:05:15.440
Tricks beachten, die sich aus der Praxis ergeben haben.

01:05:16.460 --> 01:05:19.900
Ein Phänomen, das man sieht, ist zum Beispiel das Phänomen der

01:05:19.900 --> 01:05:22.580
davonlaufenden Faktoren.

01:05:23.420 --> 01:05:26.720
Wenn man das Ganze mal macht für relativ viele Sprecher, wird man

01:05:26.720 --> 01:05:29.580
feststellen, dass man immer mal wieder Sprecher hat.

01:05:30.300 --> 01:05:35.980
Da wird halt geschätzt, der VTL-Faktor hoch und dann setzt man den VTL

01:05:35.980 --> 01:05:38.760
-Faktor hoch und beim nächsten Mal sucht man wieder in diesem Bereich

01:05:38.760 --> 01:05:42.200
darum ab und dann setzt er den wieder noch höher und beim nächsten Mal

01:05:42.200 --> 01:05:43.980
setzt er noch höher und so weiter und so fort.

01:05:44.060 --> 01:05:46.760
Und wenn man sich die Adaption anschaut, will aus irgendeinem Grund

01:05:46.760 --> 01:05:51.000
die Adaption, sagt das Maximum-Likelihood-Kriterium, den Vokal-Trakt

01:05:51.000 --> 01:05:53.700
-Faktor praktisch gegen unendlich sitzen.

01:05:55.060 --> 01:05:56.620
Geht natürlich nicht, will man nicht.

01:05:57.480 --> 01:05:58.600
Ist offensichtlich falsch.

01:05:58.680 --> 01:06:04.580
Die Wortfehlerrate wird danach auch schlechter, auch wenn das Maximum

01:06:04.580 --> 01:06:06.080
-Likelihood -Kriterium sagt, ist besser.

01:06:07.580 --> 01:06:12.740
Das heißt, man muss auf alle Fälle die Vokal-Trakt-Warping-Faktoren

01:06:12.740 --> 01:06:16.440
auf einen sinnvollen Bereich, den man durch Ausprobieren feststellen

01:06:16.440 --> 01:06:20.100
muss, beschränken und dann nicht aus diesem Bereich die Sachen

01:06:20.100 --> 01:06:21.000
herauslaufen lassen.

01:06:24.180 --> 01:06:28.180
Wir haben jetzt hier die VTLn immer nur während des Testens

01:06:28.180 --> 01:06:30.160
angewendet, in dem vorhergehenden Beispiel.

01:06:30.300 --> 01:06:33.700
Das heißt, ich habe mein System erstmal trainiert, ohne VTLn und dann

01:06:33.700 --> 01:06:40.360
im Testen warpe ich dann das reinkommende Material so, dass es diesem

01:06:40.360 --> 01:06:42.720
Durchschnitt, den die Modelle während des Trainings gesehen haben,

01:06:42.840 --> 01:06:43.300
entspricht.

01:06:43.840 --> 01:06:45.840
Man kann das natürlich auch während des Trainings machen.

01:06:46.560 --> 01:06:49.460
Man kann schon während des Trainings das reinkommende Audio von den

01:06:49.460 --> 01:06:54.120
Trainingssprechern so normieren, dass es dem Durchschnitt entspricht.

01:06:54.260 --> 01:06:56.460
Das hätten sie Einheits-Vokal-Trakt-Länge.

01:06:57.360 --> 01:07:00.700
Und das macht die Sache dann natürlich noch mal deutlich besser, wenn

01:07:00.700 --> 01:07:03.640
ich dann solche Modelle habe, die schon während des Trainings geworbte

01:07:03.640 --> 01:07:07.880
Merkmale gesehen haben und dann während des Testens die Merkmale auch

01:07:07.880 --> 01:07:11.100
entsprechend geworbt waren, sodass sie gut dem Modell passen, bekomme

01:07:11.100 --> 01:07:13.000
ich noch mal zusätzliche Gewinne.

01:07:14.360 --> 01:07:15.700
Umgekehrt funktioniert das nicht.

01:07:20.400 --> 01:07:24.520
Es funktioniert nicht, wenn ich aber nur während des Trainings Vokal

01:07:24.520 --> 01:07:27.920
-Trakt -Längen-Normierung einschalte, aber das während des Testens

01:07:27.920 --> 01:07:28.120
nicht.

01:07:28.580 --> 01:07:31.680
Dann stürzt der Erkenner ab, dann funktioniert, passt das, was man

01:07:31.680 --> 01:07:36.500
jetzt reinkommt im Test, nicht mehr auf das Normierte.

01:07:36.500 --> 01:07:38.940
Hintergrund ist klar, wenn ich Vokal-Trakt-Länge-Normierung während

01:07:38.940 --> 01:07:41.620
des Trainings ausschalte, bekomme ich ein Modell, das hat alle

01:07:41.620 --> 01:07:43.460
möglichen Vokal-Trakt- Längen schon mal gesehen.

01:07:44.280 --> 01:07:47.480
Wenn ich es während des Trainings einschalte, ist das für das Modell

01:07:47.480 --> 01:07:51.480
so, als hätte es nur Sprecher gesehen, die so Einheits-Vokal-Trakt-

01:07:51.480 --> 01:07:53.500
Länge haben, die alle die gleiche Vokal-Trakt-Länge haben.

01:07:53.700 --> 01:07:55.940
Und dann bekomme ich Testsprecher, die plötzlich ganz unterschiedliche

01:07:55.940 --> 01:07:58.580
Vokal -Trakt-Länge haben, die dann nicht mehr auf diesen einen

01:07:58.580 --> 01:08:00.580
Pseudosprecher, den das Modell gesehen hat, passt.

01:08:01.800 --> 01:08:05.160
Habe ich also einen deutlichen Mismatch.

01:08:05.160 --> 01:08:08.480
Dann bei der inkrementellen Adaption wird man feststellen, dass der

01:08:08.480 --> 01:08:11.460
Vokal -Trakt-Längen- Faktor, wenn er mal einmal robust geschätzt

01:08:11.460 --> 01:08:13.100
wurde, änderte sich ja nicht mehr.

01:08:13.580 --> 01:08:16.800
Das heißt, nach einer gewissen Zeit, wenn ich Pi mal Daumen genügend

01:08:17.340 --> 01:08:19.600
Trainingsmaterial gesehen habe, kann ich die Neuschätzung einfach

01:08:19.600 --> 01:08:22.880
abschalten und den bisher geschätzten Parameter immer weiterverwenden.

01:08:24.460 --> 01:08:25.400
Genau, und das hatten wir schon.

01:08:25.560 --> 01:08:28.880
Also es gibt durchaus auch komplexere Warping- Funktionen, um dieses

01:08:28.880 --> 01:08:34.720
Warping noch komplexer zu machen, bis hin zu, statt solcher stückweise

01:08:34.720 --> 01:08:39.240
stetigen Funktionen, gibt es irgendwelche kontinuierlichen Funktionen

01:08:39.240 --> 01:08:42.160
mit einer bestimmten Anzahl an Parameter, die so eine glatte

01:08:42.160 --> 01:08:44.520
kontinuierliche Abbildung machen.

01:08:49.560 --> 01:08:55.340
Dann ein weiteres Beispiel, das man sich anschauen kann, ist die

01:08:55.340 --> 01:08:56.700
sogenannte MAP-Adaption.

01:08:58.200 --> 01:09:01.340
Wir hatten schon gesagt, MAP kann ein mögliches Kriterium sein und das

01:09:01.340 --> 01:09:06.380
ist auch ein Kriterium, das man unter diesem Namen auch bei der

01:09:06.380 --> 01:09:08.440
Adaption des akustischen Modells findet.

01:09:10.980 --> 01:09:14.380
Wir maximieren jetzt also nicht nach Maximum Likelihood, die

01:09:14.380 --> 01:09:16.040
Wahrscheinlichkeit, dass das Modell die Merkmalsvektoren

01:09:16.420 --> 01:09:20.320
hervorgebracht hat, sondern wir maximieren die Wahrscheinlichkeit der

01:09:20.320 --> 01:09:22.360
Parameter, gegeben die Merkmalsvektoren.

01:09:23.620 --> 01:09:27.860
Das ist natürlich wieder schwierig, wird wieder zerlegt, gemäß Bayes

01:09:27.860 --> 01:09:32.440
in Maximum Likelihood-Schätzung mal eine a priori Wahrscheinlichkeit

01:09:32.440 --> 01:09:33.940
der Parameter.

01:09:34.780 --> 01:09:37.840
Und jetzt müssen wir irgendwie die a priori Wahrscheinlichkeit der

01:09:37.840 --> 01:09:38.700
Parameter schätzen.

01:09:39.900 --> 01:09:40.660
Schwierig.

01:09:43.340 --> 01:09:46.760
Plus, was sind denn überhaupt die Parameter?

01:09:48.900 --> 01:09:57.140
Wenn man sich anschaut, was passiert, dann kann man das sehen als eine

01:09:57.140 --> 01:09:59.680
Beschreibung dafür, dass wir halt das Problem haben, dass wir nicht

01:09:59.680 --> 01:10:04.600
für alle Parameter immer genügend Trainingsdaten haben, sonst könnten

01:10:04.600 --> 01:10:07.240
wir ja gleich ein exklusives Modell für den Sprecher trainieren,

01:10:07.340 --> 01:10:09.940
sondern bestimmte Parameter haben wir Trainingsdaten gesehen, für

01:10:09.940 --> 01:10:10.440
andere nicht.

01:10:11.120 --> 01:10:15.140
Bei der Map-Schätzung kann man jetzt also entsprechend die

01:10:15.140 --> 01:10:18.260
Trainingsdaten adaptieren, für die wir Trainingsdaten gesehen haben

01:10:18.260 --> 01:10:19.340
und für die anderen nicht.

01:10:20.220 --> 01:10:24.300
Und die Idee dahinter ist halt, dass man wieder eine Maximum

01:10:24.300 --> 01:10:27.860
Likelihood -Schätzung auf seinen Adaptionsdaten durchführt, also

01:10:27.860 --> 01:10:30.680
Forward -Backward-Training, Viterbi-Training, ganz normaler AIM

01:10:30.680 --> 01:10:31.260
-Algorithmus.

01:10:32.040 --> 01:10:36.340
Das Ganze dann gewichtet allerdings mit der a priori

01:10:36.340 --> 01:10:40.300
Wahrscheinlichkeit der Parameter und man kann dann auf diese Art und

01:10:40.300 --> 01:10:44.680
Weise den Einfluss der Adaptionsdaten schätzen.

01:10:44.920 --> 01:10:48.180
Man kann auf die Art und Weise, so wie man Sprachmodelle miteinander

01:10:48.180 --> 01:10:51.620
interpoliert, jetzt akustische Modelle miteinander interpolieren.

01:10:52.900 --> 01:10:55.460
Einfaches Beispiel, angenommen, wir haben eine große Menge

01:10:57.380 --> 01:11:01.100
Trainingsdaten und eine kleine Menge Adaptionsdaten, die jetzt passend

01:11:01.100 --> 01:11:03.020
sind auf den Sprecher, auf die Domäne, was auch immer.

01:11:04.200 --> 01:11:09.640
Die Trainingsdaten mache ich zur EM-Iteration und angenommen, ich bin

01:11:09.640 --> 01:11:13.530
in so einer EM-Iteration, habe die hinreichenden Statistiken geschätzt

01:11:14.800 --> 01:11:17.880
mithilfe des Forward-Backward- Algorithmus und will jetzt den Update

01:11:17.880 --> 01:11:19.760
machen, den Maximization-Schritt.

01:11:20.620 --> 01:11:24.880
Dann werden da ja diese gezählten, statt zählen mit Wahrscheinlichkeit

01:11:24.880 --> 01:11:27.140
gewichteten Statistiken zusammenaddiert und geteilt.

01:11:28.060 --> 01:11:31.880
Und das Ganze kann ich genauso gut machen auf den Adaptionsdaten.

01:11:32.340 --> 01:11:37.820
Kann ich auch mit dem Modell, mit dem ich jetzt diese Iteration, den E

01:11:37.820 --> 01:11:40.940
-Schritt gerechnet habe auf den Trainingsdaten, mit diesem Modell kann

01:11:40.940 --> 01:11:43.280
ich auch den E-Schritt rechnen auf den Adaptionsdaten.

01:11:43.940 --> 01:11:47.200
Und jetzt habe ich Statistiken akkumuliert auf den Trainingsdaten im E

01:11:47.200 --> 01:11:52.480
-Schritt und ich habe Statistiken akkumuliert auf den Adaptionsdaten

01:11:52.480 --> 01:11:57.200
im E-Schritt und muss jetzt den Maximierungsschritt zu durchführen und

01:11:57.200 --> 01:12:00.520
kann jetzt, bevor ich den Maximierungsschritt einmal durchführe, diese

01:12:00.520 --> 01:12:04.700
beiden Statistiken im E-Schritt, Trainingsdaten, Adaptionsdaten

01:12:04.700 --> 01:12:08.880
zusammenmischen, indem ich sie einfach mit so einer A priori

01:12:08.880 --> 01:12:12.980
Wahrscheinlichkeit, zum Beispiel Gewichte, kann dann den

01:12:12.980 --> 01:12:16.460
Adaptionsdaten mehr oder weniger starkes Gewicht geben, kann die

01:12:16.460 --> 01:12:17.720
Sachen zusammenmischen.

01:12:18.380 --> 01:12:24.460
Da, wo ich keine Daten für Parameter, wo ich keine Daten in den

01:12:24.460 --> 01:12:28.600
Adaptionsdaten gesehen habe, da wird halt nix drauf addiert auf die

01:12:28.600 --> 01:12:31.380
Statistiken aus den Trainingsdaten auf dem E-Schritt.

01:12:32.360 --> 01:12:34.780
Die werden also rein auf den Trainingsdaten geschätzt.

01:12:35.260 --> 01:12:39.940
Da, wo ich sowohl im Training als auch im Adaptionsdaten gesehen habe

01:12:39.940 --> 01:12:42.760
für die Modelle, werden halt die Statistiken gemäß eines Gewichtes

01:12:42.760 --> 01:12:46.060
zusammengemischt und dann mache ich den Maximierungsschritt und

01:12:46.060 --> 01:12:49.340
bekomme dann einen neuen Parameterset raus, der halt auch von den

01:12:49.340 --> 01:12:53.200
Adaptionsdaten her gewichtete Statistiken mit reingemischt hat.

01:12:53.860 --> 01:12:57.220
Hat den großen Nachteil, ich muss ja jetzt noch irgendwie dieses

01:12:57.220 --> 01:12:58.720
Interpolationsgewicht bestimmen.

01:13:00.020 --> 01:13:05.180
Das kann ich zum Beispiel einfach ausprobieren, indem ich Gitter

01:13:05.180 --> 01:13:10.260
suche, zehn verschiedene Interpolationsgewichte, 0,1 bis 1,0, 0 bis 1

01:13:10.260 --> 01:13:15.200
,0, irgendwas ausprobiere, zusammenmische, bekomme dann zehn

01:13:15.200 --> 01:13:18.200
verschiedene Modelle raus, lasse einen Erkennungsdurchlauf auf

01:13:18.200 --> 01:13:21.440
Development -Daten durchführen, wenn ich diese habe und kann dann

01:13:21.440 --> 01:13:24.880
daraus entsprechend dann mich entscheiden, für welches

01:13:25.480 --> 01:13:27.700
Interpolationsgewicht ich haben will.

01:13:28.700 --> 01:13:33.560
Von der Beschreibung hört man schon, das kann inkrementell während des

01:13:34.340 --> 01:13:37.360
Einsatzes nicht funktionieren, das kann insbesondere unüberwacht nicht

01:13:37.360 --> 01:13:41.680
funktionieren, weil ich nämlich mich ja für einen dieser

01:13:41.680 --> 01:13:45.580
Interpolationsgewichte entscheiden muss anhand der Wortfehlerrate und

01:13:45.580 --> 01:13:48.100
das geht nur, wenn ich eine Wortfehlerrate bestimmen kann auf diesen

01:13:48.100 --> 01:13:52.240
Development -Daten, geht also nur, wenn ich da eine Überwachung habe.

01:13:52.740 --> 01:13:55.720
Das geht auch nicht für ganz wenige Daten, weil ich brauche ja

01:13:55.720 --> 01:14:00.040
Development -Daten, die nichts mit den Adaptionsdaten, die nicht in

01:14:00.040 --> 01:14:03.120
den Adaptionsdaten sind, aber genauso sind wie die Adaptionsdaten, um

01:14:03.120 --> 01:14:07.260
die Wortfehlerrate zu bestimmen, plus die sollten schon hinreichend

01:14:07.260 --> 01:14:09.520
genug sein, dass auch wenigstens eine signifikante Anzahl an

01:14:09.520 --> 01:14:11.280
Parametern geändert wird.

01:14:11.800 --> 01:14:15.380
Das heißt, so etwas ist was für eine Situation während des Trainings,

01:14:16.040 --> 01:14:22.200
wenn ich halt viele Domänen fremde akustische Modelldaten habe und

01:14:22.200 --> 01:14:27.320
relativ viele Adaptionsdaten, aber nicht genug Adaptionsdaten, um nur

01:14:27.320 --> 01:14:30.440
auf den Adaptionsdaten zu trainieren, genauso wie beim Sprachmodell.

01:14:30.980 --> 01:14:33.740
Und ich dann die beiden Sachen entsprechend zusammenmischen möchte.

01:14:37.620 --> 01:14:44.860
Dann gibt es eine sehr beliebte Adaptionsmethode, die diese Idee der

01:14:44.860 --> 01:14:48.760
linearen Transformation der akustischen Modelle auffasst.

01:14:49.500 --> 01:14:53.200
Und diese Adaptionsmethode nennt sich Maximum Likelihood Linear

01:14:53.200 --> 01:14:56.900
Regressions, eine Modelladaptionsmethode, wo ich mittels einer

01:14:56.900 --> 01:15:00.860
linearen Transformation die Mittelwerte und die Kovarianzmatrizen

01:15:01.380 --> 01:15:02.280
anpassen möchte.

01:15:04.460 --> 01:15:09.640
Ich habe hier wieder meine Emissionswahrscheinlichkeit,

01:15:13.140 --> 01:15:18.980
dass ich einen bestimmten Vektor imitiert habe, mitgegeben, dass ich

01:15:18.980 --> 01:15:21.500
mich in einem bestimmten HMM-Zustand i befinde.

01:15:23.140 --> 01:15:25.560
Und diese Wahrscheinlichkeit wird jetzt zu einer neuen

01:15:25.560 --> 01:15:29.880
Wahrscheinlichkeit, Emissionswahrscheinlichkeit pj, die ist irgendwie

01:15:29.880 --> 01:15:31.600
gekoppelt mit irgendwas.

01:15:32.900 --> 01:15:35.060
Und jetzt ist die Frage, womit ist die gekoppelt?

01:15:35.720 --> 01:15:40.520
Die ist gekoppelt mit einer Adaption einer linearen Adaption j.

01:15:41.320 --> 01:15:47.760
Und was da passiert ist, dass hier, man kann sich jetzt hier in

01:15:47.760 --> 01:15:54.080
Gedanken da noch überflüssige Klammern drum herum denken, wegen

01:15:54.080 --> 01:15:57.920
Assoziativgesetze sind sie überflüssig, aber von der Idee der Adaption

01:15:57.920 --> 01:16:04.220
her sind hier Klammern drum, dass der Mittelwert erst mit einer Matrix

01:16:04.220 --> 01:16:07.680
multipliziert wird und dann noch ein Offset abgezogen wird.

01:16:08.720 --> 01:16:13.740
Und genauso gibt es eine Transformationsmatrix sj, das diese

01:16:16.240 --> 01:16:18.680
Kovarianzmatrix entsprechend transformiert.

01:16:22.620 --> 01:16:25.580
Dieser Parameter j ist abhängig von dem i.

01:16:25.860 --> 01:16:29.980
Das heißt, für welchen Zustand ich mich befinde, der schreibt mir in

01:16:29.980 --> 01:16:34.360
irgendeiner geeigneten Art und Weise vor, welche der verschiedenen

01:16:34.360 --> 01:16:40.440
Adaptionsmatrizen aj und bj und sj ich denn verwenden soll.

01:16:42.140 --> 01:16:44.480
Das sind die verschiedenen Adaptionsklassen.

01:16:44.620 --> 01:16:47.780
Jedes Modell wird einer Adaptionsklasse zugeordnet.

01:16:48.660 --> 01:16:53.160
Die Anzahl der Adaptionsklassen ist abhängig von der Anzahl der

01:16:53.160 --> 01:16:54.660
Adaptionsdaten.

01:16:55.380 --> 01:16:59.220
Viele Adaptionsdaten, viele Adaptionsklassen, viele Parameter, wenig

01:16:59.220 --> 01:17:01.780
Adaptionsdaten, wenig Adaptionsklassen.

01:17:02.980 --> 01:17:09.420
Plus ich muss irgendwie diese Parameter, das heißt die Parameter der

01:17:09.420 --> 01:17:12.900
Transformationsmatrix a, der Transformationsmatrix s und dieses

01:17:12.900 --> 01:17:15.220
Offsetvektors b irgendwie finden.

01:17:15.780 --> 01:17:19.080
Und die kann ich wieder gemäß Maximum-Likelihood-Methode mit dem EM

01:17:19.080 --> 01:17:23.820
-Algorithmus finden, indem ich einfach dafür sorge, dass die

01:17:25.360 --> 01:17:27.760
Wahrscheinlichkeit, mit der die Modelle die Trainingsdaten, in diesem

01:17:27.760 --> 01:17:32.140
Fall die Adaptionsdaten hervorbringen, halt maximiert wird, kann ich

01:17:32.140 --> 01:17:33.580
EM -Algorithmus darauf anwenden.

01:17:36.380 --> 01:17:39.880
Das heißt, wenn jetzt mal die Klassen definiert sind, wie viele

01:17:39.880 --> 01:17:43.680
Klassen ich habe und welches Modell zu welcher Klasse gehört, kann ich

01:17:43.680 --> 01:17:46.960
mit dem EM- Algorithmus diese Matrizen finden und kann dann diese

01:17:46.960 --> 01:17:50.780
Matrizen und den Vektor entsprechend auf die Modelle anwenden, um neue

01:17:50.780 --> 01:17:53.160
Modelle während des Testens zu bekommen.

01:17:55.740 --> 01:17:58.720
Frage ist, wo bekomme ich jetzt diese Klassen her?

01:18:00.000 --> 01:18:04.240
Einfacher Extremfall, ich habe ganz, ganz, ganz wenig Daten, okay,

01:18:04.740 --> 01:18:06.200
habe ich eh nur eine Klasse.

01:18:07.460 --> 01:18:11.000
Oder ich habe sehr, sehr, sehr, sehr viele Daten, dann kann ich eine

01:18:11.000 --> 01:18:12.080
Klasse pro Modell machen.

01:18:12.400 --> 01:18:15.520
Aber ist ja Quatsch, weil die Adaptionsdaten haben ja genauso viele,

01:18:15.860 --> 01:18:19.260
die Adaptionsmatrizen haben genauso viele Parameter wie meine

01:18:19.260 --> 01:18:20.200
ursprüngliche Gauss-Glocke.

01:18:20.300 --> 01:18:22.800
Warum mache ich da nicht gleich eine MAP-Adaption zum Beispiel oder

01:18:22.800 --> 01:18:24.140
ein sprecherabhängiges Modell?

01:18:25.100 --> 01:18:28.900
Und für die Fälle dazwischen, muss ich mir irgendwas Intelligentes,

01:18:28.900 --> 01:18:30.320
Geschicktes überlegen.

01:18:30.980 --> 01:18:34.300
Und da ist wieder die gleiche Leier, wie wir sie schon zigmal hatten

01:18:34.300 --> 01:18:35.100
in der Vorlesung.

01:18:35.480 --> 01:18:38.440
Ich habe die Möglichkeit, das Ganze wissensbasiert zu machen oder ich

01:18:38.440 --> 01:18:40.600
habe die Möglichkeit, das Ganze datengetrieben zu machen.

01:18:41.420 --> 01:18:43.960
Wenn ich das Ganze wissensbasiert mache, brauche ich irgendwie Wissen

01:18:43.960 --> 01:18:47.460
darüber, welche Modelle sollen denn jetzt in der Adaption gekoppelt

01:18:47.460 --> 01:18:47.840
werden.

01:18:48.500 --> 01:18:51.600
Dass man zum Beispiel sagt, okay, Vokale kriegen eine Adaptionsklasse

01:18:51.600 --> 01:18:53.720
und Konsonanten kriegen eine Adaptionsklasse.

01:18:54.440 --> 01:18:59.460
Oder das Stille- Modell, das Stille nicht sprachmodelliert, kriegt

01:18:59.460 --> 01:19:02.640
eine Adaptionsklasse und Sprache, alles was Sprache modelliert, kriegt

01:19:02.640 --> 01:19:03.640
eine Adaptionsklasse.

01:19:04.320 --> 01:19:06.260
Geräusch, Sprache und so weiter und so fort.

01:19:06.740 --> 01:19:08.500
Das wären so wissensbasierte Methoden.

01:19:09.640 --> 01:19:12.980
Schöner und geschickter ist das Ganze natürlich anhand der Struktur

01:19:12.980 --> 01:19:15.940
der Adaptionsdaten zu machen, in der Hoffnung, dass ich dadurch die

01:19:15.940 --> 01:19:18.600
Adaptionsdaten maximal ausnutze.

01:19:20.240 --> 01:19:24.180
Und da ist die Grundidee dahinter, ich fange an, eine Klasse für alles

01:19:24.180 --> 01:19:30.140
und dann für jede Klasse, für die ich dann noch genügend

01:19:30.140 --> 01:19:34.240
Trainingsdaten habe, diese Klasse spalte ich auf.

01:19:35.060 --> 01:19:37.680
Indem ich zum Beispiel gucke, in welcher Richtung ist die größte

01:19:37.680 --> 01:19:41.080
Varianz bei den Modellen und dann werden die entsprechend der Richtung

01:19:42.100 --> 01:19:42.540
aufgesplittet.

01:19:43.000 --> 01:19:45.860
Und das iteriere ich dann so lange, das ist dann so ein divisives

01:19:45.860 --> 01:19:50.460
Clustering, solange ich noch Klassen herausbekomme, die genügend

01:19:50.460 --> 01:19:51.560
Trainingsdaten haben.

01:19:51.620 --> 01:19:54.620
Und wenn ich dann nur noch zu wenig Trainingsdaten habe, dann ist

01:19:54.620 --> 01:19:57.340
Schluss mit Clustern.

01:19:58.140 --> 01:20:05.320
Und dann kann ich für jede der Klassen, für jedes der Blätter,

01:20:05.700 --> 01:20:09.800
entsprechend meiner Adaptionsmatrizen rechnen.

01:20:12.980 --> 01:20:15.900
Mit so einer Sprecheradaption, zum Beispiel mit so einer

01:20:15.900 --> 01:20:18.980
Modelladaption, kann man auch schöne Tricks machen während des

01:20:18.980 --> 01:20:19.420
Trainings.

01:20:20.160 --> 01:20:24.920
Im Training arbeite ich häufig mit sogenanntem Labeltraining, wo ich

01:20:24.920 --> 01:20:28.940
also erst mal ein Forced Alignment rechne für die einzelnen Äußerungen

01:20:28.940 --> 01:20:32.560
und dann nur noch mein EM-Training entlang dieses Forced Alignments

01:20:32.560 --> 01:20:36.300
laufen lasse, indem ich sage, das sind die Zustände, die durchlaufen

01:20:36.300 --> 01:20:40.120
wurden und alle anderen Zustände wurden nicht durchlaufen.

01:20:41.000 --> 01:20:43.940
Von der Qualität dieses Alignments hängt natürlich auch die Qualität

01:20:43.940 --> 01:20:44.720
des Trainings ab.

01:20:44.780 --> 01:20:49.340
Je besser das Alignment ist, desto besser auch das Training entlang

01:20:49.340 --> 01:20:49.960
dieser Labels.

01:20:51.760 --> 01:20:56.340
Wenn ich jetzt meine Modelle sprecherabhängig mache, wird vermutlich

01:20:56.340 --> 01:20:58.640
logischerweise auch das Alignment besser werden.

01:20:59.320 --> 01:21:02.660
Deswegen gibt es eine Technik, die nennt sich dann Label Boosting, die

01:21:02.660 --> 01:21:03.840
sieht so aus im Training.

01:21:05.840 --> 01:21:10.340
Für jeden Sprecher wird ein abhängiges Modell mittels MLLR gerechnet.

01:21:11.460 --> 01:21:14.140
Also ich muss erst einmal ein sprecherunabhängiges Modell machen, dann

01:21:14.140 --> 01:21:18.180
für jeden Sprecher ein sprecherabhängiges Modell rechnen gemäß MLLR,

01:21:19.100 --> 01:21:23.840
dann mit diesem sprecherabhängigen Modell die Labels schreiben und

01:21:23.840 --> 01:21:28.160
dann wird das sprecherunabhängige Modell entlang dieser deutlich

01:21:28.160 --> 01:21:31.520
besseren Labels trainiert.

01:21:32.200 --> 01:21:35.620
Das heißt, am Ende kommt wieder ein sprecherunabhängiges Modell raus,

01:21:36.120 --> 01:21:39.240
aber hoffentlich gemäß Labeltraining mit besseren Forced Alignments,

01:21:39.340 --> 01:21:43.140
mit besseren Zuweisungen, Zustand zum Merkmalsvektor.

01:21:50.570 --> 01:21:55.650
Halt noch abschließende Bemerkung, welche Adaption unter welchen

01:21:55.650 --> 01:21:56.130
Bedingungen.

01:21:57.250 --> 01:22:02.130
Klar, wenig Daten, kleine Anzahl linear Transformationen, zum Beispiel

01:22:02.130 --> 01:22:02.650
MLLR.

01:22:03.870 --> 01:22:07.330
Große Menge an Adaptionsdaten, aber noch nicht ausreichend für ein

01:22:07.330 --> 01:22:07.970
eigenes Modell.

01:22:08.510 --> 01:22:09.230
So was wie MAP.

01:22:11.670 --> 01:22:13.630
Oder man kann halt beides benutzen.

01:22:13.750 --> 01:22:18.670
Man macht eine kleine Menge an Klassen für die MLLR und danach die MAP

01:22:18.670 --> 01:22:22.150
Adaption nochmal oben drauf, damit dann die Parameter für die genügend

01:22:22.150 --> 01:22:23.630
Trainingsdaten gesehen wurden.

01:22:24.090 --> 01:22:28.470
Nicht nur diese einfache MLLR One-Size-Fits-All Adaption genutzt wird,

01:22:28.730 --> 01:22:30.270
sondern die besser spezifische.

01:22:31.150 --> 01:22:35.450
Dann kann man so was wie eine VTLM zusätzlich zur MLLR oder zum MAP

01:22:35.450 --> 01:22:41.150
auch dazu kombinieren und unter Umständen verstärken oder verbessern

01:22:41.150 --> 01:22:46.030
sich diese Adaptionen gegenseitig oder die Gewinne addieren sich, wenn

01:22:46.030 --> 01:22:48.690
auch nicht im vollen Umfang, sondern zum Teil zumindest.

01:22:51.050 --> 01:22:55.210
Und je nachdem, was man macht, kann man teilweise, wenn man es

01:22:55.210 --> 01:22:59.230
geschickt macht und man die Adaptionen einschränkt, man unter

01:22:59.230 --> 01:23:01.770
Umständen das Ganze so umrechnen, dass man nicht die Modelle

01:23:01.770 --> 01:23:05.690
adaptiert, sondern den Merkmalsraum und das Ganze dann in der Regel

01:23:05.690 --> 01:23:08.650
auch deutlich schneller funktioniert.

01:23:12.170 --> 01:23:18.750
Beispiel dafür ist die sogenannte Feature-Space-Constraint MLLR.

01:23:19.730 --> 01:23:24.590
So eine MLLR kann man unterteilen in Constraint und Unconstraint.

01:23:24.790 --> 01:23:27.250
Die Unconstraint ist so, wie wir sie gesehen haben.

01:23:27.350 --> 01:23:30.550
Es gibt eine Adaptionsmatrix A für die Mittelwerte und es gibt eine

01:23:31.130 --> 01:23:35.450
Adaptionsmatrix S für die Kovarianzmatrizen.

01:23:36.490 --> 01:23:41.590
Bei der Constraint gibt es nur noch eine Matrix A und diese Matrix A

01:23:41.590 --> 01:23:45.070
wird verwendet, um die Mittelwerte zu transformieren und sie wird auch

01:23:45.070 --> 01:23:48.630
verwendet, um die Kovarianzmatrix zu transformieren.

01:23:49.670 --> 01:23:52.350
Hat erstmal den Vorteil, weniger Parameter, brauche ich weniger

01:23:52.350 --> 01:23:53.750
Trainingsdaten, um sie zu schätzen.

01:23:53.850 --> 01:23:57.650
Ist natürlich nicht so schön wie eine Unconstraint MLLR, die ist

01:23:57.650 --> 01:23:58.090
mächtiger.

01:23:59.550 --> 01:24:04.210
Aber angenommen, ich hätte nur eine einzige Adaptionsmatrix A für alle

01:24:04.210 --> 01:24:11.430
Modelle, ein globales A, dann kann ich dieses Ding umschreiben als

01:24:11.430 --> 01:24:12.970
eine Merkmalsraumtransformation.

01:24:14.150 --> 01:24:18.930
Dann kann ich schreiben, das ist das Gleiche, wenn ich die

01:24:18.930 --> 01:24:22.270
Wahrscheinlichkeit von X berechne, die Emissionswahrscheinlichkeit,

01:24:22.770 --> 01:24:31.210
als hätte ich die Normalverteilung auf AX plus B plus Logarithmus der

01:24:31.210 --> 01:24:32.270
Terminante von A.

01:24:32.810 --> 01:24:37.750
Das heißt, statt hier µ, Sigma zu transformieren, transformiere ich

01:24:37.750 --> 01:24:42.330
nur das A mit AX plus B, addiere hier hinten noch den Logarithmus der

01:24:42.330 --> 01:24:45.830
Terminante drauf, der ist sowieso konstant, und kann dann mit den

01:24:45.830 --> 01:24:48.350
untransformierten Mittelwerten und der untransformierten

01:24:48.350 --> 01:24:50.790
Kovarianzmatrix arbeiten.

01:24:51.710 --> 01:24:55.350
Und habe dann auf die Art und Weise hier diese Dualität als

01:24:58.650 --> 01:25:01.410
Modelltransformation angewandt als Merkmalstransformation.

01:25:02.650 --> 01:25:06.590
Und da dieses Ding da hinten eh konstant ist und wir uns wieder nur

01:25:06.590 --> 01:25:10.310
für das Maximum entscheiden, brauche ich das auch gar nicht mehr drauf

01:25:10.310 --> 01:25:14.370
zu addieren, sondern kann direkt nur mit den transformierten Merkmalen

01:25:14.370 --> 01:25:14.550
machen.

01:25:14.750 --> 01:25:17.630
Das heißt, in meiner Merkmalsextraktion habe ich einfach noch mal eine

01:25:18.410 --> 01:25:21.690
Matrixtransformation plus Addition, die hinten mit draufkommt während

01:25:21.690 --> 01:25:22.670
der Merkmalsextraktion.

01:25:23.750 --> 01:25:26.070
Gut, und damit war es das für heute.

