[PYTHON] J'ai essayé de classer les voix des acteurs de la voix

J'ai essayé d'identifier la voix d'un doubleur dans la pratique de l'apprentissage automatique. Notez la procédure sous forme de mémo.

Chose que tu veux faire

Tout d'abord, apprenons la voix de l'acteur vocal (la voix de la radio, etc.), et vérifions à quel point elle peut être déterminée en incluant la voix comme données de test. Ensuite, je voudrais tester si la voix de l'animation peut être prédite à partir de la voix de l'acteur vocal.

1. Premièrement, collectez des données

Cette fois, j'ai téléchargé une vidéo radio de 5 acteurs de la voix de Lady Go sur Nico Nico Video. Puisqu'il s'agit de .mp4 tel quel, convertissez-le en wav.

ffmpeg -i hoge.mp4 -map 0:1 hoge.wav 

C'est acceptable!

Ensuite, ce fichier wav a été divisé en 30 secondes chacun.

sox hoge.wav hogehoge.wav trim 0 30 : newfile : restart

Ce n'est pas encore fini. À partir de là, j'ai supprimé manuellement la partie de la scène de changement de coin, le coin où la musique était jouée et la partie où les voix d'autres personnes étaient incluses. Cependant, je ne peux m'empêcher d'ignorer le fait que la petite musique joue toujours en arrière-plan. Comment puis-je minimiser ou éliminer l'influence de ce bruit de fond?

Pour le moment, la collecte des données est terminée!

2. Extraire les fonctionnalités des données

L'intensité de fréquence ne devrait-elle pas être la quantité de caractéristiques? Transformée de Fourier Rapide! cependant, Il est préférable d'utiliser le coefficient Mel Frequency Keptram (MFCC) pour le système d'apprentissage automatique pratique d'O'Reilly! Je l'ai écrit, donc je vais l'utiliser cette fois.

En regardant diverses choses, il semble que MFCC soit utilisé comme une quantité caractéristique typique dans la reconnaissance vocale actuelle, et les caractéristiques de la perception de la voix humaine sont prises en considération. Cependant, le MFCC ne semble pas contenir d'informations sur la hauteur. Il semble que Kepstram puisse extraire le composant de hauteur, donc peut-être que c'est une meilleure quantité de fonctionnalités, mais j'ai décidé d'utiliser MFCC pour le moment.

Une bibliothèque appelée Takalbox Scikit est utilisée pour calculer MFCC. Enregistrez le résultat calculé dans un cache et réutilisez-le.

from scikits.talkbox.features import mfcc
import scipy
from scipy import io
from scipy.io import wavfile
import glob
import numpy as np
import os

def write_ceps(ceps,fn):
	base_fn,ext = os.path.splitext(fn)
	data_fn = base_fn + ".ceps"
	np.save(data_fn,ceps)

def create_ceps(fn):
	sample_rate,X = io.wavfile.read(fn)
	ceps,mspec,spec = mfcc(X)
	isNan = False
	for num in ceps:
		if np.isnan(num[1]):
			isNan = True
	if isNan == False:
		write_ceps(ceps,fn)

D'une manière ou d'une autre, je n'ai pas compris la cause, car certains fichiers wav ne pouvaient pas être bien lus par io.wavfile.read (fn). .. Si vous calculez MFCC sans bien le lire, le résultat sera Nan, donc j'ignore cela.

Le code pour lire les données enregistrées est le suivant. name_list est une liste de noms de répertoires. Cette fois, j'ai créé un répertoire avec les noms de cinq acteurs de la voix de Lady Go et y ai sauvegardé les données.

def read_ceps(name_list,base_dir = BASE_DIRE):
	X,y = [],[]
	for label,name in enumerate(name_list):
		for fn in glob.glob(os.path.join(base_dir,name,"*.ceps.npy")):
			ceps = np.load(fn)
			num_ceps = len(ceps)
			X.append(np.mean(ceps[:],axis=0))
			y.append(label)
	return np.array(X),np.array(y)

3. Apprenez et prédisez

Cette fois, la machine à vecteurs de support (SVM) a été utilisée pour la formation en utilisant la quantité de caractéristiques créée en 2. Le code est ci-dessous.

import MFCC #C'est ce que j'ai fait en 2
from matplotlib.pyplot import specgram
from sklearn.metrics import confusion_matrix
from sklearn.svm import LinearSVC
from sklearn.utils import resample
from matplotlib import pylab
import numpy as np

name_list = ["Uesaka_Sumire","Komatsu_Mikako","Okubo_Rumi","Takamori_Natsumi","Mikami_Shiori"]

x,y = MFCC.read_ceps(name_list)
svc = LinearSVC(C=1.0)
x,y = resample(x,y,n_samples=len(y))
svc.fit(x[150:],y[150:])
prediction = svc.predict(x[:150])
cm = confusion_matrix(y[:150],prediction)

Après avoir lu les données, je les ai mélangées avec resample (), et j'ai essayé les 151e et suivantes données comme données d'enseignant et les 150e et suivantes comme données de test.

confusion_matrix est une matrice mixte. La distribution des résultats prévus pour chaque étiquette est indiquée pour les données de test. Tracons le graphique en utilisant ceci.

4. Tracez le graphique

Tracons le taux de réponse correct en utilisant la matrice mixte des résultats de prédiction obtenus en 3. Normaliser les valeurs de la matrice mixte pour obtenir le taux de réponse correct.

def normalisation(cm):
	new_cm = []
	for line in cm:
		sum_val = sum(line)
		new_array = [float(num)/float(sum_val) for num in line]
		new_cm.append(new_array)
	return new_cm

Tracez le graphique.

def plot_confusion_matrix(cm,name_list,name,title):
	pylab.clf()
	pylab.matshow(cm,fignum=False,cmap='Blues',vmin=0,vmax=1.0)
	ax = pylab.axes()
	ax.set_xticks(range(len(name_list)))
	ax.set_xticklabels(name_list)
	ax.xaxis.set_ticks_position("bottom")
	ax.set_yticks(range(len(name_list)))
	ax.set_yticklabels(name_list)
	pylab.title(title)
	pylab.colorbar()
	pylab.grid(False)
	pylab.xlabel('Predict class')
	pylab.ylabel('True class')
	pylab.grid(False)
	pylab.show()

résultat.

スクリーンショット 2015-06-23 1.34.50.png

Le taux de réponse correcte était de 100%, et il était de presque 100%, peu importe le nombre de fois que j'ai essayé.

Ensuite, essayez la voix d'animation comme données de test. Cependant, il était difficile de collecter des données, et seuls un ou deux personnages ont été collectés pour chaque acteur vocal, et le nombre de données lui-même est faible (environ 90 modèles pour 5 personnes au total).

Le résultat est ci-dessous.

素の声からアニメの声を予測.png

Cela n'a pas du tout fonctionné!

De plus, j'ai testé la voix originale en utilisant la voix de l'animation comme données de l'enseignant.

アニメの声から素の声を予測.png

Bien sûr, cela est également inutile.

5. Examen et vérification

Le surapprentissage vient à l'esprit comme la raison pour laquelle la précision est devenue très mauvaise lors de la discrimination de la voix de l'anime. Par défaut, la fonction mfcc () n'a que 13 coefficients dans la trame audio, ce qui est très grand, donc la valeur obtenue en faisant la moyenne de chaque coefficient dans toutes les trames est utilisée comme quantité de caractéristiques. En d'autres termes, le nombre de vecteurs de caractéristiques est de 13, et il est peu probable que cela ait entraîné un surapprentissage.

Par conséquent, je pensais que le biais dans les données utilisées aurait pu conduire à une diminution de la capacité de généralisation. Puisque toutes les données utilisées sont des voix dans la radio, il n'y a pas beaucoup de différence dans les composantes de fréquence contenues dans chaque acteur vocal, ce qui peut avoir conduit à une diminution de la capacité de généralisation.

Par conséquent, j'ai ajouté une partie de la voix d'anime appropriée aux données de l'enseignant et l'ai testée sur la voix d'anime restante. Quant aux données des enseignants, 2/3 est la voix de la radio et 1/3 est la voix de l'animation.

Tout d'abord, j'ai testé la voix de la radio. スクリーンショット 2015-06-23 2.40.45.png

La précision de la reconnaissance est presque de 100% comme avant, et ce sera à ce sujet peu importe le nombre de fois que vous le faites.

Ensuite, testons la voix de l'anime.

スクリーンショット 2015-06-23 2.40.59.png

La précision de la reconnaissance s'est considérablement améliorée! Après tout, il semble que la capacité de généralisation ait été considérablement réduite parce que j'apprenais uniquement avec la voix de la radio.

6. Conclusion

Il s'avère que dans l'apprentissage automatique, nous devons toujours penser aux dangers du surapprentissage. Et en plus de cela, il est nécessaire de mesurer avec précision la capacité de généralisation. À cet égard, il n'est pas bon que le classificateur ne soit évalué que par le taux de réponse correct cette fois. Pour évaluer le classificateur, utilisez la courbe de taux de rappel de précision ou la courbe ROC (comme indiqué dans le livre).

référence

Système d'apprentissage automatique pratique O'Reilly Japon

Recommended Posts

J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de déplacer le ballon
J'ai essayé d'estimer la section.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé de résumer la commande umask
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de reconnaître le mot de réveil
J'ai essayé de classer le texte en utilisant TensorFlow
J'ai essayé de résumer la modélisation graphique.
J'ai essayé d'estimer le rapport de circonférence π de manière probabiliste
J'ai essayé de toucher l'API COTOHA
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de visualiser la condition commune des téléspectateurs de la chaîne VTuber
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
J'ai essayé de visualiser la tranche d'âge et la distribution des taux d'Atcoder
J'ai essayé de transcrire les actualités de l'exemple d'intégration commerciale sur Amazon Transcribe
zoom J'ai essayé de quantifier le degré d'excitation de l'histoire lors de la conférence
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
J'ai essayé de résoudre 100 traitements linguistiques Knock version 2020 [Chapitre 3: Expressions régulières 25-29]
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'extraire automatiquement les mouvements des joueurs Wiire avec un logiciel
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé de résumer la manière logique de penser l'orientation objet.
J'ai essayé de trouver l'itinéraire optimal du pays des rêves par recuit (quantique)
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé de visualiser le texte du roman "Weather Child" avec Word Cloud
[Linux] J'ai essayé de vérifier la méthode de confirmation sécurisée du FQDN (CentOS7)
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
En utilisant COTOHA, j'ai essayé de suivre le cours émotionnel de la course aux meros.
J'ai essayé de vérifier le résultat du test A / B avec le test du chi carré
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé l'analyse par grappes de la carte météo
J'ai essayé d'informer Slack de la mise à jour de Redmine
J'ai essayé de trouver le rapport de circonférence par 100 millions de chiffres
Qiita Job J'ai essayé d'analyser le travail
Je souhaite personnaliser l'apparence de zabbix
J'ai essayé de classer les boules de dragon par adaline