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