Anleitung zum Training einer neuen Sprache in MAUS 

F. Schiel 2017-04-07

Diese Anleitung soll Studenten/Mitarbeitern einen ersten Überblick geben, unter 
welchen Bedingungen eine neue Sprache für MAUS trainiert werden kann, welche 
Daten dafür benötigt werden, und welche die typischen Verarbeitungsstufen sind.

Zielgruppe sind Studenten, die eine BA HAusarbeit zu diesemThema durchführen bzw.
Mitarbeiter, welche für ihr Projekt eine neue Sprache in MAUS benötigen.

Im Folgenden gehen wir davon aus, dass eine komplette Pipeline von TXT Input 
bis phonetischer Segmentierung als Output erzeugt werden soll (g2p.pl + maus).
Einige dieser Verarbeitungsschritte sind optional, und können z.B. mangels geeigneter
Daten weggelassen (oder durch einfachere Methoden ersetzt) werden. Diese Schritte 
sind im Folgenden durch ein vorangestelltes [OPTIONAL] markiert.

1. Grundsätzliches Verständnis wie MAUS funktioniert

2. Das Phonem-Inventar (KANINVENTAR)

3. Training des akustischen Modells (HMM)
3.1 Bedingungen für den Sprachkorpus
3.2 Die Aufbereitung des Sprachkorpus
3.3 Training der akustischen Modelle (HMM)
3.4. [OPTIONAL] Cloning oder Mapping nicht-trainierbarer HMM
3.5 Test
3.6 Einbau in maus

4. [OPTIONAL] Training der grapheme-to-phoneme methode (g2p.pl)
4.1 Bedingungen für die Daten
4.2 Training + Implementierung

5. [OPTIONAL] Training des Aussprachemodells (RULESET)
5.1 Bedingungen für den Sprachkorpus
5.2 Die Aufbereitung des Sprachkorpus
5.3 Training der akustischen Modelle (HMM)
5.4 Test
5.5 Einbau in maus 
5.6 Alternative: phonologisches RULESET

--------------------------------------------------------------------------------

1. Grundsätzliches Verständnis wie MAUS funktioniert

* [OPTIONAL] g2p.pl liest TXT Input Datei, tokenisiert und text-normalisiert den 
Text. Erzeugt für jedes Token (Wort) eine kanonische Aussprache kodiert in SAMPA.
Die Menge der erzeugten SAMPA-Zeichen muss in KANINVENTAR von maus enthalten sein.
(s. Abschnitt 2)
* maus liest tokenisierte (= wort-nummerierte) Folge von kanonischen Aussprachen
* [OPTIONAL] maus erzeugt statistisches Aussprachemodell des Textes mit Hilfe des 
für die Sprache trainierten RULSET (s. Abschnitt 5) 
* maus kombiniert Aussprachemodell und akustisches Modell (s. Abschnitt 3) und findet 
die statistisch wahrscheinlichste Folge von Phonemen zusammen mit den Segmentgrenzen
und gibt diese im gewünschten Format aus.

--------------------------------------------------------------------------------

2. Das Phonem-Inventar (KANINVENTAR)

Vor allen anderen Schritten muss das für die neue Sprache maximal gültige Phonem-
Inventar festgelegt werden.
(a) die Sprache hat ein definiertes SAM-PA set (s. http://www.phon.ucl.ac.uk/home/sampa/):
Wir verwenden dieses set, erweitert durch Pausen- und Geräusch-Symbole, und [OPTIONAL] ev. einige 
englische und französische Symbole, wenn diese nicht enthalten sind und wenn damit zu rechnen 
ist, dass solche Fremdwörter in der Sprache verwendet werden.
(b) die Sprache hat kein definiertes SAM-PA set (s. http://www.phon.ucl.ac.uk/home/sampa/):
Wir definieren (nach Recherche z.B. in wikipedia) ein X-SAMPA set für die neue Sprache 
(s. http://www.phon.ucl.ac.uk/home/sampa/x-sampa.htm).

Die Datei KANINVENTAR enthält pro Zeile genau ein SAMPA-Zeichen in absteigender Länge; 
Beispiele:  /usr/local/maus.root/PARAM.deu-DE/KANINVENTAR
            /usr/local/maus.root/PARAM.fra-FR/KANINVENTAR

Für die Kodierung in SAMPA/X-SAMPA gelten strengere Regeln als sonst üblich, um zu 
eindeutigen Kombinationen von Symbolen/Diacritica zu kommen.

Aus der MAUS Doku (.../HMM/README):

CODING CONVENTIONS IN MAUS

MAUS uses SAMPA symbols and some X-SAMPA symbols (where SAMPA is not enough), 
diphthongs/geminates consisting of SAMPA/X-SAMPA symbols
and some SAMPA symbols extended by diacritics.

Diacritics are a sad mixture of SAMPA (: = ~) and X-SAMPA diacritics
(e.g. ` _j _d _h _>) and even some new diacritics that are neither be found 
in SAMPA or X-SAMPA (_p : pre-stopped, _cl : closure, _rl : release,
_s : preceeding word might trigger 'Raddoppiamento sintattico' (Italian)).
Diacritics in MAUS are always following base symbols; therefore a syllabic
'l' is encoded as 'l=' not as '=l' as proposed by Wells on the SAMPA Home page.
'-' and '\' aren't diacritics but rather part of a base name.
If a symbol or a geminate carries more than one diacritic, there is a strict order to prevent 
multiple re-combinations of diacritics. The order by falling precedence is:
lengthening of vowels/diphthongs: <symbol>:  e.g.  'a:'
geminasation:                     <symbol><symbol>  e.g.  'tt' 'ddZ'
syllabic:                         <symbol>=  e.g. 'l='
nasalisation of vowels:           <symbol>~  e.g.  'o~'
retroflex:                        <symbol>`  e.g.  'l`'
palatalisation:                   <symbol>_j  e.g.  't_j'
dental:                           <symbol>_d  e.g.  'l_d'
aspiration:                       <symbol>_h  e.g.  'p_h'
ejective:                         <symbol>_>  e.g.  'k_>'
pre-stopped:                      <symbol>_p  e.g.  'm_p'
closure:                          <symbol>_cl e.g.  'd_cl'
preceeding word might trigger 'Raddoppiamento sintattico' (Italian):
                                  <symbol>_s  e.g.  'pp_s'
release:                          <symbol>_rl e.g.  'ddZ_rl'


Combination of diacritics must be ordered like the list above, e.g.
'a:~' is allowed, 'a~:' is not; 'l=_d_p' is allowed, 'l=_p_d' is not.
 
Geminates are coded as repetitions of phoneme symbols, e.g. 'tt'; 
lengthened vowels or diphthongs are usually coded with the diacritic ':',
e.g. /a:/; sometimes (e.g. Estonian) quantity is encoded like a geminate 'aa';
sometimes a geminate is encoded like a quantity (e.g. Finnish) to suite certain
conventions of the community.
Plosives can be coded in two sub-segments, closure and release, e.g.
't_cl' and 't_rl'.

Das fertige KANINVENTAR File wird im Parameter-Dir der Sprache gespeichert 
(s. Beispiele oben bei einer MAUS-Installation in /usr/local/maus.root).
Ebenfalls dort muss eine Kopie namens GRAPHINVENTAR angelegt werden, in welcher 
folgende Änderungen vorgenommen werden (mit einem Editor):
* alle nummerischen Zeichen bekommen ein 'P' vorangestellt (z.B. '6' -> 'P6')
* alle '\' werden ersetzt durch '-' (z.B. 'r\' -> 'r-') 

--------------------------------------------------------------------------------

3. Training des akustischen Modells (HMM)
Das akustische Modell von MAUS dient dazu, die phonetische Ähnlichkeit von Phoneme-Segmenten 
an einer bestimmten Stelle des Input-Signals zu berechnen. Dazu braucht MAUS für jedes 
Phoneme-Symbol (= SAMPA-Symbol in KANINVENTAR) ein HMM, das auf segmentierte Sprache 
trainiert wurde.

3.1 Bedingungen für den Sprachkorpus
Der Korpus muss mindestens enthalten:
(a) Manuell phonemische segmentierte Sprache in einer Kodierung, die auf KANINVENTAR abbildbar ist
(b) mindestens 20 Sprecher (10f+10m), ideal über 200
(c) mindestens 1h Material
(d) Aufnahmen mit mindestens 16000 Abtastrate und 16bit (keine Telefonsprache) 

3.2 Die Aufbereitung des Sprachkorpus
Zu jeder Signaldatei (*.wav) muss ein gleichnamiges BPF file (aber mit Extension *.par)
(s. http://www.bas.uni-muenchen.de/forschung/Bas/BasFormatsdeu.html#Partitur) erzeugt werden.
Das *.par muss mindestens die tiers [OPTIONAL] 'ORT' (oder 'KAN') und 'SAP' enthalten, z.B.:

ORT: 0 auf
ORT: 1 Wiederhören
SAP:	549	867	0	Q
SAP:	1416	1242	0	aU
SAP:	2658	1136	0	f
SAP:	3794	408	1	v
SAP:	4202	852	1	i:
SAP:	5054	433	1	d
SAP:	5487	1686	1	6
SAP:	7173	828	1	h
SAP:	8001	864	1	9
SAP:	8865	1015	1	r-
SAP:	9880	0	1	@
SAP:	9880	1732	1	n

Die Definition des SAP tiers ist wie folgt:
 Definition:

SAP: (begin) (duration) (list of symbolic links) (label string)

Diese Spur enthält eine Segmentierung der Äußerung in SAM-PA Einheiten (breite phonetische 
Segmentierung). Im Gegensatz zur Spur PHO: muß diese nicht bündig sein. Die erste Nummer 
bezeichnet den Beginn des Segments in Samples von Beginn des Files, die zweite Nummer die 
Dauer des Segments in Samples. [OPTIONAL] Die dritte Nummer ist die Wortnummerierung beginnend 
bei 0; ist diese nicht bekannt, kann sie immer auf '-1' gesetzt werden, aber dann ist kein 
Training des Aussprachemodells möglich (s. Abschnitt 5).

Da HTK keine '\' in Symbol-Namen verträgt, müssen diese für das Training als '-' kodiert werden 
(s. 'r-' in obigem Beispiel ist eigentlich ein 'r\'). 
Alle Signalsfiles (*.wav) und BPF files (*.par) werden in einem Dir BPFDIR gespeichert.
Kontrolle:
ls BPFDIR/*.wav | wc -l
ls BPFDIR/*.par | wc -l 
-> müssen gleiche Zahlen produzieren.

Die Umwandlung von anderen Annotations-Dateien (z.B. EAF oder TextGrid) in BPF und das Mapping 
der verwendeten Symbol-Kodierung auf SAMPA/X-SAMPA ist nicht trivial. Je nach Korpus kann das 
sehr leicht oder sehr kompliziert werden; außerdem muss man immer mit Fehlern (z.B. falsch 
geschriebene Phonem-Label) rechnen. U.U. ist es leichter, einen Korpus zuerst nach emuDB 
zu importieren, und anschließend in BPF wieder zu exportieren.
Beispiele verschiedener Korpus-Aufbereitungen für MAUS befinden sich in 
/homes/schiel/MAUS/HMMLEARN

3.3 Training der akustischen Modelle (HMM)
Das Skript /homes/schiel/MAUS/HMMLEARN/maus.hmm trainiert alle trainierbaren HMM aus dem BPFDIR
und legt diese in einer MMF Datei ab. Symbole, die weniger als 100 Exemplare im Korpus haben, werden 
nicht trainiert (s. WARNINGS). In der Regel ist das Ergebniss von maus.hmm nur ein subset des 
KANINVENTARS.
Nummerische SAMPA Symbole ('9' '2:' etc.) werden von maus.hmm automatisch mit einem voranstehenden 
'P' versehen ('P9' 'P2:'), weil diese sonst von HTK mit Zeiten verwechselt werden.

3.4. Cloning oder Mapping nicht-trainierbarer HMM
Phonem-Symbole aus KANINVENTAR, die nicht trainiert werden konnten (entweder weil zu wenig Exemplare
oder weil gar nicht vorhanden) müssen nun ergänzt werden, damit maus ein vollständiges Phonem-Inventar
zur Verfügung hat. Ein mapping auf ein anderes (vorhandenes) HMM scheint zunächst widersinnig, 
funktioniert aber in der Praxis recht gut, wenn die beiden Phoneme akustisch ähnlich sind (z.B. 
/a~/ -> /a/). Handelt es sich um ein fehlendes Phonem, das gar keinem anderen ähnelt, sollte man 
im sprach-unabhängigen Phonem-Set von MAUS (e.g. /usr/local/maus.root/HMM/SUPERHMM.lst) nach einem 
geeigneten Phonem suchen (das auf einer anderen Sprache trainiert wurde) und dieses in das MMF der 
neuen Sprache hineinkopieren und umbenennen.

Beispiel:
Im deutschen HMM Training konnte kein /Z/ trainiert werden.
Entweder (a) wir mappen das /Z/ auf ein /S/ (was trainiert werden konnte), 
oder (b) wir kopieren /Z.hun/ (/Z/ in Ungarischen) nach dem deutschen MMF und nennen es /Z/

(a) Mapping
Im Parameter-Dir der neuen Sprache muss es ein File DICT geben, welches die Abbildung von 
Inventar-Zeichen auf HMM regelt: 
1. Spalte: das Inventar-Zeichen identisch wie in GRAPHINVENTAR
2. Spalte: der Name des HMMs, dass dieses Zeichen modellieren soll (i.d.R. derselbe Name)
Beispiel:
Um das fehlende 'Z' auf 'S' abzubilden macht man folgenden Eintrag in DICT:

Z S

(b)
Clone-HMM mittels copy&paste aus der Datei /usr/local/maus.root/HMM/SUPERHMM.mmf nach 
PARAM.<newLang>/MMF.mmf kopieren (z.B. 'Z.hun'); entsprechenden Eintrag in DICT machen.
Beispiel:

Z Z.hun

3.5 Einbau in maus software (kann nur Florian) oder in Test-Kopie der maus software
Die oben beschriebenen Dateien KANINVENTAR, GRAPHINVENTAR (aus Abschnitt 1), DICT und MMF.mmf 
werden im Parameter-Dir .../PARAM.<newLang> der neuen Sprache gespeichert.

3.6 Test
Rufe maus mit Test-File auf:

./maus v=1 SIGNAL=test.wav BPF=test.par OUTFORMAT=TextGrid PARAM=PARAM.<newLang> MODUS=align

Wenn keine ERROR oder WARNING kommt, das Ergebniss test.TextGrid mit praat kontrollieren.

--------------------------------------------------------------------------------

4. [OPTIONAL] Training der grapheme-to-phoneme methode (g2p.pl)
Eine grapheme-to-phoneme Methode (g2p.pl) für die neue Sprache wird benötigt, wenn 
* man als Input *.txt Files statt *.par verwenden möchte (sog. 'G2P + MAUS Pipeline')
* wenn man das Training eines Aussprachemodells (Abschnitt 5) durchführen möchte.

4.1 Bedingungen für die Daten
Für das Training einer neuen G2P Methode braucht man entweder:
(a) eine Mapping-Tabelle von orthographischen Zeichen auf phonemische Zeichen (SAMPA/X-SAMPA),
wenn es sich um eine Sprache wie Italienisch handelt, in der die kanonische Aussprache weitgehend
durch die Orthographie definiert ist. Eine Beschreibung des Mapping Files 
findet man in /vdata/CLARIN/doc/readme_g2p_mappingTable.txt, 
oder:
(b) ein großes Aussprache-Lexikon, mit dem eine statistische G2P Methode gelernt werden kann.
Das Lexikon sollte mindestens 50000 Wörter enthalten, hand-kontrolliert sein und zwei Spalten
besitzen:
Spalte 1 : Orthograhie (UTF-8, ohne Satzzeichen oder Leerzeichen!)
Spalte 2 : SAMPA/X-SAMPA

4.2 Training + Implementierung
Die Mapping-Tabelle oder das Lexicon an Uwe Reichel schicken und ihn bitten, 
diese neue Sprache in g2p.pl zu trainieren.

Wenn kein G2P implementiert werden kann, kann maus trotzdem mit BPF Input verwendet werden.
Im WebMAUS Interface fehlt aber dann die Sprache unter WebMAUS Basic und funktioniert nicht 
in WebMAUS Multiple mit *.txt Input.

--------------------------------------------------------------------------------

5. [OPTIONAL] Training des Aussprachemodells (RULESET)
Das Aussprachemodell von MAUS dient dazu, nur aus der kanonischen Aussprache einer 
Äußerung möglichst viele plausibele Varianten der Aussprache zusammen mit ihrer apriori
Wahrscheinlichkeit vorauszusagen. Ein klassisches Beispiel aus dem Deutschen ist das Wort 
'haben', kanonisch /ha:b@n/ das aber auch /ha:bn/ oder /ham/ ausgesprochen vorkommt.
Das Aussprachemodell von MAUS ist eine Sammlung von Ersetzungsregeln, mit der kanonischen 
Form auf der linken und der phonetischen Form auf der rechten Seite der Regel, und einer 
bedingten Wahrscheinlichkeit für das Eintreten der Variante, falls die kanonische Form 
vorkommt, z.B. für obiges Beispiel:
b@n#>bn# log(p)=-1.3
b@n#>m# log(p)=-2.1
Da es sich um ein statistisches Modell handelt, muss es genau wie das akustische Modell aus 
einem transkribierten Korpus gelernt werden (die segmentierung spielt hier keine Rolle, 
nur das phonetische Transkript).
 
5.1 Bedingungen für den Sprachkorpus
Der Korpus muss 2 Annotationsebenen haben, die miteinander verknüpft sind: eine orthographische
(oder kanonische) Ebene und eine phonetische Ebene (idealerweise die Segmentierung, die schon 
in Abschnitt 3 verwendet wurde). Verknüpfung bedeutet: für jedes Element der phonetischen Ebene
muss bekannt sein, zu welchem Wort der orthographischen Ebene es gehört.   

5.2 Die Aufbereitung des Sprachkorpus
(a) Phonetische Ebene: 
* Erzeugung eines BPF in BPFDIR mit ORT(KAN)/SAP tiers: 
im Prinzip gilt hier alles, was zu dem BPF SAP tier unter Abschnitt 3 
gesagt wurde. Enthält ein Korpus keine Segmentierung aber phonetische Transkripte, kann statt 
des SAP tiers ein PTR tier (s. http://www.bas.uni-muenchen.de/forschung/Bas/BasFormatsdeu.html#Partitur)
erzeugt werden und der nächste Punkt übersprungen werden.
* Erzeugung eines PTR tiers aus dem SAP tier
Siehe Beispiel-Skript /homes7schiel/MAUS/HMMLEARN/POLISH/SAP2PTR.
Wichtig ist, dass das erzeugte PTR tier nur SAMPA/X-SAMPA Symbole enthält, die auch in 
KANINVENTAR vorkommen (Kontrolle!).
(b) orthographische Ebene:
Das BPF sollte entweder einen KAN tier enthalten (falls der Korpus eine solche Info enthält), oder
einen ORT tier (wie in Abschnitt 3 beschrieben). In letzterem Falle erzeugt man aus dem ORT 
tier einen KAN tier, indem man alle BPF file *.par in den G2P Webservice schickt (mit der Option 
Tool embedding = maus und der entsprechenden neuen Sprache (Voraussetzung: Abschnitt 4 durchgeführt!).  
Die fertigen BPF *.par files für das nachfolgende Training sollte z.B. so aussehen:

ORT: 0 auf
ORT: 1 Wiederhören
KAN: 0 ?aUf
KAN: 1 vi:d6h2:r@n
PTR: 0 ?Of
PTR: 1 vid6h2:R@n

5.3 Training des Aussprache-Modells
Das Skript /homes/schiel/MAUS/MACHINELEARN/maus.learn liest sämtliche BPF *.par files in 
BPFDIR und erstellt ein Modell-File rml.${DATE}.rul (RULESET).
Siehe ausführliche Dokumentation im Header des Skripts zu möglichen Optionen/Problemen und
zu Möglichkeiten des Prunings/Regelgeneralisierung.
Oft ist es notwendig, das RULESET händisch von fehlerhaften oder unsinnigen Regeln zu bereinigen.

5.4 Test
Rufe maus mit Test-File auf:

./maus v=1 SIGNAL=test.wav BPF=test.par OUTFORMAT=TextGrid PARAM=PARAM.<newLang> MODUS=standard \
  RULESET=rml.${DATE}.rul INSORTTEXTGRID=TRUE INSKANTEXTGRID=TRUE

Wenn keine ERROR oder WARNING kommt, das Ergebniss test.TextGrid mit praat kontrollieren.
Es sollten sich Beispiele finden, bei denen der MAU tier vom KAN tier abweicht, d.h. 
maus hat sich für eine Variante der kanonischen Form als beste Segmentierung entschieden.

5.5 Einbau in maus software (kann nur Florian) oder in Test-Kopie der maus software
Das fertige RULESET rml.${DATE}.rul wird in das Parameter-Dir der neuen Sprache kopiert
und dort ein symbolischer Link auf das Standard-File 'rml-0.95.rul' gesetzt.

5.6 Alternative: phonologisches RULESET
Ist ein korpus-basiertes Training nicht möglich, aber es sind aus anderen gesicherten Quellen 
ein oder mehrere ambige phonetische Realisierungen einer kanonischen Form dieser Sprache bekannt,
kann ein phonologisches RULSET file *.nrul erzeugt werden, in welchem man diese Regeln ohne 
Auftretenswahrscheinlichkeit ausformuliert, z.B.:

#-Q,E-s,#>#--s,#
aI-C-s,t>aI-k-s,t
y:-C-s,t>y:-k-s,t

(Die erste Regel reduziert ein 'es' zu einem puren 's'; die zweite Regel ersetzt den Frikativ
'C' durch den Plosiv 'k', aber nur eim Kontext aI__st; die dritte Regel macht dasselbe aber im 
Kontext y:__st.)

Folgend eine Beschreibung der Regelsyntax aus der MAUS Dokumentation:
             The synopsis for a phonological rule (one line of the RULESET) is:
             (leftcontext)-(pattern)-(rightcontext)>(leftcontext)-(replacement)-(rightcontext)
             all (...) can be comma-separated strings of SAM-PA symbols (including the 
             utterance-initial symbol /</ and the utterance-medial word 
             boundary /#/, but NOT the utterance-end symbol />/!) or even the empty 
             string (meaning all contexts), e.g. 
             P2:-C-s,t>P2:-k-s,t
             -> a /C/ in context 2: ... st can be replaced by a /k/
             -a-#>-A-#
             -> all word final /a/ can be uttered as /A/
Phonologische Regel-Sets haben eine deutlich schlechtere Performanz als statistische Regelsets,
oft verschlechtert sich sogar die Segmentierung. Daher sollten nur ganz wenige, sehr robuste 
phonologische Prozesse (z.B. Schwa-Elision im Portugiesischen) auf diese Weise kodiert werden.

