File size: 3,051 Bytes
a2105f9
b7e87cc
 
a2105f9
9ace052
b7e87cc
704270a
 
 
 
54638f8
f2b2c12
a2105f9
 
 
b009c70
e7a429e
 
 
a7c3599
e7a429e
 
3f1a94d
 
 
0392745
 
ef5bfac
e9143ae
 
 
d7dd4e2
d518652
5588dbb
f13b775
5588dbb
 
 
e9143ae
6e4124d
5588dbb
ef5bfac
 
d518652
 
f13b775
3f1a94d
 
e7a429e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41d29b6
 
 
 
 
 
 
fe644e0
 
 
 
 
 
e7a429e
fe644e0
e7a429e
 
 
 
 
 
 
c746161
40457d3
e7a429e
 
f2b2c12
e7a429e
f2b2c12
8f78501
e7a429e
 
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os, subprocess, sys

os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1"
os.environ["HF_HUB_DISABLE_HF_TRANSFER"] = "1"
os.environ["HF_HUB_ENABLE_XET"] = "0"

os.environ["NUMBA_CACHE_DIR"] = "/tmp/numba_cache"
os.makedirs("/tmp/numba_cache", exist_ok=True)
os.environ["NUMBA_DISABLE_JIT"] = "1"

from huggingface_hub import HfApi, HfFolder, upload_folder, snapshot_download

# 🔒 Eliminar hf_transfer si está presente
subprocess.run([sys.executable, "-m", "pip", "uninstall", "-y", "hf_transfer"])

# === Configuración ===
HF_MODEL_ID = "tu_usuario/xtts-v2-finetuned"   # <--- cambia con tu repo en HF
HF_TOKEN = os.environ.get("HF_TOKEN")          # Debe estar definido en tu Space/entorno
DATASET_PATH = "/home/user/app/dataset"        # Ruta a tu dataset
OUTPUT_PATH = "/tmp/output_model"
BASE_MODEL = "coqui/XTTS-v2"

os.makedirs("/tmp/xtts_cache", exist_ok=True)
os.chmod("/tmp/xtts_cache", 0o777)

os.makedirs("/tmp/xtts_model", exist_ok=True)
os.chmod("/tmp/xtts_model", 0o777)

os.makedirs("/tmp/xtts_model/.huggingface", exist_ok=True)
os.chmod("/tmp/xtts_model/.huggingface", 0o777)

# Continúa con tu lógica, usando las nuevas rutas de manera consistent

# 🔧 Forzar descarga sin symlinks ni hf_transfer
model_dir = snapshot_download(
    repo_id="coqui/XTTS-v2",
    local_dir="/tmp/xtts_model",   # descarga directa aquí
    cache_dir="/tmp/hf_cache",     # cache seguro en /tmp
    #local_dir_use_symlinks=False,  # 🔑 evita enlaces simbólicos
    resume_download=True,
    token=HF_TOKEN
)

print(f"✅ Modelo descargado en: {model_dir}")


CONFIG_PATH = "/tmp/xtts_model/config.json"
RESTORE_PATH = "/tmp/xtts_model/model.pth"

# === 2. Editar configuración para tu dataset VoxPopuli ===
print("=== Editando configuración para fine-tuning con VoxPopuli ===")
import json
with open(CONFIG_PATH, "r") as f:
    config = json.load(f)

config["output_path"] = OUTPUT_PATH
config["datasets"] = [
    {
        "formatter": "voxpopuli",
        "path": DATASET_PATH,
        "meta_file_train": "metadata.json"
    }
]
config["run_name"] = "xtts-finetune-voxpopuli"
config["lr"] = 1e-5  # más bajo para fine-tuning

with open(CONFIG_PATH, "w") as f:
    json.dump(config, f, indent=2)

# === 3. Lanzar entrenamiento ===
print("=== Iniciando fine-tuning de XTTS-v2 ===")

import librosa
from librosa.core.spectrum import magphase

# Parchear dinámicamente
librosa.magphase = magphase

# subprocess.run([
#    "python", "/home/user/TTS/TTS/bin/train_tts.py",
#    "--config_path", CONFIG_PATH,
#    "--restore_path", RESTORE_PATH
# ], check=True)

subprocess.run([
    "python", "-m", "TTS.bin.train",
    "--config_path", CONFIG_PATH,
    "--restore_path", RESTORE_PATH
], check=True)

# === 4. Subir modelo resultante a HF ===
print("=== Subiendo modelo fine-tuneado a Hugging Face Hub ===")
api = HfApi()
HfFolder.save_token(HF_TOKEN)

upload_folder(
    repo_id=HF_MODEL_ID,
    repo_type="model",
    folder_path=OUTPUT_PATH,
    token=HF_TOKEN
)

print("✅ Fine-tuning completado y modelo subido a Hugging Face.")