Spaces:
Build error
Build error
import os | |
import pickle | |
import warnings | |
import numpy as np | |
from FeaturesExtractor import FeaturesExtractor | |
warnings.filterwarnings("ignore") | |
class GenderIdentifier: | |
def __init__(self, females_files_path, males_files_path, females_model_path, males_model_path): | |
self.females_training_path = females_files_path | |
self.males_training_path = males_files_path | |
self.error = 0 | |
self.total_sample = 0 | |
self.features_extractor = FeaturesExtractor() | |
# load models | |
self.females_gmm = pickle.load(open(females_model_path, 'rb')) | |
self.males_gmm = pickle.load(open(males_model_path, 'rb')) | |
def process(self): | |
files = self.get_file_paths(self.females_training_path, self.males_training_path) | |
# read the test directory and get the list of test audio files | |
for file in files: | |
self.total_sample += 1 | |
print("%10s %8s %1s" % ("--> TESTING", ":", os.path.basename(file))) | |
vector = self.features_extractor.extract_features(file) | |
winner = self.identify_gender(vector) | |
expected_gender = file.split("/")[1][:-1] | |
print("%10s %6s %1s" % ("+ EXPECTATION",":", expected_gender)) | |
print("%10s %3s %1s" % ("+ IDENTIFICATION", ":", winner)) | |
if winner != expected_gender: self.error += 1 | |
print("----------------------------------------------------") | |
accuracy = ( float(self.total_sample - self.error) / float(self.total_sample) ) * 100 | |
accuracy_msg = "*** Accuracy = " + str(round(accuracy, 3)) + "% ***" | |
print(accuracy_msg) | |
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) ] | |
files = females + males | |
return files | |
def identify_gender(self, vector): | |
# female hypothesis scoring | |
is_female_scores = np.array(self.females_gmm.score(vector)) | |
is_female_log_likelihood = is_female_scores.sum() | |
# male hypothesis scoring | |
is_male_scores = np.array(self.males_gmm.score(vector)) | |
is_male_log_likelihood = is_male_scores.sum() | |
print("%10s %5s %1s" % ("+ FEMALE SCORE",":", str(round(is_female_log_likelihood, 3)))) | |
print("%10s %7s %1s" % ("+ MALE SCORE", ":", str(round(is_male_log_likelihood,3)))) | |
if is_male_log_likelihood > is_female_log_likelihood: winner = "male" | |
else : winner = "female" | |
return winner | |
if __name__== "__main__": | |
gender_identifier = GenderIdentifier("TestingData/females", "TestingData/males", "females.gmm", "males.gmm") | |
gender_identifier.process() |