Spaces:
Build error
Build error
import os | |
import pickle | |
import warnings | |
import numpy as np | |
from sklearn.mixture import GMM | |
from FeaturesExtractor import FeaturesExtractor | |
warnings.filterwarnings("ignore") | |
class ModelsTrainer: | |
def __init__(self, females_files_path, males_files_path): | |
self.females_training_path = females_files_path | |
self.males_training_path = males_files_path | |
self.features_extractor = FeaturesExtractor() | |
def process(self): | |
females, males = self.get_file_paths(self.females_training_path, | |
self.males_training_path) | |
# collect voice features | |
female_voice_features = self.collect_features(females) | |
male_voice_features = self.collect_features(males) | |
# generate gaussian mixture models | |
females_gmm = GMM(n_components = 16, n_iter = 200, covariance_type='diag', n_init = 3) | |
males_gmm = GMM(n_components = 16, n_iter = 200, covariance_type='diag', n_init = 3) | |
# fit features to models | |
females_gmm.fit(female_voice_features) | |
males_gmm.fit(male_voice_features) | |
# save models | |
self.save_gmm(females_gmm, "females") | |
self.save_gmm(males_gmm, "males") | |
def get_file_paths(self, females_training_path, males_training_path): | |
# get file paths | |
females = [ os.path.join(females_training_path, f) for f in os.listdir(females_training_path) ] | |
males = [ os.path.join(males_training_path, f) for f in os.listdir(males_training_path) ] | |
return females, males | |
def collect_features(self, files): | |
""" | |
Collect voice features from various speakers of the same gender. | |
Args: | |
files (list) : List of voice file paths. | |
Returns: | |
(array) : Extracted features matrix. | |
""" | |
features = np.asarray(()) | |
# extract features for each speaker | |
for file in files: | |
print("%5s %10s" % ("PROCESSNG ", file)) | |
# extract MFCC & delta MFCC features from audio | |
vector = self.features_extractor.extract_features(file) | |
# stack the features | |
if features.size == 0: features = vector | |
else: features = np.vstack((features, vector)) | |
return features | |
def save_gmm(self, gmm, name): | |
""" Save Gaussian mixture model using pickle. | |
Args: | |
gmm : Gaussian mixture model. | |
name (str) : File name. | |
""" | |
filename = name + ".gmm" | |
with open(filename, 'wb') as gmm_file: | |
pickle.dump(gmm, gmm_file) | |
print ("%5s %10s" % ("SAVING", filename,)) | |
if __name__== "__main__": | |
models_trainer = ModelsTrainer("TrainingData/females", "TrainingData/males") | |
models_trainer.process() |