Spaces:
Runtime error
Runtime error
| from sklearn.cluster import * | |
| import os | |
| import numpy as np | |
| from config import config | |
| import yaml | |
| import argparse | |
| import shutil | |
| def ensure_dir(directory): | |
| if not os.path.exists(directory): | |
| os.makedirs(directory) | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("-a", "--algorithm", default="k", help="choose algorithm", type=str) | |
| parser.add_argument("-n", "--num_clusters", default=4, help="number of clusters", type=int) | |
| parser.add_argument("-r", "--range", default=4, help="number of files in a class", type=int) | |
| args = parser.parse_args() | |
| filelist_dict = {} | |
| yml_result = {} | |
| base_dir = "D:/Vits2/Bert-VITS2/Data/BanGDream/filelists" | |
| output_dir = "D:/Vits2/classifedSample" | |
| with open(os.path.join(base_dir, "Mygo.list"), mode="r", encoding="utf-8") as f: | |
| embs = [] | |
| wavnames = [] | |
| for line in f: | |
| parts = line.strip().split("|") | |
| speaker = parts[1] # 假设 speaker 是第二个部分 | |
| filepath = parts[0] # 假设 filepath 是第一个部分 | |
| # ... 其余部分可以根据需要使用 | |
| if speaker not in filelist_dict: | |
| filelist_dict[speaker] = [] | |
| yml_result[speaker] = {} | |
| filelist_dict[speaker].append(filepath) | |
| for speaker in filelist_dict: | |
| print("\nspeaker: " + speaker) | |
| embs = [] | |
| wavnames = [] | |
| for file in filelist_dict[speaker]: | |
| try: | |
| embs.append(np.expand_dims(np.load(f"{os.path.splitext(file)[0]}.emo.npy"), axis=0)) | |
| wavnames.append(file) | |
| except Exception as e: | |
| print(e) | |
| if embs: | |
| n_clusters = args.num_clusters | |
| x = np.concatenate(embs, axis=0) | |
| x = np.squeeze(x) | |
| if args.algorithm == "b": | |
| model = Birch(n_clusters=n_clusters, threshold=0.2) | |
| elif args.algorithm == "s": | |
| model = SpectralClustering(n_clusters=n_clusters) | |
| elif args.algorithm == "a": | |
| model = AgglomerativeClustering(n_clusters=n_clusters) | |
| else: | |
| model = KMeans(n_clusters=n_clusters, random_state=10) | |
| y_predict = model.fit_predict(x) | |
| classes = [[] for i in range(y_predict.max() + 1)] | |
| for idx, wavname in enumerate(wavnames): | |
| classes[y_predict[idx]].append(wavname) | |
| for i in range(y_predict.max() + 1): | |
| print("类别:", i, "本类中样本数量:", len(classes[i])) | |
| yml_result[speaker][f"class{i}"] = [] | |
| class_dir = os.path.join(output_dir, speaker, f"class{i}") | |
| num_samples_in_class = len(classes[i]) | |
| for j in range(min(args.range, num_samples_in_class)): | |
| wav_file = classes[i][j] | |
| print(wav_file) | |
| # 复制文件到新目录 | |
| ensure_dir(class_dir) | |
| shutil.copy(os.path.join(base_dir, wav_file), os.path.join(class_dir, os.path.basename(wav_file))) | |
| yml_result[speaker][f"class{i}"].append(wav_file) | |
| with open(os.path.join(base_dir, "emo_clustering.yml"), "w", encoding="utf-8") as f: | |
| yaml.dump(yml_result, f) | |
| ''' | |
| from sklearn.cluster import * | |
| import os | |
| import numpy as np | |
| from config import config | |
| import yaml | |
| import argparse | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "-a", "--algorithm", default="s", help="choose algorithm", type=str | |
| ) | |
| parser.add_argument( | |
| "-n", "--num_clusters", default=3, help="number of clusters", type=int | |
| ) | |
| parser.add_argument( | |
| "-r", "--range", default=4, help="number of files in a class", type=int | |
| ) | |
| args = parser.parse_args() | |
| filelist_dict = {} | |
| yml_result = {} | |
| with open( | |
| "D:/Vits2/Bert-VITS2/Data/BanGDream/filelists/Mygo.list", mode="r", encoding="utf-8" | |
| ) as f: | |
| embs = [] | |
| wavnames = [] | |
| for line in f: | |
| speaker = line.split("|")[1] | |
| if speaker not in filelist_dict: | |
| filelist_dict[speaker] = [] | |
| yml_result[speaker] = {} | |
| filelist_dict[speaker].append(line.split("|")[0]) | |
| #print(filelist_dict) | |
| for speaker in filelist_dict: | |
| print("\nspeaker: " + speaker) | |
| # 清空 embs 和 wavnames 列表 | |
| embs = [] | |
| wavnames = [] | |
| for file in filelist_dict[speaker]: | |
| try: | |
| embs.append( | |
| np.expand_dims( | |
| np.load(f"{os.path.splitext(file)[0]}.emo.npy"), axis=0 | |
| ) | |
| ) | |
| wavnames.append(os.path.basename(file)) | |
| except Exception as e: | |
| print(e) | |
| if embs: | |
| # 聚类算法类的数量 | |
| n_clusters = args.num_clusters | |
| x = np.concatenate(embs, axis=0) | |
| x = np.squeeze(x) | |
| # 聚类算法类的数量 | |
| n_clusters = args.num_clusters | |
| if args.algorithm == "b": | |
| model = Birch(n_clusters=n_clusters, threshold=0.2) | |
| elif args.algorithm == "s": | |
| model = SpectralClustering(n_clusters=n_clusters) | |
| elif args.algorithm == "a": | |
| model = AgglomerativeClustering(n_clusters=n_clusters) | |
| else: | |
| model = KMeans(n_clusters=n_clusters, random_state=10) | |
| # 可以自行尝试各种不同的聚类算法 | |
| y_predict = model.fit_predict(x) | |
| classes = [[] for i in range(y_predict.max() + 1)] | |
| for idx, wavname in enumerate(wavnames): | |
| classes[y_predict[idx]].append(wavname) | |
| for i in range(y_predict.max() + 1): | |
| print("类别:", i, "本类中样本数量:", len(classes[i])) | |
| yml_result[speaker][f"class{i}"] = [] | |
| # 修正:确保不会尝试访问超出范围的元素 | |
| num_samples_in_class = len(classes[i]) | |
| for j in range(min(args.range, num_samples_in_class)): | |
| print(classes[i][j]) | |
| yml_result[speaker][f"class{i}"].append(classes[i][j]) | |
| with open( | |
| os.path.join('D:/Vits2/Bert-VITS2/Data/BanGDream', "emo_clustering.yml"), "w", encoding="utf-8" | |
| ) as f: | |
| yaml.dump(yml_result, f) | |
| ''' |