[PYTHON] Unsicherheit des japanischen Unite-Codes in der Tacotron 2-Serie

Einführung

Die Methode zum Konvertieren von Textdaten in synthetische Sprache wird als TextToSpeech (TTS) bezeichnet. Ich habe diesmal TextToSpeech nicht gelernt, aber wenn die Textdaten auf Japanisch eingegeben werden, werde ich die Fehlergeschichte aufzeichnen, die mit den translation_cleaners der Tacotron2-Serie nicht gut in Romaji konvertiert werden konnte.

Tacotron 2 Serie

Die TextToSpeech von NVIDIA enthält: Dieses Mal habe ich Flowtron ausprobiert, aber es scheint, dass der Fehler von Unitecode für japanische Eingaben bei anderen Versionen häufig vorkommt. https://github.com/NVIDIA/flowtron https://github.com/NVIDIA/mellotron https://github.com/NVIDIA/tacotron2 (Übrigens kenne ich den Unterschied zwischen ihnen nicht im Detail)

Beim Lernen mit eigenen Daten der japanischen Eingabe

Ich habe die Trainingsdaten nicht vorbereitet und das Modell nicht trainiert. Um die Originaldaten zu trainieren, erstellen Sie die Dateiliste wie unten gezeigt selbst.

train.py


    ...
    data_config['training_files'] = 'filelists/train_filelist.txt'
    data_config['validation_files'] = 'filelists/validation_filelist.txt'
    data_config['text_cleaners'] = ['transliteration_cleaners']
    train(n_gpus, rank, **train_config)

image.png Ich denke, Sie müssen den Speicherort der Datei, den Audiotext und die Sprecher-ID in die Dateiliste schreiben. Ich denke, es ist notwendig zu verhindern, dass die Sprecher-IDs in Trainingsdaten, in denen mehrere Sprecher gemischt sind, dupliziert werden. (Vielleicht)

data.py


def load_filepaths_and_text(filename, split="|"):
    with open(filename, encoding='cp932') as f:   #Ändern Sie die Codierung in cp932(Für Windows)
...
    def get_text(self, text):
        print(text)               #hinzufügen
        text = _clean_text(text, self.text_cleaners)
        print(text)               #hinzufügen

text/cleaners.py


def transliteration_cleaners(text):
    '''Pipeline for non-English text that transliterates to ASCII.'''
    text = convert_to_ascii(text)
    text = lowercase(text)
    text = collapse_whitespace(text)
    return text

Und wenn Sie Japanisch statt Englisch lesen möchten, müssen Sie möglicherweise die Codierung in cp932 und die Bereiniger in ['transliteration_cleaners'] ändern. Dies ist eine Pipeline für nicht-englischen Text, der in ASCII transkribiert wird (eine Pipeline, die nicht-englischen Text in ASCII transkribiert). Ich frage mich daher, ob dies für einen Moment für japanische Eingaben geeignet ist. Überlegen. Ich dachte auch.

Die Konvertierung funktioniert jedoch nicht

Dies ist das Ausgabeergebnis der print () -Anweisung, die def get_text hinzugefügt wurde. Ich konnte bestätigen, dass der "Test" der flachen und einzelnen Pseudonyme erfolgreich konvertiert wurde. Andererseits wurde Kanji in chinesische Silben umgewandelt.

python


Epoch: 0
Es ist ein Test.
tesutodesu.
Tokyo Patent Approval Office
dong jing te xu xu ke ju
Mike wird getestet.
maikunotesutozhong .

Es ist nicht so gut, wenn nur flaches Kana und ein Kana

Zunächst wird eine Bibliothek namens Unitecode für die Konvertierung von Japanisch (Unicode) nach ASCII verwendet.

python


from unidecode import unidecode

def convert_to_ascii(text):
    return unidecode(text)

Ich habe einige Konvertierungen für diesen Unitecode gesehen.

python


# coding: cp932
from unidecode import unidecode

text1 = 'AIUEO'
text2 = unidecode(text1)

print(text1)
print(text2)

text1 = 'a-I-U-E-O'
text2 = unidecode(text1)

print(text1)
print(text2)

text1 = 'Kompatibilität'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Beratung'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Diesen Weg'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Kotei'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Koote'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Kotei'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Dies'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Dies-War'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Katze'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Katze'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Kanai'
text2 = unidecode(text1)
print(text1)
print(text2)

text1 = 'Krabbe'
text2 = unidecode(text1)
print(text1)
print(text2)

......

AIUEO
aiueo
a-I-U-E-O
aiueo
Kompatibilität
Xiang Xing
Beratung
Xiang Tan
Diesen Weg
koutei
Kotei
koutei
Koote
kootei
Kotei
kotei
Dies
ko~tei
Dies-War
ko-tei
Katze
kiyatsuto
Katze
kiyatsuto
Kanai
kani
Krabbe
kani

・ Kanji wird ins Chinesische konvertiert ・ "Aiuuyayuyo" ist dasselbe wie "Aiueoya Yuyotsu" · "-" Wird nicht erkannt. ・ Die Konvertierung von "kani" und "kanai" ist gleich Es gibt viele Probleme.

Daher ist unitecode überhaupt nicht für die japanische Konvertierung geeignet.

Beispiel für Pykakasi

Bei Verwendung von Pykakasi wurde es wie folgt. Die unvollständige Konvertierung von Unidecode wurde verbessert. Außerdem fügt .setMode ('s', True) automatisch ein Leerzeichen für jedes Wort ein.

python


# coding: cp932
from pykakasi import kakasi

kakasi = kakasi()

kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
kakasi.setMode('E', 'a')
kakasi.setMode('s', True)

conv = kakasi.getConverter()

text = 'Aiueo und Aiueo.'
print(conv.do(text))

text = 'Kompatibilität und Beratung'
print(conv.do(text))

text = 'Katze und Katze'
print(conv.do(text))

text = 'Dateien und Dateien'
print(conv.do(text))

text = 'Kotei Kotei Kotei Kotei Kotei Kotei'
print(conv.do(text))

text = 'Tokyo Patent Approval Office'
print(conv.do(text))

text = 'Einfach und Krabben'
print(conv.do(text))
aiueo, to aiueo.
aishou to soudan
kyatto to kiyatsuto
fairu to fuairu
koutei  to  koutei  to  kootei  to  kootei  to  ko ~ tei
toukyou tokkyo kyoka kyoku
kan'i to kani

pyopenjtalk Beispiel

Müssen Sie OpenJTalk installieren? In diesem Fall scheint es nicht durch Worte, sondern durch Silben zerlegt zu werden. Ich weiß nicht, was besser durch Wörter zu teilen ist (vielleicht hängt es vom Lernmodell ab)

python


import pyopenjtalk

print(pyopenjtalk.g2p("Hallo"))
'k o N n i ch i w a'

Zusammenfassung

Der Unitecode der Tacotron2-Serie ist nicht für japanische Eingaben geeignet, und es ist ein Fehler, ** transliteration_cleaners zu verwenden. ** Wenn Sie die Trainingsdaten ins Japanische übersetzen möchten, sollten Sie daher Ihre eigenen japanease_cleaners in text / cleaners.py erstellen. (Oder bereiten Sie Trainingsdaten vor, die im Voraus in Romaji konvertiert wurden?)

Recommended Posts

Unsicherheit des japanischen Unite-Codes in der Tacotron 2-Serie
Unsicherheit des japanischen Unite-Codes in der Tacotron 2-Serie
Lernen Sie die Kategorisierung japanischer Dokumente mit spaCy / GiNZA (Fehler)
In Python geschriebener Fourier-Serien-Verifizierungscode
Umgang mit Zeichencodes von Dateien in IronPython
Vergleich japanischer Konvertierungsmodule in Python3
R: Verwenden Sie im Skript Japanisch anstelle von Japanisch
Eine Code-Sammlung, die häufig in persönlichem Python verwendet wird
Speichern Sie Japanisch (Multibyte-Zeichenfolge) in sqlite3 von Python
Ruby, Python-Codefragment Ausführung der Auswahl in Emacs
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird
Listen Sie schnell mehrere Textzeilen auf, die Sie in Ihren Code schreiben