Page MenuHomePhabricator

No OneTemporary

diff --git a/AutoCoverTool/online/common.py b/AutoCoverTool/online/common.py
new file mode 100644
index 0000000..982a1f0
--- /dev/null
+++ b/AutoCoverTool/online/common.py
@@ -0,0 +1,163 @@
+# -*-encoding=utf8-*-
+import time
+import pymysql
+
+banned_user_map = {
+ "host": "sg-songbook00.db.starmaker.co",
+ "user": "worker",
+ "passwd": "gRYppQtdTpP3nFzH",
+ "db": "starmaker"
+}
+
+gs_songbook_test_banned_user_map = {
+ "host": "sg-test-server-goapi-1",
+ "user": "root",
+ "passwd": "solo2018",
+ "db": "av_db"
+}
+
+banned_user_map_v1 = {
+ "host": "sg-starmaker-device-r2.db.starmaker.co",
+ "user": "worker",
+ "passwd": "gRYppQtdTpP3nFzH",
+ "db": "mis"
+}
+
+banned_user_map_v2 = {
+ "host": "sg-sm-img-r1.starmaker.co",
+ "user": "worker",
+ "passwd": "gRYppQtdTpP3nFzH",
+ "db": "sm"
+}
+
+# 做一下shared库的查询依赖
+shard_map = {
+ "shard_sm_12": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_13": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_14": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_15": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_30": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_31": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_20": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_21": "sg-shard02-r2.db.starmaker.co",
+ "shard_sm_22": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_23": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_24": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_25": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_26": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_27": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_28": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_29": "sg-shard03-r2.db.starmaker.co",
+ "shard_sm_0": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_1": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_2": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_3": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_4": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_5": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_16": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_17": "sg-shard00-r2.db.starmaker.co",
+ "shard_sm_6": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_7": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_8": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_9": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_10": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_11": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_18": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_19": "sg-shard01-r2.db.starmaker.co",
+ "shard_sm_32": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_33": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_34": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_35": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_36": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_37": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_38": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_39": "sg-shard04-r2.db.starmaker.co",
+ "shard_sm_40": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_41": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_42": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_43": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_44": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_45": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_46": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_47": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_48": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_49": "sg-shard05-r2.db.starmaker.co",
+ "shard_sm_50": "sg-shard05-r2.db.starmaker.co",
+ "name": "shard_sm_{}",
+ "port": 3306,
+ "user": "readonly",
+ "passwd": "JKw6woZgRXsveegL"
+}
+
+
+def connect_db(host="research-db-r1.starmaker.co", port=3306, user="root", passwd="Qrdl1130", db=""):
+ print("connect mysql host={} port={} user={} passwd={} db={}".format(host, port, user, passwd, db))
+ return pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db)
+
+
+def get_data_by_mysql(sql, ban=banned_user_map):
+ db = connect_db(host=ban["host"], passwd=ban["passwd"], user=ban["user"],
+ db=ban["db"])
+ db_cursor = db.cursor()
+ if len(sql) < 100:
+ print("execute = {}".format(sql))
+ else:
+ print("execute = {}...".format(sql[:100]))
+
+ db_cursor.execute(sql)
+ res = db_cursor.fetchall()
+ db_cursor.close()
+ db.close()
+ print("res size={}".format(len(res)))
+ return res
+
+
+def get_shard_db(user_id):
+ return int(float(user_id)) >> 48
+
+
+def get_shard_data_by_sql(sql, user_id):
+ shard_id = get_shard_db(user_id)
+ db_name = shard_map["name"].format(shard_id)
+ host = shard_map[db_name]
+ db = connect_db(host=host, passwd=shard_map["passwd"], user=shard_map["user"], db=db_name)
+ db_cursor = db.cursor()
+ if len(sql) < 100:
+ print("execute = {}".format(sql))
+ else:
+ print("execute = {}...".format(sql[:100]))
+
+ db_cursor.execute(sql)
+ res = db_cursor.fetchall()
+ db_cursor.close()
+ db.close()
+ print("res size={}".format(len(res)))
+ return res
+
+
+def read_file(in_file):
+ with open(in_file, "r") as f:
+ lines = f.readlines()
+ return lines
+
+
+def write2file(file_path, data):
+ with open(file_path, "w") as f:
+ for line in data:
+ line += "\n"
+ f.write(line)
+
+
+def update_db(sql, ban=banned_user_map):
+ db = connect_db(host=ban["host"], passwd=ban["passwd"], user=ban["user"],
+ db=ban["db"])
+ db_cursor = db.cursor()
+ if len(sql) < 100:
+ print("execute = {}".format(sql))
+ else:
+ print("execute = {}...".format(sql[:100]))
+
+ db_cursor.execute(sql)
+ db.commit()
+ db_cursor.close()
+ db.close()
diff --git a/AutoCoverTool/online/inference_one.py b/AutoCoverTool/online/inference_one.py
new file mode 100644
index 0000000..36e71d5
--- /dev/null
+++ b/AutoCoverTool/online/inference_one.py
@@ -0,0 +1,677 @@
+"""
+单个处理的逻辑
+song_id:
+ ---src.mp3 // 源数据,需要提前放进去
+ ---cache
+ ---vocal.wav // 分离之后产生
+ ---acc.wav // 分离之后产生
+ ---vocal_32.wav // 分离之后产生
+ ---song_id_sp1.wav // 合成之后产生
+ ---song_id_sp2.wav // 合成之后产生
+ ---song_id_sp2_d.wav // 降噪之后生成
+ ---song_id_sp2_dv.wav // 降噪+拉伸之后产生 [占比太高的不产生]
+ ---song_id_sp2_dve442.wav // 手动调整之后产生
+ ---song_id_sp2_dve442_replace.wav // 替换之后产生
+ ---song_id_sp2_dve442_replace_mix.wav // 人声+伴奏混合之后产生
+ ---song_id
+ --acc.mp3 // 44k双声道320k
+ --vocal.mp3 // 44k双声道320k
+ --src.mp3 // 44k双声道320k
+ --song_id_sp2_dv.mp3 // 44k单声道320k
+ ---song_id_out // 对外输出
+ --src.mp3 // 原始音频
+ --song_id_sp2_dv_replace_mix.mp3 // 制作完成的音频
+
+环境安装:
+conda create -n auto_song_cover python=3.9
+# 安装demucs环境[进入到ref.music_remover 执行pip install -r requirements.txt]
+# 安装so_vits_svc环境[进入到ref.so_vits_svc 执行pip install -r requirements.txt]
+pip install librosa
+pip install scikit-maad
+pip install praat-parselmouth
+pip install matplotlib
+pip install torchvision
+pip install madmom
+pip install torchstat
+环境设置:
+export PATH=$PATH:/data/gpu_env_common/env/bin/ffmpeg/bin
+export PYTHONPATH=$PWD:$PWD/ref/music_remover/demucs:$PWD/ref/so_vits_svc:$PWD/ref/split_dirty_frame
+"""
+
+import os
+import time
+import shutil
+import random
+import logging
+import librosa
+
+logging.basicConfig(filename='/tmp/inference.log', level=logging.INFO)
+
+gs_err_code_success = 0
+gs_err_code_no_src_mp3 = 1
+gs_err_code_separate = 2
+gs_err_code_trans_32 = 3
+gs_err_code_encode_err = 4
+gs_err_code_replace_err = 5
+gs_err_code_replace_trans_err = 6
+gs_err_code_mix_err = 7
+gs_err_code_mix_transcode_err = 8
+gs_err_code_no_src_dir = 9
+gs_err_code_volume_err = 10
+gs_err_code_trans2_442 = 11
+gs_err_code_reverb = 12
+gs_err_code_no_good_choice = 13
+gs_err_code_preprocess_vocal = 14
+
+gs_denoise_exe = "/opt/soft/bin/denoise_exe"
+gs_draw_volume_exe = "/opt/soft/bin/draw_volume"
+gs_simple_mixer_path = "/opt/soft/bin/simple_mixer"
+gs_rever_path = "/opt/soft/bin/dereverbrate"
+
+from ref.music_remover.separate_interface import SeparateInterface
+from ref.so_vits_svc.inference_main import *
+from ref.split_dirty_frame.script.process_one import ReplaceVocalFrame, construct_power_fragment
+
+
+class SongCoverInference:
+ def __init__(self):
+ self.work_dir = None
+ self.cache_dir = None
+ self.cid = None
+ self.src_mp3 = None
+ self.vocal_path = None
+ self.vocal_32_path = None
+ self.acc_path = None
+ self.speakers = [
+ 10414574138721494,
+ 10414574140317353,
+ 1688849864840588,
+ 3634463651,
+ 5629499489839033,
+ 5910973794723621,
+ 6755399374234747,
+ 8162774327817435,
+ 8162774329368194,
+ 1125899914308640, # 以下为男声,包括这个
+ 12384898975368914,
+ 12947848931397021,
+ 3096224748076687,
+ 3096224751151928,
+ 5066549357604730,
+ 5348024335101054,
+ 6755399442719465,
+ 7036874421386111
+ ]
+
+ self.speakers2gender = {
+ 10414574138721494: 1,
+ 10414574140317353: 1,
+ 1688849864840588: 1,
+ 3634463651: 1,
+ 5629499489839033: 1,
+ 5910973794723621: 1,
+ 6755399374234747: 1,
+ 8162774327817435: 1,
+ 8162774329368194: 1,
+ 1125899914308640: 0, # 0是男
+ 12384898975368914: 0,
+ 12947848931397021: 0,
+ 3096224748076687: 0,
+ 3096224751151928: 0,
+ 5066549357604730: 0,
+ 5348024335101054: 0,
+ 6755399442719465: 0,
+ 7036874421386111: 0
+ }
+ self.speakers_model_path = "data/train_users/{}/logs/32k/G_2000.pth"
+ self.speakers_model_config = "data/train_users/{}/config/config.json"
+
+ st = time.time()
+ self.separate_inst = None
+ logging.info("post process ... ReplaceVocalFrame init sp={}".format(time.time() - st))
+ self.replace_vocal_frame_inst = None
+ logging.info("SongCoverInference init sp={}".format(time.time() - st))
+
+ def separate(self, cid, src_mp3, vocal_path, acc_path):
+ """
+ 人声伴奏分离
+ :param cid:
+ :param src_mp3:
+ :param vocal_path:
+ :param acc_path:
+ :return:
+ """
+ st = time.time()
+ if self.separate_inst is None:
+ self.separate_inst = SeparateInterface()
+ if not self.separate_inst.process(cid, src_mp3, vocal_path, acc_path):
+ return gs_err_code_separate
+ if not os.path.exists(vocal_path) or not os.path.exists(acc_path):
+ return gs_err_code_separate
+
+ # 转码出一个32k单声道的数据
+ cmd = "ffmpeg -i {} -ar 32000 -ac 1 -y {} -loglevel fatal".format(vocal_path, self.vocal_32_path)
+ os.system(cmd)
+ if not os.path.exists(self.vocal_32_path):
+ return gs_err_code_trans_32
+ print("separate:cid={}|sp={}".format(cid, time.time() - st))
+ return gs_err_code_success
+
+ def get_start_ms(self, vocal_path):
+ """
+ 给定原始音频,找一段连续10s的音频
+ :param vocal_path:
+ :return:
+ """
+ audio, sr = librosa.load(vocal_path, sr=16000)
+ audio = librosa.util.normalize(audio)
+ # 帧长100ms,帧移10ms,计算能量
+ power_arr = []
+ for i in range(0, len(audio) - 1600, 160):
+ power_arr.append(np.sum(np.abs(audio[i:i + 160])) / 160)
+ # 将能量小于等于10的部分做成段
+ power_arr = construct_power_fragment(power_arr)
+ fragments = []
+ last_pos = 0
+ for idx, line in enumerate(power_arr):
+ start = round(float(line[0]) * 0.01, 3)
+ duration = round(float(line[1]) * 0.01, 3)
+ fragments.append([last_pos, start - last_pos])
+ last_pos = start + duration
+ if last_pos < len(audio) / sr:
+ fragments.append([last_pos, len(audio) / sr - last_pos])
+
+ # 合并数据,两者间隔在50ms以内的合并起来
+ idx = 0
+ while idx < len(fragments) - 1:
+ if fragments[idx + 1][0] - (fragments[idx][0] + fragments[idx][1]) < 0.05:
+ fragments[idx][1] = fragments[idx + 1][0] + fragments[idx + 1][1] - fragments[idx][0]
+ del fragments[idx + 1]
+ idx -= 1
+ idx += 1
+
+ # out_file = vocal_path + "_power.csv"
+ # with open(out_file, "w") as f:
+ # f.write("Name\tStart\tDuration\tTime Format\tType\n")
+ # for fragment in fragments:
+ # start = round(float(fragment[0]), 3)
+ # duration = round(float(fragment[1]), 3)
+ # strr = "{}\t{}\t{}\t{}\n".format("11", start, duration, "decimal\tCue\t")
+ # f.write(strr)
+
+ # 筛选出开始的位置
+ # 1. 连续时长大于10s,当前段长度大于3s
+ # 2. 不可用
+ # 从0到fragments[idx], 包含idx其中人声段的总和
+ tot_vocal_duration = [fragments[0][1]]
+ for i in range(1, len(fragments)):
+ tot_vocal_duration.append(tot_vocal_duration[i - 1] + fragments[i][1])
+
+ # 计算出任意两段之间非人声占比
+ for i in range(0, len(fragments)):
+ if fragments[i][1] >= 3:
+ now_tot = 0
+ if i > 0:
+ now_tot = tot_vocal_duration[i - 1]
+ for j in range(i + 1, len(fragments)):
+ cur_rate = tot_vocal_duration[j] - now_tot
+ cur_rate = cur_rate / (fragments[j][1] + fragments[j][0] - fragments[i][0])
+ if cur_rate > 0.1:
+ return fragments[i][0]
+ return -1
+
+ def inference_speaker(self):
+ """
+ 推理生成合成后的音频
+ 随机取5个干声,选择占比最小的,并且要求占比小于0.3
+ :return:
+ """
+ st = time.time()
+ out_speakers = random.sample(self.speakers, 5)
+ out_songs_dict = {}
+ for speaker in out_speakers:
+ model_path = self.speakers_model_path.format(speaker)
+ config_path = self.speakers_model_config.format(speaker)
+ song_path = os.path.join(self.cache_dir, "{}_{}.wav".format(self.cid, speaker))
+ try:
+ inf(model_path, config_path, self.vocal_32_path, song_path, "prod")
+ except Exception as ex:
+ logging.info("cid={}, inference_speaker err={}".format(self.cid, ex))
+ continue
+ if os.path.exists(song_path):
+ if self.replace_vocal_frame_inst is None:
+ self.replace_vocal_frame_inst = ReplaceVocalFrame(
+ "data/models/split_dirty_frame_v5_3_epoch3_852.pth")
+ rate = self.replace_vocal_frame_inst.get_rate(song_path)
+ if rate < 0.3:
+ out_songs_dict[song_path] = rate
+
+ # 从内部选择占比最低的
+ out_songs = []
+ if len(out_songs_dict.keys()) > 0:
+ st_sec = self.get_start_ms(self.vocal_path)
+ song_msg = sorted(out_songs_dict.items(), key=lambda kv: kv[1])[0]
+ out_songs = [song_msg[0]]
+ logging.info("GetRate:cid={},song={},rate={},st_tm={}".format(self.cid, song_msg[0], round(song_msg[1], 2),
+ round(st_sec, 3)))
+ print("GetRate:cid={},song={},rate={},st_tm={}".format(self.cid, song_msg[0], round(song_msg[1], 2),
+ round(st_sec, 3)))
+ # logging.info("inference_speaker len = {} finish sp = {}".format(len(out_songs), time.time() - st))
+ print("inference_speaker len = {} finish sp = {}".format(len(out_songs), time.time() - st))
+ return out_songs
+
+ def get_new_vocal_rate(self, songs):
+ """
+ 获取人声的比率
+ :param songs:
+ :return:
+ """
+ st = time.time()
+ need_to_process_song = []
+ for song in songs:
+ if self.replace_vocal_frame_inst is None:
+ self.replace_vocal_frame_inst = ReplaceVocalFrame("data/models/split_dirty_frame_v5_3_epoch3_852.pth")
+ rate = self.replace_vocal_frame_inst.get_rate(song)
+ logging.info("{} {} replace_rate={}".format(self.cid, song, rate))
+ if rate < 1.0:
+ need_to_process_song.append(song)
+ logging.info(
+ "get_new_vocal_rate belen = {} len = {} finish sp = {}".format(len(songs), len(need_to_process_song),
+ time.time() - st))
+ return need_to_process_song
+
+ def preprocess_vocal(self, songs, vocal_path):
+ """
+ 1. 降噪
+ 2. 拉伸
+ :param songs:
+ :param vocal_path: 参考的音频信号
+ :return:
+ """
+ st = time.time()
+ dv_out_list = []
+ for song in songs:
+ denoise_path = str(song).replace(".wav", "_d.wav")
+ cmd = "{} {} {}".format(gs_denoise_exe, song, denoise_path)
+ os.system(cmd)
+ if not os.path.exists(denoise_path):
+ print("{} {} ERROR denoise".format(self.cid, song))
+ continue
+ # 拉伸
+ volume_path = str(song).replace(".wav", "_dv.wav")
+ cmd = "{} {} {} {}".format(gs_draw_volume_exe, denoise_path, vocal_path, volume_path)
+ os.system(cmd)
+ if not os.path.exists(volume_path):
+ print("{} {} ERROR denoise".format(self.cid, volume_path))
+ continue
+ dv_out_list.append(volume_path)
+ print(
+ "preprocess_vocal belen = {} len = {} finish sp = {}".format(len(songs), len(dv_out_list),
+ time.time() - st))
+ return dv_out_list
+
+ def output(self, dv_out_list):
+ """
+ 对外输出数据
+ :param dv_out_list:
+ :return:
+ """
+ st = time.time()
+ out_dir = os.path.join(self.work_dir, self.cid)
+ if os.path.exists(out_dir):
+ shutil.rmtree(out_dir)
+ os.makedirs(out_dir)
+
+ # 拷贝数据
+ dst_mp3_path = os.path.join(out_dir, "src_mp3")
+ dst_acc_path = os.path.join(out_dir, "acc.mp3")
+ dst_vocal_path = os.path.join(out_dir, "vocal.mp3")
+ shutil.copyfile(self.src_mp3, dst_mp3_path)
+ cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(self.acc_path, dst_acc_path)
+ os.system(cmd)
+ if not os.path.exists(dst_acc_path):
+ return gs_err_code_encode_err
+ cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(self.vocal_path, dst_vocal_path)
+ os.system(cmd)
+ if not os.path.exists(dst_vocal_path):
+ return gs_err_code_encode_err
+
+ # 将所有数据放到out_dir中,用于给人工标注
+ for dv_wav in dv_out_list:
+ dv_wav_name = str(dv_wav).split("/")[-1].replace(".wav", "_441.mp3")
+ dst_dv_path = os.path.join(out_dir, dv_wav_name)
+
+ cmd = "ffmpeg -i {} -ar 44100 -ac 1 -ab 320k -y {} -loglevel fatal".format(dv_wav, dst_dv_path)
+ os.system(cmd)
+ if not os.path.exists(dst_dv_path):
+ print("{} encode err!".format(cmd))
+ continue
+ logging.info(
+ "preprocess_vocal output sp = {}".format(time.time() - st))
+
+ def process_one(self, cid, work_dir, enable_output=False):
+ logging.info("\nstart:cid={},work_dir={}----------------------->>>>>>>>".format(cid, work_dir))
+ self.cid = cid
+ self.work_dir = work_dir
+
+ # 所有不对外交付的,全部放到这里
+ self.cache_dir = os.path.join(work_dir, "cache")
+ if os.path.exists(self.cache_dir):
+ shutil.rmtree(self.cache_dir)
+ os.makedirs(self.cache_dir)
+
+ self.src_mp3 = os.path.join(self.work_dir, "src.mp3")
+ if not os.path.exists(self.src_mp3):
+ return gs_err_code_no_src_mp3
+ self.vocal_path = os.path.join(self.cache_dir, "vocal.wav")
+ self.vocal_32_path = os.path.join(self.cache_dir, "vocal_32.wav")
+ self.acc_path = os.path.join(self.cache_dir, "acc.wav")
+
+ if not os.path.exists(self.vocal_32_path):
+ logging.info("start separate ... {} {} {}".format(self.src_mp3, self.vocal_path, self.acc_path))
+ err = self.separate(cid, self.src_mp3, self.vocal_path, self.acc_path)
+ if err != gs_err_code_success:
+ return err, None, None
+ logging.info("start inference_speaker ...")
+ out_songs = self.inference_speaker()
+ dv_out_list = self.preprocess_vocal(out_songs, self.vocal_path)
+ if len(dv_out_list) == 0:
+ return gs_err_code_no_good_choice, None, None
+
+ mix_mp3_path = None
+ gender = -1
+ if enable_output:
+ self.output(dv_out_list)
+ else:
+ # 默认全部处理一遍
+ for dv_out_path in dv_out_list:
+ src_path = dv_out_path.replace("_dv.wav", ".wav")
+ err, mix_mp3_path = self.after_process(self.cid, self.work_dir, src_path, dv_out_path, self.vocal_path,
+ self.acc_path,
+ True, False)
+ if err != gs_err_code_success:
+ logging.info("after_process err {}".format(err))
+
+ # 取出性别属性
+ if err == gs_err_code_success and mix_mp3_path is not None:
+ gender = self.speakers2gender[int(str(os.path.basename(mix_mp3_path)).split("_")[1])]
+ logging.info("finish:cid={},work_dir={}----------------------->>>>>>>>".format(cid, work_dir))
+ return gs_err_code_success, mix_mp3_path, gender
+
+ def reverb_by_vocal(self, file):
+ st = time.time()
+ file_442 = file.replace(".wav", "_442.wav")
+ if not os.path.exists(file_442):
+ cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {}".format(file, file_442)
+ os.system(cmd)
+ if not os.path.exists(file_442):
+ return gs_err_code_trans2_442, None
+
+ file_dst = file.replace(".wav", "_442_dr.wav")
+ cmd = "{} {} {} {}".format(gs_rever_path, self.vocal_path, file_442, file_dst)
+ os.system(cmd)
+ if not os.path.exists(file_dst):
+ return gs_err_code_reverb, None
+ print("cid = {}, reverb_by_vocal sp={}".format(self.cid, time.time() - st))
+ return gs_err_code_success, file_dst
+
+ def after_process(self, cid, work_dir, in_file, effect_file, vocal_file, acc_file, need_draw=True,
+ need_reverb=True):
+ """
+ 后处理逻辑
+ 将处理好的音频进行替换,然后和伴奏进行混合,最后进行编码
+ :return:
+ """
+ if need_reverb:
+ # 抓取混响
+ err, effect_file = self.reverb_by_vocal(in_file)
+ if err != gs_err_code_success:
+ return err, None
+
+ if need_draw:
+ # 增加一个拉伸的步骤
+ volume_path = str(effect_file).replace(".wav", "_dv.wav")
+ cmd = "{} {} {} {}".format(gs_draw_volume_exe, effect_file, vocal_file, volume_path)
+ print(cmd)
+ os.system(cmd)
+ if not os.path.exists(volume_path):
+ print("{} {} ERROR draw volume".format(self.cid, volume_path))
+ return gs_err_code_volume_err, None
+ effect_file = volume_path
+
+ st = time.time()
+ self.cid = cid
+ self.work_dir = work_dir
+ self.src_mp3 = os.path.join(self.work_dir, "src.mp3")
+ if not os.path.exists(self.work_dir):
+ return gs_err_code_no_src_dir
+ self.replace_vocal_frame_inst.process(in_file, effect_file, vocal_file)
+ dst_path = effect_file + "_replace.wav"
+ if not os.path.exists(dst_path):
+ return gs_err_code_replace_err, None
+ print("replace_vocal_frame_inst sp = {}".format(time.time() - st))
+
+ # 转码
+ dst_path_442 = dst_path.replace("_replace.wav", "_replace442.wav")
+ cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {} -loglevel fatal".format(dst_path, dst_path_442)
+ os.system(cmd)
+ if not os.path.exists(dst_path_442):
+ return gs_err_code_replace_trans_err, None
+
+ # 合并转码后再做一次拉伸,保证响度
+ volume_path = str(dst_path_442).replace(".wav", "_dv.wav")
+ cmd = "{} {} {} {}".format(gs_draw_volume_exe, dst_path_442, vocal_file, volume_path)
+ print(cmd)
+ os.system(cmd)
+ if not os.path.exists(volume_path):
+ print("{} {} ERROR draw volume".format(self.cid, volume_path))
+ return gs_err_code_volume_err, None
+ dst_path_442 = volume_path
+
+ # 混合
+ mix_path = dst_path_442.replace("_replace442.wav", "_replace442_mix.wav")
+ cmd = "{} {} {} {}".format(gs_simple_mixer_path, dst_path_442, acc_file, mix_path)
+ print("{}".format(cmd))
+ os.system(cmd)
+ if not os.path.exists(mix_path):
+ return gs_err_code_mix_err, None
+
+ # 编码为mp3
+ output_dir = os.path.join(self.work_dir, self.cid + "_out")
+ if not os.path.exists(output_dir):
+ os.makedirs(output_dir)
+ name = str(mix_path).replace("_replace442_mix.wav", "_replace442_mix.mp3").split("/")[-1]
+ mix_path_mp3 = os.path.join(output_dir, name)
+ cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(mix_path, mix_path_mp3)
+ os.system(cmd)
+ if not os.path.exists(mix_path_mp3):
+ return gs_err_code_mix_transcode_err, None
+
+ # 拷贝src到output_dir
+ # shutil.copyfile(self.src_mp3, os.path.join(output_dir, "src.mp3"))
+ # logging.info("after_process sp = {}".format(time.time() - st))
+ return gs_err_code_success, mix_path_mp3
+
+ ####################################新对外接口############################################################
+ def prepare_env(self, cid, work_dir, create_dir=False):
+ self.cid = cid
+ self.work_dir = work_dir
+
+ # 所有不对外交付的,全部放到这里
+ self.cache_dir = os.path.join(work_dir, "cache")
+ if create_dir:
+ if os.path.exists(self.cache_dir):
+ shutil.rmtree(self.cache_dir)
+ os.makedirs(self.cache_dir)
+
+ self.src_mp3 = os.path.join(self.work_dir, "src.mp3")
+ if not os.path.exists(self.src_mp3):
+ return gs_err_code_no_src_mp3
+ self.vocal_path = os.path.join(self.cache_dir, "vocal.wav")
+ self.vocal_32_path = os.path.join(self.cache_dir, "vocal_32.wav")
+ self.acc_path = os.path.join(self.cache_dir, "acc.wav")
+ return gs_err_code_success
+
+ def generate_svc_file(self, cid, work_dir):
+ """
+ :param cid:
+ :param work_dir:
+ :return:err_code, 生成出的svc的文件名称
+ """
+ err = self.prepare_env(cid, work_dir, create_dir=True)
+ if err != gs_err_code_success:
+ return err, None
+
+ # 音源分离
+ if not os.path.exists(self.vocal_32_path):
+ st = time.time()
+ err = self.separate(cid, self.src_mp3, self.vocal_path, self.acc_path)
+ logging.info("cid={},separate,sp={}".format(self.cid, time.time() - st))
+ if err != gs_err_code_success:
+ return err, None
+
+ # 生成svc,只保留一个最佳的
+ st = time.time()
+ out_songs = self.inference_speaker()
+ if len(out_songs) == 0:
+ return gs_err_code_no_good_choice, None, None
+ logging.info("cid={},inference_speaker,{},sp={}".format(self.cid, out_songs[0], time.time() - st))
+
+ # 预处理人声
+ dv_out_list = self.preprocess_vocal(out_songs, self.vocal_path)
+ if len(dv_out_list) == 0:
+ return gs_err_code_preprocess_vocal, None
+ return gs_err_code_success, dv_out_list[0]
+
+ def effect(self, cid, work_dir, svc_file):
+ st = time.time()
+ err = self.prepare_env(cid, work_dir)
+ if err != gs_err_code_success:
+ return err, None
+ logging.info("cid={},effect_and_mix,{},sp={}".format(self.cid, svc_file, time.time() - st))
+ # 做音效
+ st = time.time()
+ err, effect_file = self.reverb_by_vocal(svc_file)
+ if err != gs_err_code_success:
+ return err, None
+ logging.info("cid={},reverb_by_vocal,{},sp={}".format(self.cid, svc_file, time.time() - st))
+ return err, effect_file
+
+ def mix(self, cid, work_dir, svc_file, effect_file):
+ """
+ 做音效以及合并
+ :param cid:
+ :param work_dir:
+ :param svc_file:
+ :param effect_file:
+ :return: err_code, 完成的mp3文件
+ """
+ st = time.time()
+ err = self.prepare_env(cid, work_dir)
+ if err != gs_err_code_success:
+ return err, None
+ logging.info("cid={},effect_and_mix,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 拉伸
+ st = time.time()
+ volume_path = str(effect_file).replace(".wav", "_dv.wav")
+ cmd = "{} {} {} {}".format(gs_draw_volume_exe, effect_file, self.vocal_path, volume_path)
+ os.system(cmd)
+ if not os.path.exists(volume_path):
+ print("{} {} ERROR draw volume".format(self.cid, volume_path))
+ return gs_err_code_volume_err, None
+ effect_file = volume_path
+ logging.info("cid={},draw_volume,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 替换
+ st = time.time()
+ self.replace_vocal_frame_inst.process(svc_file, effect_file, self.vocal_path)
+ dst_path = effect_file + "_replace.wav"
+ if not os.path.exists(dst_path):
+ return gs_err_code_replace_err, None
+ logging.info("cid={},replace_vocal_frame_inst,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 转码
+ st = time.time()
+ dst_path_442 = dst_path.replace("_replace.wav", "_replace442.wav")
+ cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {} -loglevel fatal".format(dst_path, dst_path_442)
+ os.system(cmd)
+ if not os.path.exists(dst_path_442):
+ return gs_err_code_replace_trans_err, None
+ logging.info("cid={},transcode,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 合并转码后再做一次拉伸,保证响度
+ st = time.time()
+ volume_path = str(dst_path_442).replace("_replace442.wav", "_replace442_dv.wav")
+ cmd = "{} {} {} {}".format(gs_draw_volume_exe, dst_path_442, self.vocal_path, volume_path)
+ os.system(cmd)
+ if not os.path.exists(volume_path):
+ print("{} {} ERROR draw volume".format(self.cid, volume_path))
+ return gs_err_code_volume_err, None
+ dst_path_442 = volume_path
+ logging.info("cid={},draw_volume2,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 混合
+ st = time.time()
+ mix_path = dst_path_442.replace("_replace442_dv.wav", "_replace442_dv_mix.wav")
+ cmd = "{} {} {} {}".format(gs_simple_mixer_path, dst_path_442, self.acc_path, mix_path)
+ os.system(cmd)
+ if not os.path.exists(mix_path):
+ return gs_err_code_mix_err, None
+ logging.info("cid={},mixer,{},sp={}".format(self.cid, svc_file, time.time() - st))
+
+ # 编码为mp3
+ st = time.time()
+ output_dir = os.path.join(self.work_dir, self.cid + "_out")
+ if not os.path.exists(output_dir):
+ os.makedirs(output_dir)
+ name = str(mix_path).replace("_replace442_dv_mix.wav", "_replace442_dv_mix.mp3").split("/")[-1]
+ mix_path_mp3 = os.path.join(output_dir, name)
+ cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(mix_path, mix_path_mp3)
+ print(cmd)
+ os.system(cmd)
+ if not os.path.exists(mix_path_mp3):
+ return gs_err_code_mix_transcode_err, None
+ logging.info("cid={},encode,{},sp={}".format(self.cid, svc_file, time.time() - st))
+ return gs_err_code_success, mix_path_mp3
+
+ def get_gender(self, svc_file):
+ return self.speakers2gender[int(os.path.basename(svc_file).split("_")[1])]
+
+ def process_one_logic(self, cid, work_dir):
+ """
+ 搞成两部分:
+ 1. 分离数据+5次推理,获取最佳结果,并保存
+ 2. 利用最佳结果做音效以及合并
+ :return:
+ """
+ err, svc_file = self.generate_svc_file(cid, work_dir)
+ gender = -1
+ if err != gs_err_code_success:
+ return err, svc_file, gender,
+ gender = self.get_gender(svc_file)
+ err, effect_file = self.effect(cid, work_dir, svc_file)
+ if err != gs_err_code_success:
+ return err, svc_file, gender
+ err, mix_mp3_path = self.mix(cid, work_dir, svc_file, effect_file)
+ return err, mix_mp3_path, gender
+
+
+def test():
+ arr = [
+ # "611752105020343687",
+ # "611752105023532439",
+ "611752105030419688",
+ ]
+ base_dir = "/data/rsync/jianli.yang/AutoCoverTool/data/test"
+ s_inst = SongCoverInference()
+ for cid in arr:
+ st = time.time()
+ # err, mix_mp3, gender = s_inst.process_one(cid, os.path.join(base_dir, cid), False)
+ err, mix_mp3, gender = s_inst.process_one_logic(cid, os.path.join(base_dir, cid))
+ print(mix_mp3, gender)
+ print("cid={} RealFinish err={} sp={}".format(cid, err, time.time() - st))
+
+
+if __name__ == '__main__':
+ test()
diff --git a/AutoCoverTool/online/inference_worker.py b/AutoCoverTool/online/inference_worker.py
new file mode 100644
index 0000000..2213f50
--- /dev/null
+++ b/AutoCoverTool/online/inference_worker.py
@@ -0,0 +1,237 @@
+"""
+离线worker
+数据库字段要求:
+// 其中state的状态
+// 0:默认,1:被取走,<0异常情况,2完成
+// 超时到一定程度也会被重新放回来
+数据库格式:
+ id,song_id,url,state,svc_url,create_time,update_time,gender
+启动时的环境要求:
+export PATH=$PATH:/data/gpu_env_common/env/bin/ffmpeg/bin
+export PYTHONPATH=$PWD:$PWD/ref/music_remover/demucs:$PWD/ref/so_vits_svc:$PWD/ref/split_dirty_frame
+"""
+
+import os
+import shutil
+import logging
+import multiprocessing as mp
+
+from online.inference_one import *
+from online.common import *
+
+gs_actw_err_code_download_err = 10001
+gs_actw_err_code_trans_err = 10002
+gs_actw_err_code_upload_err = 10003
+
+gs_state_default = 0
+gs_state_use = 1
+gs_state_finish = 2
+
+GS_REGION = "ap-singapore"
+GS_BUCKET_NAME = "starmaker-sg-1256122840"
+# GS_COSCMD = "/bin/coscmd"
+GS_COSCMD = "/opt/soft/anaconda3/bin/coscmd"
+GS_RES_DIR = "/srv/dreambooth_worker_resource"
+GS_CONFIG_PATH = os.path.join(GS_RES_DIR, ".online_cos.conf")
+
+
+def exec_cmd(cmd):
+ ret = os.system(cmd)
+ if ret != 0:
+ return False
+ return True
+
+
+def exec_cmd_and_result(cmd):
+ r = os.popen(cmd)
+ text = r.read()
+ r.close()
+ return text
+
+
+def upload_file2cos(key, file_path, region=GS_REGION, bucket_name=GS_BUCKET_NAME):
+ """
+ 将文件上传到cos
+ :param key: 桶上的具体地址
+ :param file_path: 本地文件地址
+ :param region: 区域
+ :param bucket_name: 桶地址
+ :return:
+ """
+ cmd = "{} -c {} -r {} -b {} upload {} {}".format(GS_COSCMD, GS_CONFIG_PATH, region, bucket_name, file_path, key)
+ if exec_cmd(cmd):
+ cmd = "{} -c {} -r {} -b {} info {}".format(GS_COSCMD, GS_CONFIG_PATH, region, bucket_name, key) \
+ + "| grep Content-Length |awk \'{print $2}\'"
+ res_str = exec_cmd_and_result(cmd)
+ logging.info("{},res={}".format(key, res_str))
+ size = float(res_str)
+ if size > 0:
+ return True
+ return False
+ return False
+
+
+def post_process_err_callback(msg):
+ print("ERROR|post_process|task_error_callback:", msg)
+
+
+def effect(queue, finish_queue):
+ """
+ 1. 添加音效
+ 2. 混音
+ 3. 上传到服务端
+ :return:
+ """
+ inst = SongCoverInference()
+ while True:
+ logging.info("effect start get...")
+ data = queue.get()
+ song_id, work_dir, svc_file, gender = data
+ logging.info("effect:{},{},{},{}".format(song_id, work_dir, svc_file, gender))
+ err, effect_file = inst.effect(song_id, work_dir, svc_file)
+ msg = [song_id, err, svc_file, effect_file, gender]
+ logging.info("effect,finish:cid={},state={},svc_file={},effect_file={},gender={}". \
+ format(song_id, err, svc_file, effect_file, gender))
+ finish_queue.put(msg)
+
+
+class AutoCoverToolWorker:
+ def __init__(self):
+ self.base_dir = "/tmp"
+ self.work_dir = ""
+ self.inst = SongCoverInference()
+
+ def update_state(self, song_id, state):
+ sql = "update svc_queue_table set state={},update_time={} where song_id = {}". \
+ format(state, int(time.time()), song_id)
+ banned_user_map['db'] = "av_db"
+ update_db(sql, banned_user_map)
+
+ def get_one_data(self):
+ sql = "select song_id, url from svc_queue_table where state = 0 order by create_time desc limit 1"
+ banned_user_map["db"] = "av_db"
+ data = get_data_by_mysql(sql, banned_user_map)
+ if len(data) == 0:
+ return None, None
+ song_id, song_url = data[0]
+ if song_id != "":
+ self.update_state(song_id, gs_state_use)
+ return str(song_id), song_url
+
+ def pre_process(self, work_dir, song_url):
+ """
+ 创建文件夹,下载数据
+ :return:
+ """
+
+ ext = str(song_url).split(".")[-1]
+ dst_file = "{}/src_origin.{}".format(work_dir, ext)
+ cmd = "wget {} -O {}".format(song_url, dst_file)
+ print(cmd)
+ os.system(cmd)
+ if not os.path.exists(dst_file):
+ return gs_actw_err_code_download_err
+ dst_mp3_file = "{}/src.mp3".format(work_dir)
+ cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {} ".format(dst_file, dst_mp3_file)
+ os.system(cmd)
+ if not os.path.exists(dst_mp3_file):
+ return gs_actw_err_code_trans_err
+ return gs_err_code_success
+
+ def post_process(self, msg):
+ song_id, err, svc_file, effect_file, gender = msg
+ work_dir = os.path.join(self.base_dir, str(song_id))
+ if err != gs_err_code_success:
+ self.update_state(song_id, -err)
+ return
+
+ # 替换和混音
+ err, mix_path_mp3 = self.inst.mix(song_id, work_dir, svc_file, effect_file)
+ logging.info(
+ "post_process:song_id={},work_dir={},svc_file={},gender={}".format(song_id, work_dir, svc_file, gender))
+
+ svc_url = None
+ state = gs_state_finish
+ if err != gs_err_code_success:
+ state = -err
+ else:
+ # 上传到cos
+ mix_name = os.path.basename(mix_path_mp3)
+ key = "av_res/svc_res/{}".format(mix_name)
+ if not upload_file2cos(key, mix_path_mp3):
+ state = -err
+ else:
+ state = gs_state_finish
+ svc_url = key
+ logging.info("upload_file2cos:song_id={},key={},mix_path_mp3={}".format(song_id, key, mix_path_mp3))
+
+ # 更新数据库
+ if state != gs_state_finish:
+ self.update_state(song_id, state)
+ return
+
+ sql = "update svc_queue_table set state={},update_time={},svc_url=\"{}\",gender={} where song_id = {}". \
+ format(gs_state_finish, int(time.time()), svc_url, gender, song_id)
+ logging.info("post_process:song_id={},sql={}".format(song_id, sql))
+ banned_user_map['db'] = "av_db"
+ update_db(sql, banned_user_map)
+
+ def process(self):
+ logging.info("start_process....")
+ worker_num = 4
+ worker_queue = mp.Manager().Queue(maxsize=int(worker_num * 1.5))
+ finish_queue = mp.Manager().Queue(maxsize=int(worker_num * 1.5))
+ pool = mp.Pool(processes=worker_num)
+ for i in range(worker_num):
+ pool.apply_async(effect,
+ args=(worker_queue, finish_queue),
+ error_callback=post_process_err_callback)
+
+ while True:
+ # 将堆积的内容处理一遍
+ while finish_queue.qsize() > 0:
+ msg = finish_queue.get(timeout=1)
+ self.post_process(msg)
+ song_id, err, svc_file, effect_file, gender = msg
+ work_dir = os.path.join(self.base_dir, str(song_id))
+ logging.info("clear = song_id={},work_dir={}".format(song_id, work_dir))
+ shutil.rmtree(work_dir)
+
+ song_id, song_url = self.get_one_data()
+ logging.info("\n\nget_one_data = {},{}".format(song_id, song_url))
+ if song_id is None:
+ time.sleep(5)
+ continue
+
+ # 创建空间
+ work_dir = os.path.join(self.base_dir, str(song_id))
+ if os.path.exists(work_dir):
+ shutil.rmtree(work_dir)
+ os.makedirs(work_dir)
+ logging.info("song_id={},work_dir={},finish".format(song_id, work_dir))
+
+ # 预处理
+ err = self.pre_process(work_dir, song_url)
+ if err != gs_err_code_success:
+ self.update_state(song_id, -err)
+ continue
+ logging.info("song_id={},work_dir={},pre_process".format(song_id, work_dir))
+
+ # 获取svc数据
+ err, svc_file = self.inst.generate_svc_file(song_id, work_dir)
+ if err != gs_err_code_success:
+ self.update_state(song_id, -err)
+ continue
+ logging.info("song_id={},work_dir={},generate_svc_file".format(song_id, work_dir))
+
+ # 做音效处理的异步代码
+ gender = self.inst.get_gender(svc_file)
+ worker_queue.put([song_id, work_dir, svc_file, gender])
+ logging.info("song_id={},work_dir={},svc_file={},gender={}".format(song_id, work_dir, svc_file, gender))
+ pool.close()
+ pool.join()
+
+
+if __name__ == '__main__':
+ actw = AutoCoverToolWorker()
+ actw.process()
diff --git a/AutoCoverTool/online/readme.txt b/AutoCoverTool/online/readme.txt
new file mode 100644
index 0000000..5d82d70
--- /dev/null
+++ b/AutoCoverTool/online/readme.txt
@@ -0,0 +1,44 @@
+自动翻唱工具
+功能: 输入原唱的音频文件,输出一个翻唱的作品
+结构介绍:
+---online
+ ---common.py // 共用代码
+ ---inference_one.py // 给定一个音频,输出一个翻唱作品
+ ---inference_worker.py // 从数据库中不断读取获取音频,然后下载制作好翻唱作品后,上传cos,并将信息保存到数据库
+
+环境安装:
+1. python环境安装:
+ 环境安装:
+ conda create -n auto_song_cover python=3.9
+ # 安装demucs环境[进入到ref.music_remover 执行pip install -r requirements.txt]
+ # 安装so_vits_svc环境[进入到ref.so_vits_svc 执行pip install -r requirements.txt]
+ pip install librosa
+ pip install scikit-maad
+ pip install praat-parselmouth
+ pip install matplotlib
+ pip install torchvision
+ pip install madmom
+ pip install torchstat
+ 环境设置:
+ export PATH=$PATH:/data/gpu_env_common/env/bin/ffmpeg/bin
+ export PYTHONPATH=$PWD:$PWD/ref/music_remover/demucs:$PWD/ref/so_vits_svc:$PWD/ref/split_dirty_frame
+
+2. 可执行文件安装:
+ 直接从sg-prod-ipaint-gpu-1的对应位置拷贝即可,如果需要编译,则进入到ref/tools/mixer中编译前三个,在本仓库的上一次目录中编译dereverbrate
+ gs_denoise_exe = "/opt/soft/bin/denoise_exe"
+ gs_draw_volume_exe = "/opt/soft/bin/draw_volume"
+ gs_simple_mixer_path = "/opt/soft/bin/simple_mixer"
+ gs_rever_path = "/opt/soft/bin/dereverbrate"
+
+3. 模型资源相关
+ 从sg-prod-ipaint-gpu-1的data目录拷贝train_users数据
+ data/models/split_dirty_frame_v5_3_epoch3_852.pth
+ self.speakers_model_path = "data/train_users/{}/logs/32k/G_2000.pth"
+ self.speakers_model_config = "data/train_users/{}/config/config.json"
+ 将上面的三个都拷贝到代码的data目录即可
+
+快速使用:
+1. 线上使用: python3 inference_worker.py
+2. 离线跑单个: python3 inference_one.py
+
+
diff --git a/AutoCoverTool/ref/music_remover/separate_interface.py b/AutoCoverTool/ref/music_remover/separate_interface.py
index ea3bb73..646d96a 100644
--- a/AutoCoverTool/ref/music_remover/separate_interface.py
+++ b/AutoCoverTool/ref/music_remover/separate_interface.py
@@ -1,103 +1,103 @@
"""
分离的对外函数
"""
import os
import sys
import time
import shutil
import logging
from demucs.pretrained import get_model
from demucs.separate import *
# 第三方二进制文件
gs_standard_audio_exe = "/opt/soft/bin/standard_audio"
gs_ffmpeg_exe = "ffmpeg"
# 全局配置
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 错误码
ERR_CODE_SUCCESS = 0
ERR_CODE_INPUT_FILE_NOT_EXISTS = 1
class SeparateInterface:
"""
分离器对外接口,只生成伴奏
"""
def __init__(self):
sp_start = time.time()
# 评价之后该版本模型的效果效果最佳,性能也合适
# 对比评价过mdx_extra_q和htdemucs_ft
# 其中mdx_extra_q和mdx_extra速度一致,但是和声保留情况不如后者
# htdemucs_ft耗时是mdx_extra的1.6倍,在部分歌曲消去的程度上比mdx_extra好,但是和声没有mdx_extra保留的完整|详情见xishuashua的开头和声部分
self.model = get_model('mdx_extra')
self.tmp_dir = os.path.join("/tmp/separate")
if not os.path.exists(self.tmp_dir):
os.makedirs(self.tmp_dir)
logging.info("SeparateInterface: load model spent = {}".format(time.time() - sp_start))
def process_logic(self, cid, cache_dir, in_file, vocal_out_file, acc_out_file, dev='cuda'):
model = self.model
sp_start = time.time()
wav = load_track(in_file, model.audio_channels, model.samplerate)
logging.info("--------load_track:cid={},sp={}".format(cid, time.time() - sp_start))
# 模型推理
sp_start = time.time()
ref = wav.mean(0)
wav = (wav - ref.mean()) / ref.std()
# wav[None] -> 增加一个维度,原来是[2, xxx] -> [1, 2, xxx]
sources = apply_model(model, wav[None], device=dev, shifts=1, split=True, overlap=0.25, progress=True,
num_workers=0)[0]
sources = sources * ref.std() + ref.mean()
logging.info("--------apply_model:cid={},sp={}".format(cid, time.time() - sp_start))
# 只保留伴奏
sources = list(sources)
vocals = sources.pop(model.sources.index("vocals"))
if vocals is not None:
save_audio(vocals, vocal_out_file, samplerate=model.samplerate)
other_stem = th.zeros_like(sources[0])
for sc in sources:
other_stem += sc
if acc_out_file is not None:
save_audio(other_stem, acc_out_file, samplerate=model.samplerate)
if vocal_out_file is not None:
if not os.path.exists(vocal_out_file):
return False
if acc_out_file is not None:
if not os.path.exists(acc_out_file):
return False
return True
def process(self, cid, in_file, vocal_out_file, acc_out_file, dev='cuda'):
if not os.path.exists(in_file):
return ERR_CODE_INPUT_FILE_NOT_EXISTS
st_time = time.time()
logging.info("--------process:cid={},{},{},{}".format(cid, in_file, vocal_out_file, acc_out_file))
cache_dir = os.path.join(self.tmp_dir, str(cid))
if os.path.exists(cache_dir):
shutil.rmtree(cache_dir)
os.makedirs(cache_dir)
# 核心处理逻辑
ret = self.process_logic(cid, cache_dir, in_file, vocal_out_file, acc_out_file, dev)
shutil.rmtree(cache_dir)
logging.info(
"--------finish:cid={},{},{},{}|{}|sp={}\n\n".format(cid, in_file, vocal_out_file, acc_out_file, dev, ret,
time.time() - st_time))
return ret
-#
+
# if __name__ == '__main__':
# si = SeparateInterface()
# in_f = sys.argv[1]
# out_f = sys.argv[2]
# dev = sys.argv[3] # cuda或者cpu
# for i in range(0, 3):
# si.process(str(1), in_f, out_f, dev)
diff --git a/AutoCoverTool/script/inference_one.py b/AutoCoverTool/script/inference_one.py
deleted file mode 100644
index 3565bec..0000000
--- a/AutoCoverTool/script/inference_one.py
+++ /dev/null
@@ -1,1529 +0,0 @@
-"""
-单个处理的逻辑
-song_id:
- ---src.mp3 // 源数据,需要提前放进去
- ---cache
- ---vocal.wav // 分离之后产生
- ---acc.wav // 分离之后产生
- ---vocal_32.wav // 分离之后产生
- ---song_id_sp1.wav // 合成之后产生
- ---song_id_sp2.wav // 合成之后产生
- ---song_id_sp2_d.wav // 降噪之后生成
- ---song_id_sp2_dv.wav // 降噪+拉伸之后产生 [占比太高的不产生]
- ---song_id_sp2_dve442.wav // 手动调整之后产生
- ---song_id_sp2_dve442_replace.wav // 替换之后产生
- ---song_id_sp2_dve442_replace_mix.wav // 人声+伴奏混合之后产生
- ---song_id
- --acc.mp3 // 44k双声道320k
- --vocal.mp3 // 44k双声道320k
- --src.mp3 // 44k双声道320k
- --song_id_sp2_dv.mp3 // 44k单声道320k
- ---song_id_out // 对外输出
- --src.mp3 // 原始音频
- --song_id_sp2_dv_replace_mix.mp3 // 制作完成的音频
-
-环境安装:
-conda create -n auto_song_cover python=3.9
-# 安装demucs环境[进入到ref.music_remover 执行pip install -r requirements.txt]
-# 安装so_vits_svc环境[进入到ref.so_vits_svc 执行pip install -r requirements.txt]
-pip install librosa
-pip install scikit-maad
-pip install praat-parselmouth
-pip install matplotlib
-pip install torchvision
-pip install madmom
-pip install torchstat
-环境设置:
-export PATH=$PATH:/data/gpu_env_common/env/bin/ffmpeg/bin
-export PYTHONPATH=$PWD:$PWD/ref/music_remover/demucs:$PWD/ref/so_vits_svc:$PWD/ref/split_dirty_frame
-"""
-
-import os
-import time
-import shutil
-import random
-import logging
-import librosa
-
-gs_err_code_success = 0
-gs_err_code_no_src_mp3 = 1
-gs_err_code_separate = 2
-gs_err_code_trans_32 = 3
-gs_err_code_encode_err = 4
-gs_err_code_replace_err = 5
-gs_err_code_replace_trans_err = 6
-gs_err_code_mix_err = 7
-gs_err_code_mix_transcode_err = 8
-gs_err_code_no_src_dir = 9
-gs_err_code_volume_err = 10
-gs_err_code_trans2_442 = 11
-gs_err_code_reverb = 12
-
-gs_denoise_exe = "/opt/soft/bin/denoise_exe"
-gs_draw_volume_exe = "/opt/soft/bin/draw_volume_v1"
-gs_simple_mixer_path = "/opt/soft/bin/simple_mixer"
-gs_rever_path = "/data/rsync/jianli.yang/dereverbrate/build/dereverbrate_test"
-
-from ref.music_remover.separate_interface import SeparateInterface
-from ref.so_vits_svc.inference_main import *
-from ref.split_dirty_frame.script.process_one import ReplaceVocalFrame, construct_power_fragment
-from ref.split_dirty_frame.dataset.dataset import file2mfcc
-
-
-class SongCoverInference:
- def __init__(self):
- self.work_dir = None
- self.cache_dir = None
- self.cid = None
- self.src_mp3 = None
- self.vocal_path = None
- self.vocal_32_path = None
- self.acc_path = None
- self.speakers = [
- 10414574138721494,
- 10414574140317353,
- 1688849864840588,
- 3634463651,
- 5629499489839033,
- 5910973794723621,
- 6755399374234747,
- 8162774327817435,
- 8162774329368194,
- 1125899914308640, # 以下为男声,包括这个
- 12384898975368914,
- 12947848931397021,
- 3096224748076687,
- 3096224751151928,
- 5066549357604730,
- 5348024335101054,
- 6755399442719465,
- 7036874421386111
- ]
- self.speakers_model_path = "data/train_users/{}/logs/32k/G_2000.pth"
- self.speakers_model_config = "data/train_users/{}/config/config.json"
-
- st = time.time()
- self.separate_inst = SeparateInterface()
- self.replace_vocal_frame_inst = ReplaceVocalFrame("data/models/split_dirty_frame_v5_3_epoch3_852.pth")
- logging.info("SongCoverInference init sp={}".format(time.time() - st))
-
- def separate(self, cid, src_mp3, vocal_path, acc_path):
- """
- 人声伴奏分离
- :param cid:
- :param src_mp3:
- :param vocal_path:
- :param acc_path:
- :return:
- """
- st = time.time()
- if not self.separate_inst.process(cid, src_mp3, vocal_path, acc_path):
- return gs_err_code_separate
- if not os.path.exists(vocal_path) or not os.path.exists(acc_path):
- return gs_err_code_separate
-
- # 转码出一个32k单声道的数据
- cmd = "ffmpeg -i {} -ar 32000 -ac 1 -y {} -loglevel fatal".format(vocal_path, self.vocal_32_path)
- os.system(cmd)
- if not os.path.exists(self.vocal_32_path):
- return gs_err_code_trans_32
- print("separate:cid={}|sp={}".format(cid, time.time() - st))
- return gs_err_code_success
-
- def get_start_ms(self, vocal_path):
- """
- 给定原始音频,找一段连续10s的音频
- :param vocal_path:
- :return:
- """
- audio, sr = librosa.load(vocal_path, sr=16000)
- audio = librosa.util.normalize(audio)
- # 帧长100ms,帧移10ms,计算能量
- power_arr = []
- for i in range(0, len(audio) - 1600, 160):
- power_arr.append(np.sum(np.abs(audio[i:i + 160])) / 160)
- # 将能量小于等于10的部分做成段
- power_arr = construct_power_fragment(power_arr)
- fragments = []
- last_pos = 0
- for idx, line in enumerate(power_arr):
- start = round(float(line[0]) * 0.01, 3)
- duration = round(float(line[1]) * 0.01, 3)
- fragments.append([last_pos, start - last_pos])
- last_pos = start + duration
- if last_pos < len(audio) / sr:
- fragments.append([last_pos, len(audio) / sr - last_pos])
-
- # 合并数据,两者间隔在50ms以内的合并起来
- idx = 0
- while idx < len(fragments) - 1:
- if fragments[idx + 1][0] - (fragments[idx][0] + fragments[idx][1]) < 0.05:
- fragments[idx][1] = fragments[idx + 1][0] + fragments[idx + 1][1] - fragments[idx][0]
- del fragments[idx + 1]
- idx -= 1
- idx += 1
-
- # out_file = vocal_path + "_power.csv"
- # with open(out_file, "w") as f:
- # f.write("Name\tStart\tDuration\tTime Format\tType\n")
- # for fragment in fragments:
- # start = round(float(fragment[0]), 3)
- # duration = round(float(fragment[1]), 3)
- # strr = "{}\t{}\t{}\t{}\n".format("11", start, duration, "decimal\tCue\t")
- # f.write(strr)
-
- # 筛选出开始的位置
- # 1. 连续时长大于10s,当前段长度大于3s
- # 2. 不可用
- # 从0到fragments[idx], 包含idx其中人声段的总和
- tot_vocal_duration = [fragments[0][1]]
- for i in range(1, len(fragments)):
- tot_vocal_duration.append(tot_vocal_duration[i - 1] + fragments[i][1])
-
- # 计算出任意两段之间非人声占比
- for i in range(0, len(fragments)):
- if fragments[i][1] >= 3:
- now_tot = 0
- if i > 0:
- now_tot = tot_vocal_duration[i - 1]
- for j in range(i + 1, len(fragments)):
- cur_rate = tot_vocal_duration[j] - now_tot
- cur_rate = cur_rate / (fragments[j][1] + fragments[j][0] - fragments[i][0])
- if cur_rate > 0.1:
- return fragments[i][0]
- return -1
-
- def inference_speaker(self):
- """
- 推理生成合成后的音频
- 随机取5个干声,选择占比最小的,并且要求占比小于0.3
- :return:
- """
- st = time.time()
- out_speakers = random.sample(self.speakers, 5)
- out_songs_dict = {}
- for speaker in out_speakers:
- model_path = self.speakers_model_path.format(speaker)
- config_path = self.speakers_model_config.format(speaker)
- song_path = os.path.join(self.cache_dir, "{}_{}.wav".format(self.cid, speaker))
- try:
- inf(model_path, config_path, self.vocal_32_path, song_path, "prod")
- except Exception as ex:
- logging.info("cid={}, inference_speaker err={}".format(self.cid, ex))
- continue
- if os.path.exists(song_path):
- rate = self.replace_vocal_frame_inst.get_rate(song_path)
- if rate < 0.3:
- out_songs_dict[song_path] = rate
-
- # 从内部选择占比最低的
- out_songs = []
- if len(out_songs_dict.keys()) > 0:
- st_sec = self.get_start_ms(self.vocal_path)
- song_msg = sorted(out_songs_dict.items(), key=lambda kv: kv[1])[0]
- out_songs = [song_msg[0]]
- logging.info("GetRate:cid={},song={},rate={},st_tm={}".format(self.cid, song_msg[0], round(song_msg[1], 2),
- round(st_sec, 3)))
- print("GetRate:cid={},song={},rate={},st_tm={}".format(self.cid, song_msg[0], round(song_msg[1], 2),
- round(st_sec, 3)))
- # logging.info("inference_speaker len = {} finish sp = {}".format(len(out_songs), time.time() - st))
- print("inference_speaker len = {} finish sp = {}".format(len(out_songs), time.time() - st))
- return out_songs
-
- def get_new_vocal_rate(self, songs):
- """
- 获取人声的比率
- :param songs:
- :return:
- """
- st = time.time()
- need_to_process_song = []
- for song in songs:
- rate = self.replace_vocal_frame_inst.get_rate(song)
- logging.info("{} {} replace_rate={}".format(self.cid, song, rate))
- if rate < 1.0:
- need_to_process_song.append(song)
- logging.info(
- "get_new_vocal_rate belen = {} len = {} finish sp = {}".format(len(songs), len(need_to_process_song),
- time.time() - st))
- return need_to_process_song
-
- def preprocess_vocal(self, songs, vocal_path):
- """
- 1. 降噪
- 2. 拉伸
- :param songs:
- :param vocal_path: 参考的音频信号
- :return:
- """
- st = time.time()
- dv_out_list = []
- for song in songs:
- denoise_path = str(song).replace(".wav", "_d.wav")
- cmd = "{} {} {}".format(gs_denoise_exe, song, denoise_path)
- os.system(cmd)
- if not os.path.exists(denoise_path):
- print("{} {} ERROR denoise".format(self.cid, song))
- continue
- # 拉伸
- volume_path = str(song).replace(".wav", "_dv.wav")
- cmd = "{} {} {} {}".format(gs_draw_volume_exe, denoise_path, vocal_path, volume_path)
- os.system(cmd)
- if not os.path.exists(volume_path):
- print("{} {} ERROR denoise".format(self.cid, volume_path))
- continue
- dv_out_list.append(volume_path)
- print(
- "preprocess_vocal belen = {} len = {} finish sp = {}".format(len(songs), len(dv_out_list),
- time.time() - st))
- return dv_out_list
-
- def output(self, dv_out_list):
- """
- 对外输出数据
- :param dv_out_list:
- :return:
- """
- st = time.time()
- out_dir = os.path.join(self.work_dir, self.cid)
- if os.path.exists(out_dir):
- shutil.rmtree(out_dir)
- os.makedirs(out_dir)
-
- # 拷贝数据
- dst_mp3_path = os.path.join(out_dir, "src_mp3")
- dst_acc_path = os.path.join(out_dir, "acc.mp3")
- dst_vocal_path = os.path.join(out_dir, "vocal.mp3")
- shutil.copyfile(self.src_mp3, dst_mp3_path)
- cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(self.acc_path, dst_acc_path)
- os.system(cmd)
- if not os.path.exists(dst_acc_path):
- return gs_err_code_encode_err
- cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(self.vocal_path, dst_vocal_path)
- os.system(cmd)
- if not os.path.exists(dst_vocal_path):
- return gs_err_code_encode_err
-
- # 将所有数据放到out_dir中,用于给人工标注
- for dv_wav in dv_out_list:
- dv_wav_name = str(dv_wav).split("/")[-1].replace(".wav", "_441.mp3")
- dst_dv_path = os.path.join(out_dir, dv_wav_name)
-
- cmd = "ffmpeg -i {} -ar 44100 -ac 1 -ab 320k -y {} -loglevel fatal".format(dv_wav, dst_dv_path)
- os.system(cmd)
- if not os.path.exists(dst_dv_path):
- print("{} encode err!".format(cmd))
- continue
- logging.info(
- "preprocess_vocal output sp = {}".format(time.time() - st))
-
- def process_one(self, cid, work_dir, enable_output=False):
- logging.info("\nstart:cid={},work_dir={}----------------------->>>>>>>>".format(cid, work_dir))
- self.cid = cid
- self.work_dir = work_dir
-
- # 所有不对外交付的,全部放到这里
- self.cache_dir = os.path.join(work_dir, "cache")
- if os.path.exists(self.cache_dir):
- shutil.rmtree(self.cache_dir)
- os.makedirs(self.cache_dir)
-
- self.src_mp3 = os.path.join(self.work_dir, "src.mp3")
- if not os.path.exists(self.src_mp3):
- return gs_err_code_no_src_mp3
- self.vocal_path = os.path.join(self.cache_dir, "vocal.wav")
- self.vocal_32_path = os.path.join(self.cache_dir, "vocal_32.wav")
- self.acc_path = os.path.join(self.cache_dir, "acc.wav")
-
- if not os.path.exists(self.vocal_32_path):
- logging.info("start separate ... {} {} {}".format(self.src_mp3, self.vocal_path, self.acc_path))
- err = self.separate(cid, self.src_mp3, self.vocal_path, self.acc_path)
- if err != gs_err_code_success:
- return err
- logging.info("start inference_speaker ...")
- out_songs = self.inference_speaker()
- logging.info("start get_new_vocal_rate ...")
- # out_songs = self.get_new_vocal_rate(out_songs)
- dv_out_list = self.preprocess_vocal(out_songs, self.vocal_path)
- if enable_output:
- self.output(dv_out_list)
- else:
- # 默认全部处理一遍
- for dv_out_path in dv_out_list:
- src_path = dv_out_path.replace("_dv.wav", ".wav")
- err = self.after_process(self.cid, self.work_dir, src_path, dv_out_path, self.vocal_path, self.acc_path,
- True, True)
- if err != 0:
- logging.info("after_process err {}".format(err))
- logging.info("finish:cid={},work_dir={}----------------------->>>>>>>>".format(cid, work_dir))
- return gs_err_code_success
-
- def reverb_by_vocal(self, file):
- st = time.time()
- file_442 = file.replace(".wav", "_442.wav")
- if not os.path.exists(file_442):
- cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {}".format(file, file_442)
- os.system(cmd)
- if not os.path.exists(file_442):
- return None, gs_err_code_trans2_442
-
- file_dst = file.replace(".wav", "_442_dr.wav")
- cmd = "{} {} {} {}".format(gs_rever_path, self.vocal_path, file_442, file_dst)
- os.system(cmd)
- if not os.path.exists(file_dst):
- return None, gs_err_code_reverb
- print("cid = {}, reverb_by_vocal sp={}".format(self.cid, time.time() - st))
- return file_dst, gs_err_code_success
-
- def after_process(self, cid, work_dir, in_file, effect_file, vocal_file, acc_file, need_draw=True,
- need_reverb=True):
- """
- 后处理逻辑
- 将处理好的音频进行替换,然后和伴奏进行混合,最后进行编码
- :return:
- """
- if need_reverb:
- # 抓取混响
- effect_file, err = self.reverb_by_vocal(in_file)
- if err != gs_err_code_success:
- return err
-
- if need_draw:
- # 增加一个拉伸的步骤
- volume_path = str(effect_file).replace(".wav", "_dv.wav")
- cmd = "{} {} {} {}".format(gs_draw_volume_exe, effect_file, vocal_file, volume_path)
- print(cmd)
- os.system(cmd)
- if not os.path.exists(volume_path):
- print("{} {} ERROR draw volume".format(self.cid, volume_path))
- return gs_err_code_volume_err
- effect_file = volume_path
-
- st = time.time()
- self.cid = cid
- self.work_dir = work_dir
- self.src_mp3 = os.path.join(self.work_dir, "src.mp3")
- if not os.path.exists(self.work_dir):
- return gs_err_code_no_src_dir
- self.replace_vocal_frame_inst.process(in_file, effect_file, vocal_file)
- dst_path = effect_file + "_replace.wav"
- if not os.path.exists(dst_path):
- return gs_err_code_replace_err
- print("replace_vocal_frame_inst sp = {}".format(time.time() - st))
-
- # 转码
- dst_path_442 = dst_path.replace("_replace.wav", "_replace442.wav")
- cmd = "ffmpeg -i {} -ar 44100 -ac 2 -y {} -loglevel fatal".format(dst_path, dst_path_442)
- os.system(cmd)
- if not os.path.exists(dst_path_442):
- return gs_err_code_replace_trans_err
-
- # 合并转码后再做一次拉伸,保证响度
- volume_path = str(dst_path_442).replace(".wav", "_dv.wav")
- cmd = "{} {} {} {}".format(gs_draw_volume_exe, dst_path_442, vocal_file, volume_path)
- print(cmd)
- os.system(cmd)
- if not os.path.exists(volume_path):
- print("{} {} ERROR draw volume".format(self.cid, volume_path))
- return gs_err_code_volume_err
- dst_path_442 = volume_path
-
- # 混合
- mix_path = dst_path_442.replace("_replace442.wav", "_replace442_mix.wav")
- cmd = "{} {} {} {}".format(gs_simple_mixer_path, dst_path_442, acc_file, mix_path)
- print("{}".format(cmd))
- os.system(cmd)
- if not os.path.exists(mix_path):
- return gs_err_code_mix_err
-
- # 编码为mp3
- output_dir = os.path.join(self.work_dir, self.cid + "_out")
- if not os.path.exists(output_dir):
- os.makedirs(output_dir)
- name = str(mix_path).replace("_replace442_mix.wav", "_replace442_mix.mp3").split("/")[-1]
- mix_path_mp3 = os.path.join(output_dir, name)
- cmd = "ffmpeg -i {} -ab 320k -y {} -loglevel fatal".format(mix_path, mix_path_mp3)
- os.system(cmd)
- if not os.path.exists(mix_path_mp3):
- return gs_err_code_mix_transcode_err
-
- # 拷贝src到output_dir
- # shutil.copyfile(self.src_mp3, os.path.join(output_dir, "src.mp3"))
- # logging.info("after_process sp = {}".format(time.time() - st))
- return gs_err_code_success
-
-
-def test_volume_dir():
- base_dir = "/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_3_w4"
- # arr = [
- # "611752105015523266/cache/611752105015523266_5066549357604730.wav",
- # "611752105017233541/cache/611752105017233541_6755399442719465.wav",
- # "611752105030414513/cache/611752105030414513_1125899914308640.wav",
- # "611752105030414549/cache/611752105030414549_5066549357604730.wav",
- # "611752105030414557/cache/611752105030414557_8162774327817435.wav",
- # "611752105030414588/cache/611752105030414588_1125899914308640.wav",
- # "611752105030414597/cache/611752105030414597_6755399374234747.wav",
- # "611752105030414613/cache/611752105030414613_5066549357604730.wav",
- # "611752105030414615/cache/611752105030414615_1125899914308640.wav",
- # "611752105030414619/cache/611752105030414619_5066549357604730.wav",
- # "611752105030414633/cache/611752105030414633_8162774327817435.wav",
- # "611752105030414638/cache/611752105030414638_8162774329368194.wav",
- # "611752105030414689/cache/611752105030414689_8162774327817435.wav",
- # "611752105030414702/cache/611752105030414702_6755399374234747.wav",
- # "611752105030414742/cache/611752105030414742_5066549357604730.wav",
- # "611752105030414763/cache/611752105030414763_1125899914308640.wav",
- # "611752105030414773/cache/611752105030414773_8162774329368194.wav",
- # "611752105030414777/cache/611752105030414777_8162774329368194.wav",
- # "611752105030414779/cache/611752105030414779_1125899914308640.wav",
- # "611752105030414784/cache/611752105030414784_6755399442719465.wav",
- # "611752105030414890/cache/611752105030414890_5066549357604730.wav",
- # "611752105030414915/cache/611752105030414915_5066549357604730.wav",
- # "611752105030414925/cache/611752105030414925_1125899914308640.wav",
- # "611752105030414929/cache/611752105030414929_1125899914308640.wav",
- # "611752105030414935/cache/611752105030414935_3634463651.wav",
- # "611752105030414943/cache/611752105030414943_6755399374234747.wav",
- # "611752105030414957/cache/611752105030414957_12384898975368914.wav",
- # "611752105030414962/cache/611752105030414962_8162774327817435.wav",
- # "611752105030414976/cache/611752105030414976_10414574138721494.wav",
- # "611752105030414993/cache/611752105030414993_12947848931397021.wav",
- # "611752105030414995/cache/611752105030414995_5066549357604730.wav",
- # "611752105030415003/cache/611752105030415003_12947848931397021.wav",
- # "611752105030415014/cache/611752105030415014_10414574138721494.wav",
- # "611752105030415018/cache/611752105030415018_8162774329368194.wav",
- # "611752105030415032/cache/611752105030415032_6755399442719465.wav",
- # "611752105030415056/cache/611752105030415056_3096224748076687.wav",
- # "611752105030415067/cache/611752105030415067_1125899914308640.wav",
- # "611752105030415071/cache/611752105030415071_5910973794723621.wav",
- # "611752105030415074/cache/611752105030415074_1125899914308640.wav",
- # "611752105030415083/cache/611752105030415083_1125899914308640.wav",
- # "611752105030415087/cache/611752105030415087_5910973794723621.wav",
- # "611752105030415100/cache/611752105030415100_10414574138721494.wav",
- # "611752105030415103/cache/611752105030415103_8162774329368194.wav"
- # ]
- # arr = [
- # "611752105020256284/cache/611752105020256284_8162774329368194.wav",
- # "611752105020286433/cache/611752105020286433_1125899914308640.wav",
- # "611752105020286443/cache/611752105020286443_12384898975368914.wav",
- # "611752105020286446/cache/611752105020286446_5629499489839033.wav",
- # "611752105020290639/cache/611752105020290639_3634463651.wav",
- # "611752105020290695/cache/611752105020290695_1125899914308640.wav",
- # "611752105020315328/cache/611752105020315328_8162774329368194.wav",
- # "611752105020315368/cache/611752105020315368_1688849864840588.wav",
- # "611752105020336950/cache/611752105020336950_3634463651.wav",
- # "611752105020343687/cache/611752105020343687_8162774327817435.wav",
- # "611752105020343699/cache/611752105020343699_1125899914308640.wav",
- # "611752105020351134/cache/611752105020351134_10414574138721494.wav",
- # "611752105020357112/cache/611752105020357112_8162774327817435.wav",
- # "611752105020378620/cache/611752105020378620_8162774327817435.wav",
- # "611752105020387015/cache/611752105020387015_1125899914308640.wav",
- # "611752105020394121/cache/611752105020394121_1125899914308640.wav",
- # "611752105020394297/cache/611752105020394297_3634463651.wav",
- # "611752105020411654/cache/611752105020411654_3096224751151928.wav",
- # "611752105020417688/cache/611752105020417688_12947848931397021.wav",
- # "611752105020563523/cache/611752105020563523_8162774327817435.wav",
- # "611752105021332759/cache/611752105021332759_3634463651.wav",
- # "611752105022446809/cache/611752105022446809_8162774327817435.wav",
- # "611752105022647082/cache/611752105022647082_8162774327817435.wav",
- # "611752105022667231/cache/611752105022667231_8162774327817435.wav",
- # "611752105022735101/cache/611752105022735101_5066549357604730.wav",
- # "611752105022736204/cache/611752105022736204_1125899914308640.wav",
- # "611752105022745595/cache/611752105022745595_10414574138721494.wav",
- # "611752105022770952/cache/611752105022770952_1125899914308640.wav",
- # "611752105022842004/cache/611752105022842004_3634463651.wav",
- # "611752105022842477/cache/611752105022842477_1125899914308640.wav",
- # "611752105023434557/cache/611752105023434557_6755399374234747.wav",
- # "611752105023532439/cache/611752105023532439_8162774329368194.wav",
- # "611752105023623965/cache/611752105023623965_3096224748076687.wav",
- # "611752105024250202/cache/611752105024250202_8162774327817435.wav",
- # "611752105024628047/cache/611752105024628047_5066549357604730.wav",
- # "611752105024676794/cache/611752105024676794_6755399442719465.wav",
- # "611752105024678976/cache/611752105024678976_6755399442719465.wav",
- # "611752105024679221/cache/611752105024679221_8162774329368194.wav",
- # "611752105024953316/cache/611752105024953316_1688849864840588.wav",
- # "611752105025104181/cache/611752105025104181_6755399374234747.wav",
- # "611752105026189342/cache/611752105026189342_5910973794723621.wav",
- # "611752105026523547/cache/611752105026523547_1125899914308640.wav",
- # "611752105026707760/cache/611752105026707760_3096224748076687.wav",
- # "611752105026771723/cache/611752105026771723_8162774327817435.wav",
- # "611752105026946178/cache/611752105026946178_10414574140317353.wav",
- # "611752105027047993/cache/611752105027047993_5066549357604730.wav",
- # "611752105027188746/cache/611752105027188746_5066549357604730.wav",
- # "611752105027189453/cache/611752105027189453_8162774329368194.wav",
- # "611752105027302268/cache/611752105027302268_5066549357604730.wav",
- # "611752105027557408/cache/611752105027557408_1125899914308640.wav",
- # "611752105028650636/cache/611752105028650636_8162774327817435.wav",
- # "611752105028683824/cache/611752105028683824_1125899914308640.wav",
- # "611752105029990849/cache/611752105029990849_7036874421386111.wav",
- # "611752105029993297/cache/611752105029993297_6755399374234747.wav",
- # "611752105030077711/cache/611752105030077711_3096224748076687.wav",
- # "611752105030104548/cache/611752105030104548_5629499489839033.wav",
- # "611752105030419624/cache/611752105030419624_8162774327817435.wav",
- # "611752105030419633/cache/611752105030419633_1125899914308640.wav",
- # "611752105030419688/cache/611752105030419688_1125899914308640.wav",
- # "611752105030433779/cache/611752105030433779_3634463651.wav"
- # ]
-
- arr = [
- "611752105020256284/cache/611752105020256284_8162774329368194.wav",
- "611752105020286433/cache/611752105020286433_1125899914308640.wav",
- "611752105020286443/cache/611752105020286443_12384898975368914.wav",
- "611752105020286446/cache/611752105020286446_5629499489839033.wav",
- "611752105020290639/cache/611752105020290639_3634463651.wav",
- "611752105020290695/cache/611752105020290695_1125899914308640.wav",
- "611752105020315328/cache/611752105020315328_8162774329368194.wav",
- "611752105020315368/cache/611752105020315368_1688849864840588.wav",
- "611752105020336950/cache/611752105020336950_3634463651.wav",
- "611752105020343687/cache/611752105020343687_8162774327817435.wav"
- ]
- s_inst = SongCoverInference()
- for vocal_file in arr:
- sstime = time.time()
- i_file = os.path.join(base_dir, vocal_file)
- cur_dir = "/".join(i_file.split("/")[:-1])
- # e_file = os.path.join(base_dir, vocal_file.replace(".wav", "_dev_441.wav"))
- # e_file = os.path.join(base_dir, vocal_file.replace(".wav", "_442_dr.wav"))
- e_file = os.path.join(base_dir, vocal_file.replace(".wav", "_442_dr_v2.wav"))
- v_file = os.path.join(cur_dir, "vocal.wav")
- a_file = os.path.join(cur_dir, "acc.wav")
- cur_id = cur_dir.split("/")[-1]
- err = s_inst.after_process(cur_id, cur_dir, i_file, e_file, v_file, a_file, True, False)
- print("err={}, sp={}".format(err, time.time() - sstime))
-
-
-def get_metop500():
- arr = [
- "611752105030249067",
- "611752105030248972",
- "611752105030249414",
- "611752105030249374",
- "611752105030249030",
- "611752105030249127",
- "611752105030249091",
- "611752105030249233",
- "611752105030249036",
- "611752105030249281",
- "611752105030249040",
- "611752105030249052",
- "611752105030249394",
- "611752105030249347",
- "611752105030249342",
- "611752105030249282",
- "611752105030249292",
- "611752105030249356",
- "611752105030249302",
- "611752105030249377",
- "611752105030248973",
- "611752105030249393",
- "611752105030249398",
- "611752105030250695",
- "611752105030249213",
- "611752105030250739",
- "611752105030249206",
- "611752105030249074",
- "611752105030249387",
- "611752105030250702",
- "611752105030249365",
- "611752105030249011",
- "611752105030249319",
- "611752105030249016",
- "611752105030249176",
- "611752105030250690",
- "611752105030250691",
- "611752105030249032",
- "611752105030249370",
- "611752105030249410",
- "611752105030249355",
- "611752105030250730",
- "611752105030249022",
- "611752105030249240",
- "611752105030249296",
- "611752105030249070",
- "611752105030249322",
- "611752105030249402",
- "611752105030249386",
- "611752105030249280",
- "611752105030249038",
- "611752105030250743",
- "611752105030249136",
- "611752105030249034",
- "611752105030249403",
- "611752105030249104",
- "611752105030249105",
- "611752105030249359",
- "611752105030250728",
- "611752105030249338",
- "611752105030249216",
- "611752105030249334",
- "611752105030249037",
- "611752105030249264",
- "611752105030249284",
- "611752105030249267",
- "611752105030249010",
- "611752105030249431",
- "611752105030249364",
- "611752105030249243",
- "611752105030249397",
- "611752105030249041",
- "611752105030249118",
- "611752105030249283",
- "611752105030249340",
- "611752105030249250",
- "611752105030249048",
- "611752105030249336",
- "611752105030249371",
- "611752105030249372",
- "611752105030249273",
- "611752105030249366",
- "611752105030249352",
- "611752105030249049",
- "611752105030249278",
- "611752105030249401",
- "611752105030249258",
- "611752105030249160",
- "611752105030249348",
- "611752105030249071",
- "611752105030249175",
- "611752105030249053",
- "611752105030249035",
- "611752105030249375",
- "611752105030249417",
- "611752105030249055",
- "611752105030249275",
- "611752105030249177",
- "611752105028480653",
- "611752105030249385",
- "611752105030249406",
- "611752105030249383",
- "611752105030249295",
- "611752105030250699",
- "611752105030249289",
- "611752105030248965",
- "611752105030249128",
- "611752105030249173",
- "611752105030249019",
- "611752105030249333",
- "611752105030249361",
- "611752105030250733",
- "611752105030249112",
- "611752105030249293",
- "611752105030249391",
- "611752105030249195",
- "611752105030249324",
- "611752105030249388",
- "611752105030249134",
- "611752105030249073",
- "611752105030249174",
- "611752105030249353",
- "611752105030249287",
- "611752105030249113",
- "611752105030249227"
- ]
- all = [
- "611752105026649069",
- "611752105027201163",
- "611752105027601574",
- "611752105027602999",
- "611752105028392007",
- "611752105028480056",
- "611752105028480075",
- "611752105028480653",
- "611752105029330944",
- "611752105029790637",
- "611752105029951597",
- "611752105029951604",
- "611752105029951624",
- "611752105029956352",
- "611752105030248965",
- "611752105030248971",
- "611752105030248972",
- "611752105030248973",
- "611752105030248974",
- "611752105030248975",
- "611752105030248976",
- "611752105030248977",
- "611752105030248978",
- "611752105030248979",
- "611752105030248980",
- "611752105030248981",
- "611752105030248982",
- "611752105030248983",
- "611752105030248985",
- "611752105030248986",
- "611752105030248987",
- "611752105030248988",
- "611752105030248989",
- "611752105030248990",
- "611752105030248991",
- "611752105030248992",
- "611752105030248993",
- "611752105030248994",
- "611752105030248995",
- "611752105030248996",
- "611752105030248997",
- "611752105030248998",
- "611752105030248999",
- "611752105030249000",
- "611752105030249001",
- "611752105030249002",
- "611752105030249003",
- "611752105030249004",
- "611752105030249005",
- "611752105030249006",
- "611752105030249007",
- "611752105030249008",
- "611752105030249009",
- "611752105030249010",
- "611752105030249011",
- "611752105030249012",
- "611752105030249013",
- "611752105030249014",
- "611752105030249015",
- "611752105030249016",
- "611752105030249017",
- "611752105030249018",
- "611752105030249019",
- "611752105030249020",
- "611752105030249021",
- "611752105030249022",
- "611752105030249023",
- "611752105030249024",
- "611752105030249025",
- "611752105030249026",
- "611752105030249027",
- "611752105030249028",
- "611752105030249029",
- "611752105030249030",
- "611752105030249031",
- "611752105030249032",
- "611752105030249033",
- "611752105030249034",
- "611752105030249035",
- "611752105030249036",
- "611752105030249037",
- "611752105030249038",
- "611752105030249039",
- "611752105030249040",
- "611752105030249041",
- "611752105030249042",
- "611752105030249043",
- "611752105030249044",
- "611752105030249045",
- "611752105030249046",
- "611752105030249047",
- "611752105030249048",
- "611752105030249049",
- "611752105030249050",
- "611752105030249051",
- "611752105030249052",
- "611752105030249053",
- "611752105030249054",
- "611752105030249055",
- "611752105030249056",
- "611752105030249057",
- "611752105030249058",
- "611752105030249059",
- "611752105030249060",
- "611752105030249062",
- "611752105030249063",
- "611752105030249064",
- "611752105030249065",
- "611752105030249067",
- "611752105030249068",
- "611752105030249070",
- "611752105030249071",
- "611752105030249072",
- "611752105030249073",
- "611752105030249074",
- "611752105030249075",
- "611752105030249076",
- "611752105030249077",
- "611752105030249078",
- "611752105030249079",
- "611752105030249080",
- "611752105030249081",
- "611752105030249082",
- "611752105030249083",
- "611752105030249084",
- "611752105030249085",
- "611752105030249086",
- "611752105030249087",
- "611752105030249088",
- "611752105030249089",
- "611752105030249090",
- "611752105030249091",
- "611752105030249092",
- "611752105030249093",
- "611752105030249094",
- "611752105030249095",
- "611752105030249096",
- "611752105030249098",
- "611752105030249099",
- "611752105030249100",
- "611752105030249101",
- "611752105030249102",
- "611752105030249103",
- "611752105030249104",
- "611752105030249105",
- "611752105030249106",
- "611752105030249107",
- "611752105030249108",
- "611752105030249109",
- "611752105030249110",
- "611752105030249111",
- "611752105030249112",
- "611752105030249113",
- "611752105030249114",
- "611752105030249115",
- "611752105030249116",
- "611752105030249117",
- "611752105030249118",
- "611752105030249119",
- "611752105030249120",
- "611752105030249121",
- "611752105030249122",
- "611752105030249123",
- "611752105030249124",
- "611752105030249125",
- "611752105030249126",
- "611752105030249127",
- "611752105030249128",
- "611752105030249129",
- "611752105030249130",
- "611752105030249131",
- "611752105030249132",
- "611752105030249133",
- "611752105030249134",
- "611752105030249135",
- "611752105030249136",
- "611752105030249137",
- "611752105030249138",
- "611752105030249139",
- "611752105030249140",
- "611752105030249141",
- "611752105030249142",
- "611752105030249143",
- "611752105030249144",
- "611752105030249145",
- "611752105030249146",
- "611752105030249147",
- "611752105030249148",
- "611752105030249150",
- "611752105030249151",
- "611752105030249152",
- "611752105030249153",
- "611752105030249154",
- "611752105030249155",
- "611752105030249157",
- "611752105030249158",
- "611752105030249159",
- "611752105030249160",
- "611752105030249161",
- "611752105030249162",
- "611752105030249163",
- "611752105030249165",
- "611752105030249166",
- "611752105030249167",
- "611752105030249168",
- "611752105030249170",
- "611752105030249171",
- "611752105030249172",
- "611752105030249173",
- "611752105030249174",
- "611752105030249175",
- "611752105030249176",
- "611752105030249177",
- "611752105030249178",
- "611752105030249179",
- "611752105030249180",
- "611752105030249181",
- "611752105030249182",
- "611752105030249183",
- "611752105030249185",
- "611752105030249186",
- "611752105030249187",
- "611752105030249188",
- "611752105030249189",
- "611752105030249190",
- "611752105030249191",
- "611752105030249192",
- "611752105030249193",
- "611752105030249194",
- "611752105030249195",
- "611752105030249196",
- "611752105030249197",
- "611752105030249198",
- "611752105030249199",
- "611752105030249200",
- "611752105030249201",
- "611752105030249202",
- "611752105030249203",
- "611752105030249204",
- "611752105030249205",
- "611752105030249206",
- "611752105030249207",
- "611752105030249208",
- "611752105030249209",
- "611752105030249210",
- "611752105030249211",
- "611752105030249212",
- "611752105030249213",
- "611752105030249214",
- "611752105030249216",
- "611752105030249217",
- "611752105030249218",
- "611752105030249219",
- "611752105030249220",
- "611752105030249221",
- "611752105030249223",
- "611752105030249224",
- "611752105030249225",
- "611752105030249226",
- "611752105030249227",
- "611752105030249228",
- "611752105030249229",
- "611752105030249230",
- "611752105030249231",
- "611752105030249232",
- "611752105030249233",
- "611752105030249234",
- "611752105030249235",
- "611752105030249236",
- "611752105030249237",
- "611752105030249238",
- "611752105030249239",
- "611752105030249240",
- "611752105030249241",
- "611752105030249242",
- "611752105030249243",
- "611752105030249244",
- "611752105030249245",
- "611752105030249247",
- "611752105030249248",
- "611752105030249249",
- "611752105030249250",
- "611752105030249251",
- "611752105030249252",
- "611752105030249253",
- "611752105030249255",
- "611752105030249256",
- "611752105030249257",
- "611752105030249258",
- "611752105030249259",
- "611752105030249260",
- "611752105030249261",
- "611752105030249262",
- "611752105030249264",
- "611752105030249265",
- "611752105030249266",
- "611752105030249267",
- "611752105030249269",
- "611752105030249270",
- "611752105030249271",
- "611752105030249273",
- "611752105030249274",
- "611752105030249275",
- "611752105030249277",
- "611752105030249278",
- "611752105030249279",
- "611752105030249280",
- "611752105030249281",
- "611752105030249282",
- "611752105030249283",
- "611752105030249284",
- "611752105030249287",
- "611752105030249288",
- "611752105030249289",
- "611752105030249290",
- "611752105030249292",
- "611752105030249293",
- "611752105030249294",
- "611752105030249295",
- "611752105030249296",
- "611752105030249297",
- "611752105030249298",
- "611752105030249299",
- "611752105030249300",
- "611752105030249301",
- "611752105030249302",
- "611752105030249303",
- "611752105030249307",
- "611752105030249308",
- "611752105030249309",
- "611752105030249310",
- "611752105030249313",
- "611752105030249314",
- "611752105030249315",
- "611752105030249316",
- "611752105030249317",
- "611752105030249318",
- "611752105030249319",
- "611752105030249320",
- "611752105030249321",
- "611752105030249322",
- "611752105030249323",
- "611752105030249324",
- "611752105030249325",
- "611752105030249327",
- "611752105030249328",
- "611752105030249329",
- "611752105030249330",
- "611752105030249331",
- "611752105030249332",
- "611752105030249333",
- "611752105030249334",
- "611752105030249336",
- "611752105030249337",
- "611752105030249338",
- "611752105030249339",
- "611752105030249340",
- "611752105030249341",
- "611752105030249342",
- "611752105030249343",
- "611752105030249344",
- "611752105030249345",
- "611752105030249346",
- "611752105030249347",
- "611752105030249348",
- "611752105030249349",
- "611752105030249350",
- "611752105030249351",
- "611752105030249352",
- "611752105030249353",
- "611752105030249354",
- "611752105030249355",
- "611752105030249356",
- "611752105030249357",
- "611752105030249358",
- "611752105030249359",
- "611752105030249360",
- "611752105030249361",
- "611752105030249362",
- "611752105030249363",
- "611752105030249364",
- "611752105030249365",
- "611752105030249366",
- "611752105030249367",
- "611752105030249368",
- "611752105030249369",
- "611752105030249370",
- "611752105030249371",
- "611752105030249372",
- "611752105030249373",
- "611752105030249374",
- "611752105030249375",
- "611752105030249376",
- "611752105030249377",
- "611752105030249378",
- "611752105030249379",
- "611752105030249380",
- "611752105030249381",
- "611752105030249383",
- "611752105030249384",
- "611752105030249385",
- "611752105030249386",
- "611752105030249387",
- "611752105030249388",
- "611752105030249389",
- "611752105030249390",
- "611752105030249391",
- "611752105030249392",
- "611752105030249393",
- "611752105030249394",
- "611752105030249395",
- "611752105030249396",
- "611752105030249397",
- "611752105030249398",
- "611752105030249399",
- "611752105030249401",
- "611752105030249402",
- "611752105030249403",
- "611752105030249404",
- "611752105030249405",
- "611752105030249406",
- "611752105030249407",
- "611752105030249408",
- "611752105030249409",
- "611752105030249410",
- "611752105030249412",
- "611752105030249413",
- "611752105030249414",
- "611752105030249415",
- "611752105030249416",
- "611752105030249417",
- "611752105030249418",
- "611752105030249419",
- "611752105030249420",
- "611752105030249421",
- "611752105030249431",
- "611752105030249624",
- "611752105030250688",
- "611752105030250689",
- "611752105030250690",
- "611752105030250691",
- "611752105030250692",
- "611752105030250693",
- "611752105030250695",
- "611752105030250697",
- "611752105030250698",
- "611752105030250699",
- "611752105030250700",
- "611752105030250701",
- "611752105030250702",
- "611752105030250704",
- "611752105030250707",
- "611752105030250711",
- "611752105030250712",
- "611752105030250713",
- "611752105030250714",
- "611752105030250715",
- "611752105030250716",
- "611752105030250717",
- "611752105030250718",
- "611752105030250719",
- "611752105030250720",
- "611752105030250721",
- "611752105030250723",
- "611752105030250725",
- "611752105030250726",
- "611752105030250728",
- "611752105030250729",
- "611752105030250730",
- "611752105030250731",
- "611752105030250732",
- "611752105030250733",
- "611752105030250735",
- "611752105030250736",
- "611752105030250738",
- "611752105030250739",
- "611752105030250740",
- "611752105030250741",
- "611752105030250742",
- "611752105030250743"
- ]
-
- new_arr = []
- for sid in all:
- if sid in arr:
- continue
- new_arr.append(sid)
- print("len={}".format(len(new_arr)))
- return new_arr
-
-
-def get_me_3_w4_zy():
- arr = [
- "611752105015523266",
- "611752105016527562",
- "611752105017233541",
- "611752105019423720",
- "611752105030113709",
- "611752105030414513",
- "611752105030414549",
- "611752105030414557",
- "611752105030414568",
- "611752105030414576",
- "611752105030414580",
- "611752105030414584",
- "611752105030414588",
- "611752105030414590",
- "611752105030414597",
- "611752105030414600",
- "611752105030414608",
- "611752105030414613",
- "611752105030414615",
- "611752105030414619",
- "611752105030414633",
- "611752105030414638",
- "611752105030414644",
- "611752105030414647",
- "611752105030414655",
- "611752105030414660",
- "611752105030414663",
- "611752105030414669",
- "611752105030414674",
- "611752105030414678",
- "611752105030414680",
- "611752105030414682",
- "611752105030414686",
- "611752105030414689",
- "611752105030414696",
- "611752105030414702",
- "611752105030414706",
- "611752105030414707",
- "611752105030414711",
- "611752105030414717",
- "611752105030414729",
- "611752105030414742",
- "611752105030414752",
- "611752105030414757",
- "611752105030414761",
- "611752105030414763",
- "611752105030414766",
- "611752105030414773",
- "611752105030414776",
- "611752105030414777",
- "611752105030414779",
- "611752105030414784",
- "611752105030414890",
- "611752105030414907",
- "611752105030414915",
- "611752105030414919",
- "611752105030414925",
- "611752105030414929",
- "611752105030414932",
- "611752105030414935",
- "611752105030414937",
- "611752105030414943",
- "611752105030414948",
- "611752105030414949",
- "611752105030414957",
- "611752105030414962",
- "611752105030414963",
- "611752105030414968",
- "611752105030414973",
- "611752105030414976",
- "611752105030414981",
- "611752105030414986",
- "611752105030414988",
- "611752105030414990",
- "611752105030414993",
- "611752105030414995",
- "611752105030415003",
- "611752105030415007",
- "611752105030415009",
- "611752105030415014",
- "611752105030415018",
- "611752105030415032",
- "611752105030415044",
- "611752105030415050",
- "611752105030415052",
- "611752105030415056",
- "611752105030415058",
- "611752105030415062",
- "611752105030415067",
- "611752105030415071",
- "611752105030415074",
- "611752105030415078",
- "611752105030415083",
- "611752105030415087",
- "611752105030415094",
- "611752105030415100",
- "611752105030415103",
- "611752105030425986",
- "611752105030426004"
- ]
- return arr
-
-
-def generate_arr():
- # arr = [
- # "611752105020256284",
- # "611752105020282612",
- # "611752105020282613",
- # "611752105020286433",
- # "611752105020286443",
- # "611752105020286446",
- # "611752105020286501",
- # "611752105020290639",
- # "611752105020290695",
- # "611752105020315328",
- # "611752105020315368",
- # "611752105020325137",
- # "611752105020336946",
- # "611752105020336950",
- # "611752105020343687",
- # "611752105020343699",
- # "611752105020350988",
- # "611752105020350990",
- # "611752105020351134",
- # "611752105020357112",
- # "611752105020376320",
- # "611752105020378620",
- # "611752105020382559",
- # "611752105020387015",
- # "611752105020390950",
- # "611752105020394121",
- # "611752105020394297",
- # "611752105020411654",
- # "611752105020417488",
- # "611752105020417688",
- # "611752105020548211",
- # "611752105020563523",
- # "611752105021273980",
- # "611752105021285282",
- # "611752105021330812",
- # "611752105021332759",
- # "611752105021375100",
- # "611752105021442406",
- # "611752105021442417",
- # "611752105021453011",
- # "611752105022345104",
- # "611752105022389596",
- # "611752105022446809",
- # "611752105022647082",
- # "611752105022667231",
- # "611752105022735101",
- # "611752105022736204",
- # "611752105022745595",
- # "611752105022770952",
- # "611752105022842004",
- # "611752105022842477",
- # "611752105023434557",
- # "611752105023532439",
- # "611752105023623965",
- # "611752105023811083",
- # "611752105024250202",
- # "611752105024429936",
- # "611752105024628047",
- # "611752105024676794",
- # "611752105024678976",
- # "611752105024679221",
- # "611752105024714646",
- # "611752105024786030",
- # "611752105024953316",
- # "611752105025104181",
- # "611752105025231610",
- # "611752105025510149",
- # "611752105026189342",
- # "611752105026523547",
- # "611752105026707760",
- # "611752105026771723",
- # "611752105026946178",
- # "611752105027047993",
- # "611752105027188746",
- # "611752105027189453",
- # "611752105027302268",
- # "611752105027557408",
- # "611752105027588072",
- # "611752105028650636",
- # "611752105028683824",
- # "611752105029689090",
- # "611752105029954089",
- # "611752105029954168",
- # "611752105029955214",
- # "611752105029990849",
- # "611752105029993297",
- # "611752105030047424",
- # "611752105030077711",
- # "611752105030104548",
- # "611752105030419624",
- # "611752105030419633",
- # "611752105030419688",
- # "611752105030433779"
- # ]
-
- # arr = get_metop500()
- arr = get_me_3_w4_zy()
- s_inst = SongCoverInference()
- for sid in arr:
- sstime = time.time()
- dir = os.path.join("/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_3_w4_zy", sid)
- # dir = os.path.join("/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_top500", sid)
- err = s_inst.process_one(sid, dir, True)
- print("sid={}, err={}, sp={}".format(sid, err, time.time() - sstime))
-
-
-def test_rate():
- arr = [
- "611752105020256284",
- "611752105020286433",
- "611752105020286443",
- "611752105020286446",
- "611752105020290639",
- "611752105020290695",
- "611752105020315328",
- "611752105020315368",
- "611752105020336950",
- "611752105020343687",
- "611752105020343699",
- "611752105020351134",
- "611752105020357112",
- "611752105020378620",
- "611752105020387015",
- "611752105020394121",
- "611752105020394297",
- "611752105020411654",
- "611752105020417688",
- "611752105020548211",
- "611752105020563523",
- "611752105021285282",
- "611752105021332759",
- "611752105022446809",
- "611752105022647082",
- "611752105022667231",
- "611752105022735101",
- "611752105022736204",
- "611752105022745595",
- "611752105022770952",
- "611752105022842004",
- "611752105022842477",
- "611752105023434557",
- "611752105023532439",
- "611752105023623965",
- "611752105024250202",
- "611752105024628047",
- "611752105024676794",
- "611752105024678976",
- "611752105024679221",
- "611752105024953316",
- "611752105025104181",
- "611752105026189342",
- "611752105026523547",
- "611752105026707760",
- "611752105026771723",
- "611752105026946178",
- "611752105027047993",
- "611752105027188746",
- "611752105027189453",
- "611752105027302268",
- "611752105027557408",
- "611752105028650636",
- "611752105028683824",
- "611752105029990849",
- "611752105029993297",
- "611752105030077711",
- "611752105030104548",
- "611752105030419624",
- "611752105030419633",
- "611752105030419688",
- "611752105030433779"
- ]
- s_inst = SongCoverInference()
- for sid in arr:
- vocal_path = "data/inf_users/me_3_w4/{}/cache/vocal.wav".format(sid)
- tm = s_inst.get_start_ms(vocal_path)
- print("res,{},{}".format(vocal_path, tm))
-
-
-def test():
- arr = [
- # "611752105020343687",
- # "611752105023532439",
- "611752105030419688",
- ]
- base_dir = "/data/rsync/jianli.yang/AutoCoverTool/data/test"
- s_inst = SongCoverInference()
- for cid in arr:
- st = time.time()
- err = s_inst.process_one(cid, os.path.join(base_dir, cid), False)
- print("cid={} RealFinish err={} sp={}".format(cid, err, time.time() - st))
-
-
-if __name__ == '__main__':
- test()
- # test_rate()
- # test_volume_dir()
- # generate_arr()
- # test_volume_dir()
- # s_inst = SongCoverInference()
- # sstime = time.time()
- # err = s_inst.process_one("611752105030249038",
- # "/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_top500/611752105030249038", False)
- # # i_file = "/data/rsync/jianli.yang/AutoCoverTool/data/out_data/me_top500/611752105030249121/611752105030249121_5629499489839033.wav"
- # # e_file = "/data/rsync/jianli.yang/AutoCoverTool/data/out_data/me_top500/611752105030249121/611752105030249121_5629499489839033.wav"
- # # v_file = "/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_top500/611752105030249121/vocal.wav"
- # # a_file = "/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_top500/611752105030249121/acc.wav"
- # # w_dir = "/data/rsync/jianli.yang/AutoCoverTool/data/inf_users/me_top500/611752105030249121"
- # #
- # # err = s_inst.after_process("611752105030248965", w_dir, i_file, e_file, v_file, a_file)
- # print("err={}, sp={}".format(err, time.time() - sstime))

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jan 12, 08:29 (1 d, 10 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1347145
Default Alt Text
(107 KB)

Event Timeline