def verify_speakers(input_directory, api, print_name, authorization): '''verify the speakers with each audio in the directory''' input = mylistdir(input_directory) for impulse in input: speakers_list_url = os.path.join(input_directory, impulse) speakers = mylistdir(speakers_list_url) result = {} for speaker in speakers: id = speaker speaker_url = os.path.join(speakers_list_url, speaker) print(id) audios = mylistdir(speaker_url) for audio in audios: audio_url = os.path.join(speaker_url, audio) result[id] = { "audio": audio, "result": verify(audio_url, api, id, print_name, authorization) } return result
def enrolment(audio_directory, api, id, print_name, authorization): ''' enrol the speakers in the audio directory :param audio_directory: :return: if the speaker successfully enrolled to the system ''' audios = mylistdir(audio_directory) audio_list = [] for audio in audios: audio_url = os.path.join(audio_directory, audio) audio_list.append(audio_url) # creating a post request for the speaker enrolment_url = api + 'voiceprint/' + id + '/' + print_name + '/' + '?group=' + authorization enrolment = http.request("post", enrolment_url, body=read_audio(audio_list)) result = { 'speaker': id, 'status': json.loads(enrolment.data.decode('utf-8'))['status'] } return (result)
def delete_speakers(audio_directory, api, print_name, authorization): '''remove all the speaker voice print from the speakers in the audio directory''' speakers = mylistdir(audio_directory) for speaker in speakers: delete_url = api + 'voiceprint/' + speaker + '/' + print_name + '?group=' + authorization delete_voiceprint = http.request("DELETE", delete_url) print(speaker) print(delete_voiceprint.data)
def enrol_speakers(enrol_dir, api, print_name, authorization): '''enrol all the speakers under a input directory''' speakers = mylistdir(enrol_dir) print(len(speakers), "speakers") results = [] for speaker in speakers: results.append( enrolment(os.path.join(enrol_dir, speaker), api, speaker, print_name, authorization)) return results
def main(auraya_config, exp_config): #read configure file print(exp_config['title']) api = auraya_config['api'] authorization = auraya_config['authorization'] print_name = auraya_config['print_name'] enrol_directory = os.path.join( exp_config['output_directory'] + '/' + exp_config['channel'], os.path.join( 'enrol', exp_config['enrol_treatment'] + str(exp_config['enrol_signal_to_noise_ratio']))) verify_directory = os.path.join( exp_config['output_directory'] + '/' + exp_config['channel'], os.path.join( 'verify', exp_config['verify_treatment'] + str(exp_config['verify_signal_to_noise_ratio']))) re_enrol = exp_config['re_enrol'] if re_enrol == 'True': #remove the enrolled voice print print("remove all the speakers' previous voice print") delete_speakers(enrol_directory, api, print_name, authorization) # enrol speakers print('start enrolment') enrols = enrol_speakers(enrol_directory, api, print_name, authorization) # write enrolment result into file if not os.path.exists('result/enrol'): os.makedirs('result/enrol') result_path = os.path.join("result/enrol", 'enrol_' + experiment['title'] + ".csv") f = csv.writer(open(result_path, "w")) f.writerow(["speaker", "status"]) #write header for row in enrols: f.writerow([row["speaker"], row["status"]]) # cross matching print('start cross matching') speakers = mylistdir(enrol_directory) result = [] for speaker in speakers: # read files in output/enrol audios_url = os.path.join(verify_directory, speaker) audios = mylistdir(audios_url) print(speaker) for audio in audios: audio_url = os.path.join(audios_url, audio) cm_result = json.loads( cross_match(audio_url, api, print_name, authorization, speakers).decode('utf-8')) # store the result as json in a list for match in cm_result['speakers']: if match['id'] == speaker: true_speaker = 1 else: true_speaker = 0 result.append({ "speaker": speaker, "match": match['id'], "audio": audio, "score": match['score'], "true_speaker": true_speaker, "enrol_treatment": exp_config['enrol_treatment'], "enrol_signal_to_noise_ratio": exp_config['enrol_signal_to_noise_ratio'], "verify_treatment": exp_config['verify_treatment'], 'verify_signal_to_noise_ratio': exp_config['verify_signal_to_noise_ratio'] }) return (result)
"enrol_signal_to_noise_ratio": exp_config['enrol_signal_to_noise_ratio'], "verify_treatment": exp_config['verify_treatment'], 'verify_signal_to_noise_ratio': exp_config['verify_signal_to_noise_ratio'] }) return (result) if __name__ == '__main__': with open('auraya.json', 'r', encoding='utf-8') as config_file: auraya = json.load(config_file) experiments = mylistdir("experiment") experiments.sort() for exp_json in experiments: experiment_url = "experiment/" + exp_json print(exp_json) with open(experiment_url, 'r', encoding='utf-8') as config_file: experiment = json.load(config_file) data_prep(experiment) result = main(auraya, experiment) # write file into csv result_path = os.path.join("result", experiment['title'] + ".csv")