Nguyen Ha Lan
add postprocess voice
d1199f2
import os
import torch
from openvoice import se_extractor
from openvoice.api import ToneColorConverter
import requests
import zipfile
import shutil
device="cuda:0" if torch.cuda.is_available() else "cpu"
output_dir = 'outputs'
# os.system("wget https://myshell-public-repo-host.s3.amazonaws.com/openvoice/checkpoints_v2_0417.zip")
# os.system("unzip checkpoints_v2_0417.zip")
ROOT = os.getcwd()
cache_dir = f"{ROOT}/.cache/torch/hub"
extract_dir = os.path.join(cache_dir, "snakers4_silero-vad_master")
url = "https://github.com/snakers4/silero-vad/zipball/master"
if not os.path.exists(extract_dir):
os.makedirs(cache_dir, exist_ok=True)
zip_path = os.path.join(cache_dir, "master.zip")
with requests.get(url, stream=True) as r:
r.raise_for_status()
with open(zip_path, 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
temp_extract_dir = os.path.join(cache_dir, "temp_extract")
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
zip_ref.extractall(temp_extract_dir)
# Find the extracted folder and rename it
extracted_folder = os.path.join(temp_extract_dir, os.listdir(temp_extract_dir)[0])
shutil.move(extracted_folder, extract_dir)
shutil.rmtree(temp_extract_dir)
class Postprocessor:
def __init__(self):
self.device = "cuda" if torch.cuda.is_available() else "cpu"
self.tone_color_converter = ToneColorConverter('checkpoints_v2/converter/config.json', device=device)
self.tone_color_converter.load_ckpt('checkpoints_v2/converter/checkpoint.pth')
os.makedirs(output_dir, exist_ok=True)
def convert_tone_color(self, reference_speaker, src_path="outputs/xtts.wav", save_path="outputs/openvoice.wav", base_speaker="outputs/xtts.wav"):
source_se, audio_name = se_extractor.get_se(base_speaker, self.tone_color_converter, vad=True)
target_se, audio_name = se_extractor.get_se(reference_speaker, self.tone_color_converter, vad=True)
encode_message = "@MyShell"
self.tone_color_converter.convert(
audio_src_path=src_path,
src_se=source_se,
tgt_se=target_se,
output_path=save_path,
message=encode_message)
if __name__ == "__main__":
postprocessor = Postprocessor()
postprocessor.convert_tone_color(reference_speaker="outputs/xtts.wav")
print("Done!")