[PYTHON] Incertitude du code d'unité japonais dans la série Tacotron 2

introduction

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.

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)

Lors de l'apprentissage avec vos propres données d'entrée japonais

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)

image.png 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.

Mais la conversion ne fonctionne pas

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 .

Ce n'est pas si bon si seulement un kana ordinaire et un kana

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.

Exemple de pykakasi

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

exemple de pyopenjtalk

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'

Résumé

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

Incertitude du code d'unité japonais dans la série Tacotron 2
Incertitude du code d'unité japonais dans la série Tacotron 2
Apprendre la catégorisation de documents japonais avec spaCy / GiNZA (échec)
Code de vérification de la série Fourier écrit en Python
Gestion des codes de caractères des fichiers en IronPython
Comparaison des modules de conversion japonais en Python3
R: Utilisez le japonais au lieu du japonais dans le script
Une collection de code souvent utilisée dans Python personnel
Stocker le japonais (chaîne de caractères multi-octets) dans sqlite3 de python
Ruby, exécution de fragments de code Python de la sélection dans Emacs
Liste du code Python utilisé dans l'analyse de Big Data
Répertoriez rapidement plusieurs lignes de texte que vous écrivez dans votre code