La méthode de conversion des données textuelles en audio synthétique est appelée TextToSpeech (TTS). Je n'ai pas appris TextToSpeech cette fois, mais si les données texte sont entrées en japonais, j'enregistrerai l'histoire d'échec qui n'a pas pu être convertie avec succès en Romaji par les translation_cleaners de la série Tacotron 2.
TextToSpeech de NVIDIA comprend: Cette fois, j'ai essayé flowtron, mais il semble que l'échec du code unitaire pour l'entrée japonaise soit courant dans d'autres versions. https://github.com/NVIDIA/flowtron https://github.com/NVIDIA/mellotron https://github.com/NVIDIA/tacotron2 (Au fait, je ne connais pas la différence entre eux en détail)
Je n'ai pas préparé les données d'entraînement et n'ai pas entraîné le modèle, mais pour entraîner les données d'origine, créez vous-même la liste de fichiers comme indiqué ci-dessous.
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)
Je pense que vous devez écrire l'emplacement du fichier, le texte audio et l'ID du locuteur dans la liste des fichiers. Je pense qu'il est nécessaire d'éviter que l'identifiant du locuteur ne soit dupliqué dans les données d'entraînement dans lesquelles plusieurs haut-parleurs sont mélangés. (Peut-être)
data.py
def load_filepaths_and_text(filename, split="|"):
with open(filename, encoding='cp932') as f: #Changer le codage en cp932(Pour les fenêtres)
...
def get_text(self, text):
print(text) #ajouter à
text = _clean_text(text, self.text_cleaners)
print(text) #ajouter à
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
Et si vous voulez lire le japonais au lieu de l'anglais, vous devrez peut-être changer le codage en cp932 et changer les nettoyeurs en ['transliteration_cleaners']. Ceci est '' 'Pipeline pour le texte non anglais qui translittère en ASCII' '** (un pipeline qui translittère le texte non anglais en ASCII) **, donc je me demande si cela est approprié pour une entrée japonaise pendant un moment. pense. J'ai pensé ainsi.
C'est le résultat de la sortie de l'instruction print () ajoutée à def get_text. J'ai pu confirmer que le "test" des pseudonymes simples et plats a été converti avec succès. D'autre part, Kanji a été converti en syllabes chinoises.
python
Epoch: 0
C'est un test.
tesutodesu.
Bureau d'approbation des brevets de Tokyo
dong jing te xu xu ke ju
Test de Mike.
maikunotesutozhong .
En premier lieu, une bibliothèque appelée unitecode est utilisée pour la conversion du japonais (unicode) en ASCII.
python
from unidecode import unidecode
def convert_to_ascii(text):
return unidecode(text)
J'ai vu quelques conversions pour ce code unitaire.
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 = 'Compatibilité'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Consultation'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Par ici'
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 = 'Cette'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Cette-Était'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Chat'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Chat'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Kanai'
text2 = unidecode(text1)
print(text1)
print(text2)
text1 = 'Crabe'
text2 = unidecode(text1)
print(text1)
print(text2)
......
AIUEO
aiueo
a-I-U-E-O
aiueo
Compatibilité
Xiang Xing
Consultation
Xiang Tan
Par ici
koutei
Kotei
koutei
Koote
kootei
Kotei
kotei
Cette
ko~tei
Cette-Était
ko-tei
Chat
kiyatsuto
Chat
kiyatsuto
Kanai
kani
Crabe
kani
・ Kanji est converti en chinois ・ "Aiuuyayuyo" est le même que "Aiueoya Yuyotsu" · "-" N'est pas reconnu. ・ La conversion de "kani" et "kanai" est la même Il y a de nombreux problèmes.
Par conséquent, le code unitaire ne convient pas pour la conversion japonaise en premier lieu.
Lors de l'utilisation de pykakasi, il est devenu comme suit. La conversion incomplète de l'unidecode a été améliorée. De plus, .setMode ('s', True) insérera automatiquement un espace pour chaque mot.
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 et Aiueo.'
print(conv.do(text))
text = 'Compatibilité et consultation'
print(conv.do(text))
text = 'Chat et chat'
print(conv.do(text))
text = 'Fichiers et fichiers'
print(conv.do(text))
text = 'Kotei Kotei Kotei Kotei Kotei Kotei'
print(conv.do(text))
text = 'Bureau d'approbation des brevets de Tokyo'
print(conv.do(text))
text = 'Simple et crabe'
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
Besoin d'installer OpenJTalk? Dans ce cas, il semble être décomposé non par mot mais par syllabe. Je ne sais pas ce qui est préférable de diviser par des mots (cela dépend peut-être du modèle d'apprentissage)
python
import pyopenjtalk
print(pyopenjtalk.g2p("Bonjour"))
'k o N n i ch i w a'
Le code unitaire de la série Tacotron2 ne convient pas aux entrées japonaises, et c'est une erreur d'utiliser ** translation_cleaners. ** Par conséquent, si vous souhaitez traduire les données d'entraînement en japonais, vous devez créer vos propres japanease_cleaners dans text / cleaners.py. (Ou préparez-vous à l'avance les données d'entraînement converties en Romaji)
Recommended Posts