# FikoYT ACE-Step LoRA Eğitim Servisi

ACE-Step 1.5 modeli için LoRA fine-tune eğitim API'si. Subprocess olarak ACE-Step'in `train.py` CLI'ını çağırır, ilerlemeyi gerçek zamanlı takip eder ve sonuç `.safetensors` dosyasını yönetir.

## Önkoşullar

1. **ACE-Step kurulu olmalı:**
   `D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\video-uretim\ace-step\ACE-Step-1.5\`
   - Kendi venv'i: `.venv\Scripts\python.exe` (tercih edilen)
   - `train.py` CLI mevcut (`fixed`, `vanilla`, `estimate` subcommandları)
   - `checkpoints/` klasöründe ACE-Step modeli olmalı
2. **Donanım:** 16 GB+ VRAM önerilir (full song training için 20 GB+)
3. **Python paketleri (sunucu için):**

```powershell
pip install fastapi uvicorn python-multipart pydantic
```

ACE-Step'in kendi venv'i eğitim için ayrı kalır — sunucu yalnızca subprocess fırlatır.

## Başlatma

```powershell
# video-uretim/ klasöründen
.\Ace-Lora-Baslat.bat
```

veya manuel:

```powershell
cd ace-lora-uretim
python sunucu.py --host 127.0.0.1 --port 8003 --cikti .
```

API: <http://127.0.0.1:8003/docs>

## Klasör Yapısı

```
ace-lora-uretim/
├── sunucu.py                # FastAPI servis
├── ace_lora_egit.py         # train.py subprocess wrapper
├── README.md
├── datasetler/              # sanatci_id bazlı eğitim verileri
│   └── <sanatci_id>/
│       ├── sarki1.mp3
│       ├── sarki1.lyrics.txt
│       └── sarki1.json      # opsiyonel meta
├── loralar/                 # eğitilmiş .safetensors + meta json
│   ├── <job_id>.safetensors
│   ├── <job_id>.json
│   └── _isler.json          # iş geçmişi (persist)
└── yuklemeler/              # genel upload bucket
```

## Dataset Formatı

Her şarkı için:

- `sarki.mp3` (veya `.wav`/`.flac`/`.ogg`/`.opus`)
- `sarki.lyrics.txt` (yapısal etiketler `[Verse]`, `[Chorus]` desteklenir)
- `sarki.json` — opsiyonel:

```json
{
  "caption": "Energetic synthpop with female vocals",
  "bpm": 128,
  "keyscale": "A minor",
  "timesignature": "4",
  "language": "tr"
}
```

## Endpointler

| Metod | Yol | İş |
|-------|-----|-----|
| GET | `/health` | Sağlık + CUDA durumu |
| POST | `/lora/dataset/upload` | Sanatçı klasörüne dosya yükle |
| GET | `/lora/dataset/{sanatci_id}` | Dataset dosyalarını listele |
| DELETE | `/lora/dataset/{sanatci_id}/{file_id}` | Dataset dosyası sil |
| POST | `/upload` | Genel dosya upload |
| POST | `/lora/egit` | Eğitim başlat → `job_id` döner |
| GET | `/lora/job/{job_id}` | Durum + ilerleme + son loss |
| DELETE | `/lora/job/{job_id}` | Eğitimi iptal et |
| GET | `/lora/list` | Eğitilmiş LoRA'ları listele |
| PATCH | `/lora/{lora_id}/meta` | Meta JSON güncelle (karakter ata, vb.) |
| DELETE | `/lora/{lora_id}` | LoRA + meta sil |

### Örnek Kullanım

**1. Ses dosyası yükle:**

```bash
curl -X POST http://127.0.0.1:8003/lora/dataset/upload \
  -F "sanatci_id=tarkan" \
  -F "tip=ses" \
  -F "dosya=@D:\muzik\sarki1.mp3"
```

**2. Lyrics yükle:**

```bash
curl -X POST http://127.0.0.1:8003/lora/dataset/upload \
  -F "sanatci_id=tarkan" \
  -F "tip=lyrics" \
  -F "dosya=@D:\muzik\sarki1.lyrics.txt"
```

**3. Eğitimi başlat:**

```bash
curl -X POST http://127.0.0.1:8003/lora/egit \
  -H "Content-Type: application/json" \
  -d "{\"sanatci_id\":\"tarkan\",\"lora_isim\":\"Tarkan_Pop\",\"dataset_klasoru\":\"tarkan\",\"epoch\":500,\"batch_size\":1,\"lr\":1e-4}"
```

Yanıt: `{"job_id":"abc123..."}`

**4. İlerleme:**

```bash
curl http://127.0.0.1:8003/lora/job/abc123...
```

**5. LoRA listesi:**

```bash
curl http://127.0.0.1:8003/lora/list
```

## Eğitim Parametreleri

| Parametre | Varsayılan | Açıklama |
|-----------|-----------|----------|
| `base_model_variant` | `turbo` | `turbo` \| diğer ACE-Step varyantları |
| `train_mode` | `fixed` | `fixed` (önerilen) \| `vanilla` |
| `epoch` | 500 | ~100 şarkı için 500, 10–20 şarkı için 800 önerilir |
| `batch_size` | 1 | VRAM yetiyorsa 2–4 |
| `lr` | 1e-4 | Öğrenme oranı |
| `voice_clone_etkin` | false | RVC kuruluysa karakter ses embedding'i çıkar |

## Subprocess Mantığı

`ace_lora_egit.py`:

1. `D:\...\ACE-Step-1.5\.venv\Scripts\python.exe` ile `train.py fixed ...` çağırır.
2. stdout satır satır okunur — regex ile `epoch X/Y`, `step X/Y`, `loss=...` yakalanır.
3. `iptal_kontrol` callback True dönerse `process.terminate()` çağrılır.
4. Eğitim biter bitmez `output_dir` altındaki `.safetensors` `loralar/<job_id>.safetensors` yoluna taşınır.
5. Yan dosya `<job_id>.json` meta yazılır: sanatci_id, lora_isim, epoch, son_loss, sure, tarih, karakter_id.

## Sınırlamalar / Eksikler

- **Voice clone:** RVC venv yoksa atlanır (placeholder stub).
- **Tek GPU:** `gpu_kilit` ile aynı anda tek eğitim — kuyruk eklemez, ikinci istek mevcutu bekler.
- **Preprocess yok:** Bu servis preprocessing tensor üretimini yapmaz; ACE-Step'in Gradio UI'ından preprocessed tensors üretip `dataset_klasoru` olarak verin (ya da raw audio + lyrics + json + train.py kendi preprocess'ini yapacaksa onu kullanın).
- **Restart toleransı:** Sunucu yeniden başlarsa `durum=0` (çalışıyor) işler `durum=2` (kesildi) işaretlenir; subprocess yarıda kalan eğitim resume desteklemez.

## Frontend Entegrasyon

Angular tarafında `src/app/uygulamalar/ace-lora-yonetim/` (ya da benzeri) altında bu API'yi kullanan UI eklenebilir. Görsel-uretim'in `lora-yonetim` componentleri pattern olarak referans alınabilir.
