Spaces:
Configuration error
Configuration error
import argparse | |
import os | |
import json | |
import shutil | |
from datetime import datetime | |
from mvector.predict import MVectorPredictor | |
def if_not_mkdir(path): | |
if not os.path.exists(path): | |
os.mkdir(path) | |
def about(): | |
print(r""" | |
___ ___ ____ __ __ _ ______ ____ | |
/ | __ ______/ (_)___ / __ \____ _/ /_____ _________ / /_ | | / / __ \/ __ \ | |
/ /| |/ / / / __ / / __ \ / / / / __ `/ __/ __ `/ ___/ _ \/ __/ | | / / /_/ / /_/ / | |
/ ___ / /_/ / /_/ / / /_/ / / /_/ / /_/ / /_/ /_/ (__ ) __/ /_ | |/ / ____/ _, _/ | |
/_/ |_\__,_/\__,_/_/\____/ /_____/\__,_/\__/\__,_/____/\___/\__/ |___/_/ /_/ |_| | |
Audio Dataset Voiceprint Recognition Classifier by 2DIPW based on yeyupiaoling/VoiceprintRecognition-Pytorch | |
Licensed under GNU General Public License v3. Open source leads the world to a brighter future! | |
""") | |
if __name__ == "__main__": | |
about() | |
parser = argparse.ArgumentParser() | |
parser.add_argument('-m', '--model_path', type=str, default="model/", help="Path to model.") | |
parser.add_argument('-c', '--configs', type=str, default="model/config.yml", help="Path to model config file.") | |
parser.add_argument('-d', '--device', type=str, default="gpu", help='Device to use, gpu or cpu.') | |
parser.add_argument('-l', '--label_path', type=str, default="labels/", help="Path to Voice feature library.") | |
parser.add_argument('-t', '--threshold', type=float, default=0.6, help="Threshold for judging compliance.") | |
parser.add_argument('-i', '--input_path', type=str, default="input/", help="Path to input files.") | |
parser.add_argument('-o', '--output_path', type=str, default="output/", help="Path to output files.") | |
parser.add_argument('-k', '--keep_unrecognized', action='store_true', default=False, | |
help='Do not move unrecognized files.') | |
args = parser.parse_args() | |
predictor = MVectorPredictor(configs=args.configs, | |
threshold=args.threshold, | |
label_path=args.label_path, | |
model_path=args.model_path, | |
use_gpu=True if args.device == "gpu" else False) | |
if not os.path.exists(args.input_path): | |
raise Exception("Input path not existed.") | |
# Get labels dict from label_path | |
labels_list = [f for f in os.listdir(args.label_path) if os.path.isdir(os.path.join(args.label_path, f))] | |
labels_dict = {} | |
for i, label in enumerate(labels_list): | |
labels_dict[label] = i + 1 | |
print(f"Feature labels:{labels_dict}") | |
# Get input files list from input_path | |
input_files = [] | |
for root, dirs, files in os.walk(args.input_path): | |
input_files += [os.path.abspath(os.path.join(root, f)) for f in files if f.split('.')[-1].upper() in ["WAV"]] | |
input_files_amount = len(input_files) | |
result_dicts_list = [] | |
for i, file in enumerate(input_files): | |
try: | |
label, similarity = predictor.recognition(audio_data=file) | |
if label: | |
print( | |
f"\033[32m[{i + 1}/{input_files_amount}]\033[0m \033[33m{os.path.basename(file)}\033[0m is recognized as speaker \033[31m{label}\033[0m, the max similarity is \033[34m{similarity}\033[0m.") | |
result_dicts_list.append( | |
{"Filepath": file, "Label": labels_dict[label], "Similarity": float(similarity)}) | |
else: | |
print( | |
f"\033[32m[{i + 1}/{input_files_amount}]\033[0m \033[33m{os.path.basename(file)}\033[0m could not be recognized as any speaker.") | |
result_dicts_list.append( | |
{"Filepath": file, "Label": 0, "Similarity": 0}) | |
except Exception as e: | |
print( | |
f"\033[32m[{i + 1}/{input_files_amount}]\033[0m An error occurred while processing \033[33m{os.path.basename(file)}\033[0m : {e}") | |
output_path_for_this_run = os.path.join(args.output_path, datetime.now().strftime("VPR_Result_%Y%m%d_%H%M%S")) | |
if_not_mkdir(output_path_for_this_run) | |
json_path = os.path.abspath(os.path.join(output_path_for_this_run, "result.json")) | |
# Move input files to category folders | |
print("Moving input files to category folders...") | |
folder_list_without_unrecognized = [os.path.abspath(os.path.join(output_path_for_this_run, label)) for label in | |
labels_list] | |
folder_list = [os.path.abspath( | |
os.path.join(output_path_for_this_run, "Unrecognized"))] + folder_list_without_unrecognized | |
for folder in folder_list: | |
if_not_mkdir(folder) | |
for result in result_dicts_list: | |
if args.keep_unrecognized and result["Label"] == 0: | |
continue | |
destination_folder = folder_list[result["Label"]] | |
try: | |
shutil.move(result["Filepath"], destination_folder) | |
result["Filepath"] = os.path.abspath(os.path.join(destination_folder, os.path.basename(result["Filepath"]))) | |
except Exception as e: | |
print(e) | |
# Write result json file to output_path | |
with open(json_path, "w") as f: | |
json.dump({"Labels": {str(i + 1): folder for i, folder in enumerate(folder_list_without_unrecognized)}, | |
"Files": result_dicts_list}, f, indent=4) | |
print(f"Result json is saved as {json_path}") | |