[PYTHON] Proposition de conversion vocale multi-haut-parleurs et de morphing vocal par RelGAN-VM

Imakita Sangyo

Il existe un modèle de conversion d'image appelé RelGAN! Appliquez-le à la conversion vocale! Vous pouvez faire du morphing de voix!

introduction

Le nombre d'hommes qui veulent être de belles filles augmente. Au contraire, il y a beaucoup de femmes qui veulent être de beaux garçons. Ces dernières années, cette tendance est devenue particulièrement perceptible avec la popularité du YouTuber virtuel. En ce qui concerne l'apparence, des MMD de la technologie CG et Live2D qui peuvent déplacer des illustrations apparaissent, et cela entre dans une ère où vous pouvez progressivement vous transformer en ce que vous voulez être, mais vous voulez être la voix d'une jolie fille ou la voix d'un garçon cool. Est également l'un des gros problèmes. Dans cet article, nous proposons une conversion de qualité vocale entre plusieurs haut-parleurs à l'aide d'un modèle appelé RelGAN-VM et un morphing de qualité vocale qui crée une voix intermédiaire entre deux haut-parleurs.

En lisant cet article

Dans cet article, des mots relativement difficiles volent. J'ai l'intention de faire un supplément minimum, mais cela demande quelques connaissances. Plus précisément, il est écrit sur la base des connaissances suivantes.

Si vous effectuez une recherche, vous trouverez de nombreux articles plus faciles à comprendre que ce que les auteurs de cet article expliquent, donc si vous trouvez un terme ou un mot que vous ne comprenez pas, veuillez effectuer une recherche (lancer rond).

Recherches ou articles antérieurs et connexes

Recherche précédente

CycleGAN-VC convertit la qualité de la voix entre deux haut-parleurs et CycleGAN-VC2 améliore les performances. StarGAN-VC convertit la qualité vocale entre plusieurs haut-parleurs, et StarGAN-VC2 améliore encore les performances et propose un morphing de qualité vocale.

__ Articles connexes (y compris les liens externes) __

Une qualité vocale virtuelle YouTuber est convertie à l'aide d'un convertisseur basé sur CycleGAN. Par une méthode prudente, il montre des performances de conversion étonnantes tout en étant basé sur un spectrogramme.

La voix de l'auteur de l'article est échangée contre la qualité vocale de "VOICEROID Yukari Yuzuki" en utilisant une méthode basée sur pix2pix. Il s'agit également de performances élevées.

Méthode proposée

Dans cet article, RelGAN: Multi-Domain Image-to-Image Translation via Relative Attributes (ci-après dénommé RelGAN) et RelGAN-VM basé sur CycleGAN-VC2 sont utilisés. Je vais proposer. Pour une explication détaillée de RelGAN et CycleGAN-VC2, veuillez vous référer à certains des auteurs qui ont écrit des articles très clairs (les auteurs de ces articles seront appelés Lento).

Conversion parallèle et conversion non parallèle

Conversion parallèle

Vous avez besoin du même contenu de prononciation, des mêmes informations d'échelle et des mêmes données de synchronisation vocale. Ce ne sont pas les mêmes, vous devez donc les aligner. Étant donné que la source de conversion et la destination de conversion nécessitent des données avec le même contenu autre que la qualité de la voix, la création de l'ensemble de données demande beaucoup d'efforts, mais la quantité de données est relativement petite. "J'ai essayé de faire une voix liée à Yuzuki avec la puissance du deep learning" semble adopter la conversion parallèle.

Conversion non parallèle

Apprenez avec des ensembles de données avec différents contenus d'énoncés, des informations sur les syllabes et un timing d'énonciation. Il est relativement facile de créer un ensemble de données car il ne nécessite pas d'alignement et il vous suffit de lire le texte à haute voix. La conversion non parallèle est adoptée pour la méthode basée sur CycleGAN et StarGAN. En outre, cette implémentation et le RelGAN d'origine utilisent également une conversion non parallèle.

Structure du réseau

RelGAN-VM Generator and Discriminator sont basés sur CycleGAN-VC2, Generator is Input with Relative attributes concatenate, Discriminator supprime la convolution de la couche finale, $ D_ {real} $, $ D_ {interp} $, $ Il se divise en trois parties, D_ {match} $. Voir Implémentation pour plus de détails.

Fonction de perte

La fonction de perte de la base RelGAN est la suivante. Cette implémentation n'a pas utilisé la régularisation orthogonale.

{\min_{D}}L_{D}=-L_{adv}+{\lambda_1}L_{match}^D+{\lambda_2}L_{interp}^D
{\min_{G}}L_{G}=L_{adv}+{\lambda_1}L_{match}^G+{\lambda_2}L_{interp}^G+{\lambda_3}L_{cycle}+{\lambda_4}L_{self}

Lors de l'entraînement avec cette fonction de perte, la réduction du mode s'est produite à environ 30000 étapes, de sorte que cette implémentation ajoute des restrictions en plus de celles-ci. Triangle consistency loss Sélectionnez 3 domaines parmi N et appelez-les A, B, C. La différence entre l'entrée et la sortie lorsque le domaine est converti de A → B → C → A est considérée comme la perte. Lors de la conversion du domaine A en B, nous écrirons l'image d'entrée comme $ x $, les attributs relatifs comme $ v_ {ab} $ et le générateur comme $ G (x, v_ {ab}) . La formule est la suivante. $ L_{tri}=||x - G(G(G(x, v_{ab}), v_{bc}), v_{ca})||1 $$ Backward consistency loss La perte de type perte de cohérence de cycle est prise même pour la sortie convertie par le taux d'interpolation $ {\ alpha} . La formule est la suivante. $ L{back}=||x - G(G(x, {\alpha}v_{ab}), -{\alpha}v_{ab})||_1 $$

Mode seeking loss Cette méthode a été proposée dans Mode Seeking Generative Adversarial Networks for Diverse Image Synthesis. Quelqu'un a écrit un commentaire en japonais, veuillez donc vous référer à [Dernier article / cGANs] Terme de régularisation qui peut résoudre la réduction de mode. S'il te plait donne moi. Pour $ I_a = G (z_a) $, $ I_b = G (z_b) $ converti à partir des variables latentes $ z_a $ et $ z_b $ $ \frac{d_I(I_a, I_b)}{d_z(z_a, z_b)} $ Semble être le problème de la maximisation ($ d_I (I_a, I_b) $ est la distance entre les images générées et $ d_z (z_a, z_b) $ est la distance entre les variables latentes). Sur cette base, cette implémentation a ajouté une perte pour minimiser l'équation suivante. $ L_{ms}=\frac{{||x_1-x_2||_ 1}}{||G(x_1,v_{ab})-G(x_2,v_{ab})||_1} $

En raison de l'addition de ces pertes, la perte du côté du générateur est la suivante. $ {\min_{G}}L_{G}=L_{adv}+{\lambda_1}L_{match}^G+{\lambda_2}L_{interp}^G+{\lambda_3}L_{cycle}+{\lambda_4}L_{self}+{\lambda_5}L_{tri}+{\lambda_6}L_{back}+{\lambda_7}L_{ms} $

Expérience

L'implémentation est téléchargée sur Github. Il est modifié sur la base de GAN-Voice-Conversion, qui est l'implémentation de CycleGAN-VC2 par M. njellinas. Lors de la réécriture à RelGAN-like, j'ai fait référence au document officiel et à l'implémentation de RelGAN par Lento.

base de données

J'ai emprunté le corpus JVS (discours polyvalent japonais) en tant qu'ensemble de données. J'ai utilisé parallel100 de jvs010, jvs016, jvs042, jvs054 comme données d'entraînement. J'ai également utilisé environ 5 fichiers de nonpara30 de chaque haut-parleur pour la validation. Le parallel100 stocke beaucoup de contenu d'énoncé, d'informations d'échelle et de synchronisation d'énoncé (pas parfait), mais cette fois, il sera traité comme des données non parallèles. Écrivez l'impression de chaque orateur de manière subjective.

Prétraitement

World Encapsuleur Python, pyWorld pour l'extraction de la quantité de fonctionnalités blob / master / README.md) est utilisé. Cependant, il faut un certain temps avant d'extraire les fonctionnalités.

Suppression silencieuse

S'il y a beaucoup de silence dans les données d'apprentissage, il peut être appris comme une caractéristique en soi. De plus, comme le programme se terminait parfois sans erreur lors de l'extraction de la quantité de fonctionnalité, nous avons décidé de supprimer le silence (il peut y avoir division à 0 ou divergence à l'infini quelque part, recherche de la cause requise ). Il existe différentes méthodes pour supprimer le silence, mais cette fois j'ai simplement utilisé librosa. Il est également possible de prendre $ f_o $ une fois et d'extraire la partie $ f_o> 0 $.

Alignement de la longueur des données vocales

Pour créer un lot, sélectionnez d'abord une donnée audio au hasard, puis découpez au hasard les données d'entité de la longueur spécifiée. Ici, si la longueur de chaque donnée audio est différente, chaque échantillon ne sera pas sélectionné avec une probabilité égale. Afin d'éviter cela, toutes les voix sont combinées une fois, puis séparées en données vocales de longueur égale.

Extraction de la quantité de caractéristiques

La quantité de fonctionnalités est extraite par pyWorld pour les données audio séparées. Honnêtement, je ne comprends pas ce que je fais (gros problème), mais j'ai demandé $ f_o $ et MCEP $ sp $, et à partir de là $ {\ mu_ {f_o}} $, $ {\ sigma_ {f_o}} Est-ce un endroit où $, $ {\ mu_ {sp}} $, $ {\ sigma_ {sp}} $ est calculé et $ sp $ est normalisé et enregistré?

Apprentissage

À ce stade, vous pouvez enfin commencer l'apprentissage en profondeur. Le modèle et le réseau à utiliser sont tels que décrits ci-dessus. Les MCEP normalisés ont 36 dimensions et vous pouvez entrer 128 images sélectionnées au hasard. De plus, il existe une certaine probabilité (0,0005%) d'insérer un silence complet dans le lot. La taille du lot est de 8. Par conséquent, la taille d'entrée est (8, 36, 128) ((1, 36, 128) lors de la déduction). GAN a utilisé LSGAN. Je suis allé sur la route royale car il est également utilisé dans CycleGAN-VC2 et StarGAN-VC2. Adam est utilisé comme optimiseur et l'apprentissage commence à 0,0002 pour Generator et 0,0001 pour Discriminator pour un apprentissage tardif, et chaque étape est atténuée de 0,9999 fois. $ {\ beta_1} $ = 0,5, $ {\ beta_2} $ = 0,999. La fonction de perte $ {\ lambda} $ est $ {\ lambda_1} = 1, {\ lambda_2} = 10, {\ lambda_3} = 10, {\ lambda_4} = 10, {\ lambda_5} = 5, {\ lambda_6 } = 5, {\ lambda_7} = 1 $. De plus, $ {\ lambda_5} et {\ lambda_6} $ sont atténués 0,9 fois tous les 10 000 pas. Dans cette condition, 100 000 pas ont été formés (environ 62 heures avec RTX 2070). En conséquence, la conversion n'a pas bien fonctionné après 80 000 étapes, donc dans cet article, nous évaluerons en utilisant le modèle formé à 80 000 étapes. La figure ci-dessous est un graphique de la perte par TensorBoard. Vous pouvez voir que la perte Adversarial du côté du Discriminateur monte en flèche (le côté du Générateur monte en flèche) autour de 80 000 pas. losses.png

Génération et évaluation de voix

Mettez l'audio généré sur Github. Je l'ai rendu disponible sur YouTube.

Reconstruction de la voix

Le réseau neuronal formé est un modèle qui convertit uniquement les MCEP normalisés, et en utilisant cette statistique et d'autres, il est à nouveau converti en voix par pyWorld. Le flux de conversion lors de la conversion du domaine A au domaine B à un taux d'interpolation de $ {\ alpha} $ est décrit ci-dessous.

  1. Chargez wav.
  2. Obtenez $ f_ {o_A} $, $ sp_A $, $ ap_A $ (index apériodique) à partir du wav lu par pyWorld.
  3. Transformez $ f_ {o_A} $ avec la formule suivante. Utilisez l'interpolation linéaire pour calculer $ \ mu_ {f_ {o_ {\ alpha}}} $ et $ {\ sigma_ {f_ {o_ {\ alpha}}}} $ (l'écart type doit être renvoyé à la dispersion une fois) Ou vérification requise). $ \mu_{f_{o_{\alpha}}}=(1-{\alpha})\mu_{f_{o_A}}+{\alpha}\mu_{f_{o_B}} $ $ {\sigma_{f_{o_{\alpha}}}}=(1-{\alpha})\sigma_{f_{o_A}}+{\alpha}\sigma_{f_{o_B}} $ $ f_{o_\alpha}=\frac{f_{o_A}-\mu_{f_{o_A}}}{\sigma_{f_{o_A}}}{\sigma_{f_{o_{\alpha}}}}+\mu_{f_{o_{\alpha}}} $
  4. Normaliser $ sp_A . $ sp_{A_{norm}}=\frac{sp_A-\mu_{sp_A}}{\sigma_{sp_{A}}} $$
  5. Demandez au réseau neuronal de déduire $ sp_ {A_ {norm}} . $ sp_{{\alpha}_{norm}}=G({sp}_{A_{norm}}, {\alpha}v_{ab}) $$
  6. Dénormaliser $ sp_ {{\ alpha} _ {norm}} $. Comme d'habitude, l'interpolation linéaire est utilisée pour la moyenne et l'écart type.
\mu_{sp_{{\alpha}}}=(1-{\alpha})\mu_{sp_{A}}+{\alpha}\mu_{sp_{B}}
{\sigma_{sp_{{\alpha}}}}=(1-{\alpha})\sigma_{sp_{A}}+{\alpha}\sigma_{sp_{B}}
{sp_{\alpha}}={\mu_{sp_{{\alpha}}}}+{\sigma_{sp_{{\alpha}}}}{sp_{{\alpha}_{norm}}}
  1. Resynthétisez la voix par World à partir des $ f_ {o_ \ alpha} $, $ {sp_ {\ alpha}} $, $ ap_A $ obtenus. Notez que l'indicateur d'apériodicité $ ap_A $ utilise l'indicateur d'origine.
  2. Normaliser et exporter le volume selon les besoins.

C'est tout.

Évaluation subjective

Je ne sais pas comment faire une évaluation quantitative, je vais donc l'évaluer à ma discrétion (problème). Je pense que la conversion en haut-parleurs masculins (jvs042, jvs054) a fonctionné dans une certaine mesure à partir de n'importe quel haut-parleur. D'autre part, la conversion en haut-parleurs féminins (jvs010, jvs016) a une faible précision de conversion entre le même sexe et le sexe opposé, et est particulièrement visible dans la conversion en jvs010. De plus, le morphing est assez subtil, n'est-ce pas seulement que $ f_o $ a changé? Certains des résultats sont les suivants. Vous pouvez voir qu'il se transforme entre le sexe opposé, mais je sens que le naturel est faible.

Résumé

Dans cet article, nous avons proposé RelGAN-VM et mené des expériences sur la conversion de la qualité vocale et le morphing de la qualité vocale. Nous sommes fiers que la conversion en haut-parleurs masculins soit comparable à la méthode existante, mais la précision de la conversion des haut-parleurs masculins en haut-parleurs féminins, en particulier vers les voix aiguës, n'est pas très élevée. fait. Le morphing de la qualité vocale a été proposé dans StarGAN-VC2 comme une recherche précédente, et c'était un peu insuffisant pour écrire dans un article, mais je pensais que ce serait un gaspillage de le jeter, alors j'ai décidé de le soumettre à Qiita. C'est difficile d'être une belle fille.

Future works Dans cet article, seule la qualité vocale entre les enceintes a été convertie. Par exemple, Voice Actor Statistics Corpus publie 9 types d'ensembles de données dans lesquels 3 locuteurs lisent à haute voix avec 3 types d'émotions. Si vous apprenez cela, vous pourrez peut-être transformer non seulement la qualité de la voix de l'orateur, mais également les émotions. De plus, la structure du réseau, la fonction de perte et les hyper paramètres de cette implémentation ne sont pas encore terminés, et je pense qu'il y a place à amélioration. Je souhaite continuer à envisager des modèles de conversion vocale plus performants.

Précautions pour la conversion vocale

Ce n'est pas un bon sujet, mais Les voix personnelles ont aussi des droits. Par exemple, si vous utilisez la conversion de qualité vocale pour usurper l'identité de la voix d'une autre personne à des fins commerciales ou abusives sans autorisation, vous serez sévèrement puni en tant que violation de la vie privée ou violation des droits d'auteur. Je vais. Bien sûr, vous êtes libre d'utiliser cette implémentation pour entendre la voix des autres, mais lorsque vous utilisez des données audio qui n'ont pas été protégées par des droits d'auteur, veuillez les utiliser uniquement pour un usage personnel. Veuillez noter qu'il sera gris s'il peut être consulté par un nombre indéterminé de personnes, même s'il n'est pas commercial. Par exemple, le corpus JVS utilisé dans cette expérience a les conditions d'utilisation suivantes.

__ Les données texte proviennent du corpus JSUT et ses informations de licence sont décrites dans le corpus JSUT. Les informations d'étiquette sont sous licence CC-BY-SA 4.0. Les données audio ne peuvent être utilisées que dans les cas suivants. Recherche dans les institutions académiques Recherche non commerciale (y compris la recherche dans des organisations commerciales) Utilisation personnelle (y compris les blogs) Si vous souhaitez l'utiliser à des fins commerciales, veuillez voir ci-dessous. La redistribution de ces données audio n'est pas autorisée, mais il est possible de publier une partie du corpus (par exemple, environ 10 phrases) sur votre page web ou votre blog. __

De plus, l'auteur n'assume aucune responsabilité pour l'accident causé par l'utilisation de cette implémentation et la conversion de la qualité vocale.

Merci

Les personnes du laboratoire qui nous ont donné des conseils en postant cet article, en particulier Rugiu-kun, nous ont donné beaucoup d'avis techniques sur World et nous ont donné des informations erronées. J'ai pu le réparer. Je n'ai pas pu atteindre son niveau requis, mais c'était une bonne étude. Nous tenons également à remercier ceux qui ont téléchargé des articles, des articles, des implémentations et des bibliothèques clairs, ainsi que ceux du laboratoire qui ont publié des ensembles de données utiles. Toutes les lacunes de cet article sont de ma responsabilité.

Réflexion

Que faites-vous sans rédiger une thèse de fin d'études orz

Recommended Posts

Proposition de conversion vocale multi-haut-parleurs et de morphing vocal par RelGAN-VM
Conversion entre mots singuliers et pluriels
Approximation de bas rang des images par HOSVD et HOOI
Calcul des indicateurs techniques par TA-Lib et pandas
Apprentissage parallèle du deep learning par Keras et Kubernetes
Génération de dialogue de caractères et conversion de ton par CVAE