File size: 2,407 Bytes
d1199f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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!")