Spaces:
Sleeping
Sleeping
| import os | |
| import pickle | |
| import warnings | |
| import numpy as np | |
| warnings.filterwarnings("ignore") | |
| class GenderIdentifier: | |
| def __init__(self, females_files_path,males_model_path, females_model_path ,males_files_path): | |
| self.females_training_path = females_files_path | |
| self.males_model_path = males_model_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_path(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.identity_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): | |
| 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() | |