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.
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.
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!
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)
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.
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.
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.
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.
Bien sûr, cela est également inutile.
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.
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.
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.
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).
Système d'apprentissage automatique pratique O'Reilly Japon
Recommended Posts