Compare commits
11
Commits
6ae0852b13
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7f441defcc | ||
|
|
e9ea6b9bab | ||
|
|
c7953dc4e0 | ||
|
|
0584397884 | ||
|
|
6e3273d049 | ||
|
|
911899635a | ||
|
|
1bee4c9f5b | ||
|
|
4a24cfb662 | ||
|
|
66b690b05b | ||
|
|
bf3510b949 | ||
|
|
435e9fd667 |
@@ -200,5 +200,4 @@ ui/components_demo.py
|
||||
data_sampler_demo.py
|
||||
pipeline_ace_step_demo.py
|
||||
*.wav
|
||||
start.sh
|
||||
exps/*
|
||||
@@ -6,7 +6,12 @@
|
||||
<a href="https://modelscope.cn/models/ACE-Step/ACE-Step-v1-3.5B">ModelScope</a> |
|
||||
<a href="https://huggingface.co/spaces/ACE-Step/ACE-Step">Space Demo</a> |
|
||||
<a href="https://discord.gg/PeWDxrkdj7">Discord</a> |
|
||||
<a href="https://arxiv.org/abs/2506.00045">Technical Report</a>
|
||||
<a href="https://arxiv.org/abs/2506.00045">Technical Report</a> |
|
||||
<a href="https://ace-step.github.io/ace-step-v1.5.github.io/">ACE-Step v1.5</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>Language:</b> <b>English</b> | <a href="./README_RU.md">Русский</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
@@ -17,6 +22,7 @@
|
||||
|
||||
- [✨ Features](#-features)
|
||||
- [📦 Installation](#-installation)
|
||||
- [⚡ Quick Start](#-quick-start)
|
||||
- [🚀 Usage](#-usage)
|
||||
- [📱 User Interface Guide](#-user-interface-guide)
|
||||
- [🔨 Train](#-train)
|
||||
@@ -32,6 +38,8 @@ Rather than building yet another end-to-end text-to-music pipeline, our vision i
|
||||
|
||||
## 📢 News and Updates
|
||||
|
||||
- 🎉 **2026.01.28:** Released [ACE-Step v1.5](https://ace-step.github.io/ace-step-v1.5.github.io/) - Our latest and most advanced model is now available!
|
||||
|
||||
- 📃 2025.06.02: Released [ACE-Step Technical Report (PDF)](https://arxiv.org/abs/2506.00045).
|
||||
|
||||
- 🎮 2025.05.14: Add `Stable Audio Open Small` sampler `pingpong`. Use SDE to achieve better music consistency and quality, including lyric alignment and style alignment. Use a better method to re-implement `Audio2Audio`
|
||||
@@ -252,9 +260,56 @@ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.o
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
If you also intend to train or fine-tune, install the training extras as well (they are not needed for inference):
|
||||
```bash
|
||||
pip install -e ".[train]"
|
||||
```
|
||||
|
||||
The ACE-Step application is now installed. The GUI works on Windows, macOS, and Linux. For instructions on how to run it, please see the [Usage](#-usage) section.
|
||||
|
||||
|
||||
## ⚡ Quick Start
|
||||
|
||||
This repository ships with launcher scripts that do everything for you: check Python, create the virtual environment, install PyTorch with the right backend, install ACE-Step, and launch the web UI.
|
||||
|
||||
**Windows** — double-click [`start.bat`](./start.bat), or run it from a command prompt:
|
||||
|
||||
```bat
|
||||
start.bat
|
||||
```
|
||||
|
||||
**Linux / macOS** — run [`start.sh`](./start.sh):
|
||||
|
||||
```bash
|
||||
./start.sh
|
||||
```
|
||||
|
||||
The first run takes a few minutes (roughly 3 GB of packages are downloaded). Model weights (~8 GB) are fetched automatically on the first generation. Later runs start immediately.
|
||||
|
||||
### Script flags
|
||||
|
||||
| Flag | What it does |
|
||||
| --- | --- |
|
||||
| `--lowvram` | Low-VRAM mode (~8 GB): enables `--cpu_offload`, `--overlapped_decode` and `--torch_compile`, and installs `triton-windows` |
|
||||
| `--cpu` | Run on CPU without CUDA (very slow, but works without an NVIDIA GPU) |
|
||||
| `--share` | Create a public Gradio link |
|
||||
| `--port <N>` | Web UI port (default 7865) |
|
||||
| `--device <N>` | GPU index (default 0) |
|
||||
| `--listen` | Bind to `0.0.0.0` so other devices on the LAN can connect |
|
||||
| `--reinstall` | Recreate the virtual environment from scratch |
|
||||
| `--update` | Update dependencies in the existing environment |
|
||||
| `--setup` | Install only, do not launch |
|
||||
| `--help` | Show usage |
|
||||
|
||||
Flags can be combined, for example:
|
||||
|
||||
```bat
|
||||
start.bat --lowvram --listen --port 7870
|
||||
```
|
||||
|
||||
Defaults (port, GPU index, checkpoint path) live in the settings block at the top of each script. In `start.sh` they can also be overridden with environment variables (`PORT=7870 ./start.sh`). On macOS the scripts install the MPS build of PyTorch and pass `--bf16 false` automatically.
|
||||
|
||||
|
||||
## 🚀 Usage
|
||||
|
||||

|
||||
@@ -277,6 +332,22 @@ acestep --checkpoint_path /path/to/checkpoint --port 7865 --device_id 0 --share
|
||||
|
||||
If you are using macOS, please use `--bf16 false` to avoid errors.
|
||||
|
||||
#### 🖥️ Command Line Generation
|
||||
|
||||
To generate without the web UI, use `infer.py`:
|
||||
|
||||
```bash
|
||||
python infer.py \
|
||||
--prompt "synth-pop, female vocal, warm analog synths, 110 bpm" \
|
||||
--lyrics_file my_song.txt \
|
||||
--duration 120 --steps 60 --seed 7 \
|
||||
--format mp3 --output_path outputs/my_song.mp3
|
||||
```
|
||||
|
||||
Run `python infer.py --help` for the full list. The main options are `--prompt`, `--lyrics` / `--lyrics_file`, `--duration`, `--steps`, `--guidance_scale`, `--scheduler`, `--cfg_type`, `--omega_scale`, `--seed`, `--format` and `--output_path`; the runtime flags (`--bf16`, `--cpu_offload`, `--overlapped_decode`, `--torch_compile`, `--device_id`) match the ones the GUI takes.
|
||||
|
||||
With no `--prompt`, the script keeps its original behaviour and generates from a random example in `examples/input_params`.
|
||||
|
||||
#### 🔍 API Usage
|
||||
If you intend to integrate ACE-Step as a library into your own Python projects, you can install the latest version directly from GitHub using the following pip command.
|
||||
|
||||
|
||||
+463
@@ -0,0 +1,463 @@
|
||||
<h1 align="center">ACE-Step</h1>
|
||||
<h1 align="center">Шаг к фундаментальной модели генерации музыки</h1>
|
||||
<p align="center">
|
||||
<a href="https://ace-step.github.io/">Проект</a> |
|
||||
<a href="https://huggingface.co/ACE-Step/ACE-Step-v1-3.5B">Hugging Face</a> |
|
||||
<a href="https://modelscope.cn/models/ACE-Step/ACE-Step-v1-3.5B">ModelScope</a> |
|
||||
<a href="https://huggingface.co/spaces/ACE-Step/ACE-Step">Демо (Space)</a> |
|
||||
<a href="https://discord.gg/PeWDxrkdj7">Discord</a> |
|
||||
<a href="https://arxiv.org/abs/2506.00045">Технический отчёт</a> |
|
||||
<a href="https://ace-step.github.io/ace-step-v1.5.github.io/">ACE-Step v1.5</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<b>Язык:</b> <a href="./README.md">English</a> | <b>Русский</b>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<img src="./assets/orgnization_logos.png" width="100%" alt="StepFun Logo">
|
||||
</p>
|
||||
|
||||
## Содержание
|
||||
|
||||
- [✨ Возможности](#-возможности)
|
||||
- [📦 Установка](#-установка)
|
||||
- [⚡ Быстрый старт](#-быстрый-старт)
|
||||
- [🚀 Использование](#-использование)
|
||||
- [📱 Описание интерфейса](#-описание-интерфейса)
|
||||
- [🔨 Обучение](#-обучение)
|
||||
|
||||
## 📝 Аннотация
|
||||
|
||||
Мы представляем ACE-Step — новую открытую фундаментальную модель для генерации музыки, которая преодолевает ключевые ограничения существующих подходов и достигает state-of-the-art качества за счёт целостной архитектуры. Нынешние методы вынуждены искать компромисс между скоростью генерации, музыкальной связностью и управляемостью. Например, модели на базе LLM (Yue, SongGen) хорошо попадают в текст песни, но страдают от медленного инференса и структурных артефактов. Диффузионные модели (например, DiffRhythm), напротив, синтезируют быстрее, но часто теряют структурную связность на длинных отрезках.
|
||||
|
||||
ACE-Step закрывает этот разрыв, объединяя диффузионную генерацию с Deep Compression AutoEncoder (DCAE) из Sana и лёгким линейным трансформером. Дополнительно модель использует MERT и m-hubert для выравнивания семантических представлений (REPA) во время обучения, что обеспечивает быструю сходимость. В результате модель синтезирует до 4 минут музыки за 20 секунд на GPU A100 — в 15 раз быстрее решений на базе LLM — при этом превосходя их по музыкальной связности и попаданию в текст по метрикам мелодии, гармонии и ритма. Кроме того, ACE-Step сохраняет тонкие акустические детали, что позволяет реализовать продвинутые механизмы управления: клонирование голоса, редактирование текста, ремиксы и генерацию отдельных дорожек (например, lyric2vocal, singing2accompaniment).
|
||||
|
||||
Вместо очередного end-to-end пайплайна text-to-music наша цель — создать фундаментальную модель для музыкального ИИ: быструю, универсальную, эффективную и при этом гибкую архитектуру, поверх которой легко обучать подзадачи. Это открывает путь к мощным инструментам, органично встраивающимся в творческий процесс музыкантов, продюсеров и авторов контента. Коротко говоря, мы хотим повторить для музыки то, чем стал Stable Diffusion для изображений.
|
||||
|
||||
|
||||
## 📢 Новости и обновления
|
||||
|
||||
- 🎉 **28.01.2026:** Вышла [ACE-Step v1.5](https://ace-step.github.io/ace-step-v1.5.github.io/) — наша самая свежая и продвинутая модель!
|
||||
|
||||
- 📃 02.06.2025: Опубликован [технический отчёт ACE-Step (PDF)](https://arxiv.org/abs/2506.00045).
|
||||
|
||||
- 🎮 14.05.2025: Добавлен сэмплер `pingpong` из `Stable Audio Open Small`. Использование SDE даёт лучшую консистентность и качество музыки, включая попадание в текст и в стиль. Также заново реализован `Audio2Audio` более удачным способом.
|
||||
|
||||
- 🎤 12.05.2025: Выпущен [RapMachine](https://huggingface.co/ACE-Step/ACE-Step-v1-chinese-rap-LoRA), исправлены проблемы обучения LoRA
|
||||
- Подробности в [ZH_RAP_LORA.md](./ZH_RAP_LORA.md). Примеры аудио: https://ace-step.github.io/#RapMachine
|
||||
- Подробная инструкция по обучению — в [TRAIN_INSTRUCTION.md](./TRAIN_INSTRUCTION.md).
|
||||
|
||||
<p align="center">
|
||||
<img src="assets/rap_machine_demo.gif" alt="RapMachine Demo" width="45%">
|
||||
<img src="assets/train_demo.gif" alt="Train Demo" width="50%">
|
||||
</p>
|
||||
|
||||
|
||||
- 🔥 **10.05.2025:** Оптимизация потребления памяти
|
||||
- Максимальный расход VRAM снижен до 8 ГБ — модель стала доступнее для домашних видеокарт
|
||||
- Рекомендуемые параметры запуска:
|
||||
```bash
|
||||
acestep --torch_compile true --cpu_offload true --overlapped_decode true
|
||||
```
|
||||
На Windows нужно установить triton:
|
||||
```
|
||||
pip install triton-windows
|
||||
```
|
||||
|
||||

|
||||
|
||||
- 📢 **09.05.2025:** Демо на Gradio поддерживает Audio2Audio. ComfyUI: [Ace_Step_4x_a2a.json](./assets/Ace_Step_4x_a2a.json)
|
||||
<p align="center">
|
||||
<img src="assets/audio2audio_demo.gif" alt="Audio2Audio Demo" width="50%">
|
||||
<img src="assets/audio2audio_ComfyUI.png" alt="Audio2Audio ComfyUI" width="40%">
|
||||
</p>
|
||||
|
||||
- 🚀 **08.05.2025:** Доступен узел [ComfyUI_ACE-Step](https://t.co/GeRSTrIvn0)! Используйте возможности ACE-Step прямо в ComfyUI. 🎉
|
||||

|
||||
|
||||
|
||||
- 🚀 06.05.2025: Открыты исходный код демо и модель
|
||||
|
||||
|
||||
## ✨ Возможности
|
||||
|
||||
<p align="center">
|
||||
<img src="./assets/application_map.png" width="100%" alt="ACE-Step Framework">
|
||||
</p>
|
||||
|
||||
### 🎯 Базовое качество
|
||||
|
||||
#### 🌈 Разнообразие стилей и жанров
|
||||
|
||||
- 🎸 Поддерживаются все основные музыкальные стили, описание задаётся короткими тегами, развёрнутым текстом или описанием сценария использования
|
||||
- 🎷 Генерация музыки в разных жанрах с подходящим инструментарием и стилистикой
|
||||
|
||||
#### 🌍 Многоязычность
|
||||
|
||||
- 🗣️ Поддерживается 19 языков, из них 10 с наилучшим качеством:
|
||||
- 🇺🇸 английский, 🇨🇳 китайский, 🇷🇺 русский, 🇪🇸 испанский, 🇯🇵 японский, 🇩🇪 немецкий, 🇫🇷 французский, 🇵🇹 португальский, 🇮🇹 итальянский, 🇰🇷 корейский
|
||||
- ⚠️ Из-за дисбаланса обучающих данных менее распространённые языки могут работать хуже
|
||||
|
||||
#### 🎻 Инструментальные стили
|
||||
|
||||
- 🎹 Поддерживается генерация инструментальной музыки в разных жанрах и стилях
|
||||
- 🎺 Реалистичные инструментальные дорожки с корректным тембром и выразительностью каждого инструмента
|
||||
- 🎼 Возможны сложные аранжировки с несколькими инструментами при сохранении музыкальной связности
|
||||
|
||||
#### 🎤 Вокальные техники
|
||||
|
||||
- 🎙️ Качественная передача различных вокальных стилей и техник
|
||||
- 🗣️ Поддержка разной вокальной подачи, включая разные приёмы и манеры пения
|
||||
|
||||
### 🎛️ Управляемость
|
||||
|
||||
#### 🔄 Генерация вариаций
|
||||
|
||||
- ⚙️ Реализовано через оптимизацию на этапе инференса, без дообучения
|
||||
- 🌊 Flow-matching модель генерирует начальный шум, затем по формуле шума из trigFlow добавляется дополнительный гауссов шум
|
||||
- 🎚️ Соотношение исходного и нового шума регулируется — так задаётся степень отличия вариации
|
||||
|
||||
#### 🎨 Перерисовка (Repainting)
|
||||
|
||||
- 🖌️ Реализовано добавлением шума к целевому аудио и наложением масочных ограничений в процессе ODE
|
||||
- 🔍 Если условия генерации меняются относительно исходных, можно изменить только отдельные аспекты, сохранив остальное
|
||||
- 🔀 Комбинируется с генерацией вариаций — можно делать локальные вариации стиля, текста или вокала
|
||||
|
||||
#### ✏️ Редактирование текста песни
|
||||
|
||||
- 💡 Технология flow-edit применена для локального изменения текста с сохранением мелодии, вокала и аккомпанемента
|
||||
- 🔄 Работает и со сгенерированным, и с загруженным аудио, что заметно расширяет творческие возможности
|
||||
- ℹ️ Текущее ограничение: за раз можно менять только небольшие фрагменты текста, иначе появляются искажения; но правки можно применять последовательно
|
||||
|
||||
### 🚀 Применения
|
||||
|
||||
#### 🎤 Lyric2Vocal (LoRA)
|
||||
|
||||
- 🔊 LoRA, дообученная на чистом вокале, позволяет генерировать вокальные сэмплы прямо из текста
|
||||
- 🛠️ Практическое применение: вокальные демо, гайд-треки, помощь в написании песен, эксперименты с вокальной аранжировкой
|
||||
- ⏱️ Быстрый способ проверить, как текст зазвучит в исполнении, — ускоряет итерации автора
|
||||
|
||||
#### 📝 Text2Samples (LoRA)
|
||||
|
||||
- 🎛️ Аналог Lyric2Vocal, но дообучен на чисто инструментальных данных и сэмплах
|
||||
- 🎵 Генерация концептуальных сэмплов для музыкального продакшена по текстовому описанию
|
||||
- 🧰 Удобно для быстрого создания инструментальных лупов, звуковых эффектов и музыкальных элементов
|
||||
|
||||
### 🔮 Скоро
|
||||
|
||||
#### 🎤 RapMachine
|
||||
|
||||
- 🔥 Дообучение на чистых рэп-данных для создания ИИ, специализирующегося на рэпе
|
||||
- 🏆 Ожидаемые возможности: ИИ-баттлы и повествование через рэп
|
||||
- 📚 Рэп обладает исключительными нарративными и выразительными возможностями — потенциал применения огромен
|
||||
|
||||
#### 🎛️ StemGen
|
||||
|
||||
- 🎚️ ControlNet-LoRA, обученная на многодорожечных данных для генерации отдельных инструментальных стемов
|
||||
- 🎯 На вход подаётся референсный трек и нужный инструмент (или референсное аудио инструмента)
|
||||
- 🎹 На выходе — стем инструмента, дополняющий референс: например, фортепианный аккомпанемент к мелодии флейты или джазовые барабаны к соло-гитаре
|
||||
|
||||
#### 🎤 Singing2Accompaniment
|
||||
|
||||
- 🔄 Обратный процесс к StemGen: из одной вокальной дорожки собирается сведённый мастер-трек
|
||||
- 🎵 На вход подаётся вокал и нужный стиль, на выходе — полноценный аккомпанемент к вокалу
|
||||
- 🎸 Создаётся полное инструментальное сопровождение — легко добавить профессиональное звучание к любой вокальной записи
|
||||
|
||||
|
||||
## 📋 Дорожная карта
|
||||
|
||||
- [x] Публикация кода обучения 🔥
|
||||
- [x] Публикация кода обучения LoRA 🔥
|
||||
- [x] Публикация RapMachine LoRA 🎤
|
||||
- [x] Публикация результатов оценки и технического отчёта 📄
|
||||
- [ ] Обучение и публикация ACE-Step V1.5
|
||||
- [ ] Публикация кода обучения ControlNet 🔥
|
||||
- [ ] Публикация Singing2Accompaniment ControlNet 🎮
|
||||
|
||||
|
||||
## 🖥️ Производительность на разном железе
|
||||
|
||||
Мы измерили производительность ACE-Step на разных конфигурациях:
|
||||
|
||||
| Устройство | RTF (27 шагов) | Время на 1 мин аудио (27 шагов) | RTF (60 шагов) | Время на 1 мин аудио (60 шагов) |
|
||||
| --------------- | -------------- | ------------------------------- | -------------- | ------------------------------- |
|
||||
| NVIDIA RTX 4090 | 34.48 × | 1.74 с | 15.63 × | 3.84 с |
|
||||
| NVIDIA A100 | 27.27 × | 2.20 с | 12.27 × | 4.89 с |
|
||||
| NVIDIA RTX 3090 | 12.76 × | 4.70 с | 6.48 × | 9.26 с |
|
||||
| MacBook M2 Max | 2.27 × | 26.43 с | 1.03 × | 58.25 с |
|
||||
|
||||
|
||||
Производительность измеряется в RTF (Real-Time Factor, коэффициент реального времени). Чем больше значение, тем быстрее генерация. 27.27× означает, что на 1 минуту музыки уходит 2.2 секунды (60/27.27). Измерения проводились на одном GPU с batch size 1 и 27 шагами.
|
||||
|
||||
|
||||
## 📦 Установка
|
||||
|
||||
### 1. Клонирование репозитория
|
||||
Сначала склонируйте репозиторий ACE-Step и перейдите в каталог проекта:
|
||||
```bash
|
||||
git clone https://github.com/ace-step/ACE-Step.git
|
||||
cd ACE-Step
|
||||
```
|
||||
|
||||
### 2. Требования
|
||||
Убедитесь, что у вас установлено:
|
||||
|
||||
* `Python`: рекомендуется версия 3.10 или новее. Скачать можно на [python.org](https://www.python.org/).
|
||||
* `Conda` или `venv`: для создания виртуального окружения (Conda предпочтительнее).
|
||||
|
||||
### 3. Создание виртуального окружения
|
||||
|
||||
Настоятельно рекомендуем использовать виртуальное окружение, чтобы не конфликтовать с другими пакетами. Выберите один из вариантов:
|
||||
|
||||
#### Вариант A: Conda
|
||||
|
||||
1. **Создайте окружение** с именем `ace_step` и Python 3.10:
|
||||
```bash
|
||||
conda create -n ace_step python=3.10 -y
|
||||
```
|
||||
|
||||
2. **Активируйте окружение:**
|
||||
```bash
|
||||
conda activate ace_step
|
||||
```
|
||||
|
||||
#### Вариант B: venv
|
||||
|
||||
1. **Перейдите в каталог склонированного репозитория ACE-Step.**
|
||||
|
||||
2. **Создайте виртуальное окружение** (обычно его называют `venv`):
|
||||
```bash
|
||||
python -m venv venv
|
||||
```
|
||||
|
||||
3. **Активируйте окружение:**
|
||||
* **Windows (cmd.exe):**
|
||||
```bash
|
||||
venv\Scripts\activate.bat
|
||||
```
|
||||
* **Windows (PowerShell):**
|
||||
```powershell
|
||||
.\venv\Scripts\Activate.ps1
|
||||
```
|
||||
*(Если возникает ошибка политики выполнения, сначала выполните `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process`)*
|
||||
* **Linux / macOS (bash/zsh):**
|
||||
```bash
|
||||
source venv/bin/activate
|
||||
```
|
||||
|
||||
### 4. Установка зависимостей
|
||||
После активации виртуального окружения:
|
||||
|
||||
**a.** (Только Windows) Если вы на Windows и планируете использовать NVIDIA GPU, сначала поставьте PyTorch со сборкой под CUDA:
|
||||
|
||||
```bash
|
||||
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
|
||||
```
|
||||
(Замените `cu126`, если у вас другая версия CUDA. Другие варианты установки — на [официальном сайте PyTorch](https://pytorch.org/get-started/locally/)).
|
||||
|
||||
**b.** Установите ACE-Step и основные зависимости:
|
||||
```bash
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
Если планируете обучать или дообучать модель, поставьте дополнительно зависимости для обучения — для инференса они не нужны:
|
||||
```bash
|
||||
pip install -e ".[train]"
|
||||
```
|
||||
|
||||
На этом установка завершена. Графический интерфейс работает на Windows, macOS и Linux. Как запускать — см. раздел [Использование](#-использование).
|
||||
|
||||
|
||||
## ⚡ Быстрый старт
|
||||
|
||||
В репозитории есть скрипты запуска, которые делают всё сами: проверяют Python, создают виртуальное окружение, ставят PyTorch с нужным бэкендом, устанавливают ACE-Step и запускают веб-интерфейс.
|
||||
|
||||
**Windows** — достаточно дважды кликнуть по [`start.bat`](./start.bat) или запустить из командной строки:
|
||||
|
||||
```bat
|
||||
start.bat
|
||||
```
|
||||
|
||||
**Linux / macOS** — запустите [`start.sh`](./start.sh):
|
||||
|
||||
```bash
|
||||
./start.sh
|
||||
```
|
||||
|
||||
При первом запуске установка займёт несколько минут (скачивается около 3 ГБ пакетов). Веса модели (~8 ГБ) докачаются автоматически при первой генерации. Последующие запуски стартуют сразу.
|
||||
|
||||
### Флаги скрипта
|
||||
|
||||
| Флаг | Что делает |
|
||||
| --- | --- |
|
||||
| `--lowvram` | Режим экономии видеопамяти (до ~8 ГБ VRAM): включает `--cpu_offload`, `--overlapped_decode` и `--torch_compile`, доустанавливает `triton-windows` |
|
||||
| `--cpu` | Запуск на процессоре, без CUDA (очень медленно, но работает без видеокарты NVIDIA) |
|
||||
| `--share` | Публичная ссылка Gradio для доступа снаружи |
|
||||
| `--port <N>` | Порт веб-интерфейса (по умолчанию 7865) |
|
||||
| `--device <N>` | Номер видеокарты (по умолчанию 0) |
|
||||
| `--listen` | Слушать `0.0.0.0`, чтобы зайти с других устройств в локальной сети |
|
||||
| `--reinstall` | Полностью пересоздать виртуальное окружение с нуля |
|
||||
| `--update` | Обновить зависимости в существующем окружении |
|
||||
| `--setup` | Только установка, без запуска |
|
||||
| `--help` | Показать справку |
|
||||
|
||||
Флаги можно комбинировать, например:
|
||||
|
||||
```bat
|
||||
start.bat --lowvram --listen --port 7870
|
||||
```
|
||||
|
||||
Настройки по умолчанию (порт, номер GPU, путь к весам модели) задаются в блоке `==== НАСТРОЙКИ ====` в начале каждого скрипта. В `start.sh` их можно переопределить переменными окружения (`PORT=7870 ./start.sh`). На macOS скрипт сам ставит сборку PyTorch с MPS и передаёт `--bf16 false`.
|
||||
|
||||
|
||||
## 🚀 Использование
|
||||
|
||||

|
||||
|
||||
### 🔍 Базовый запуск
|
||||
|
||||
```bash
|
||||
acestep --port 7865
|
||||
```
|
||||
|
||||
### ⚙️ Расширенный запуск
|
||||
|
||||
```bash
|
||||
acestep --checkpoint_path /path/to/checkpoint --port 7865 --device_id 0 --share true --bf16 true
|
||||
```
|
||||
|
||||
* Если `--checkpoint_path` задан и модели по этому пути есть, они загружаются оттуда.
|
||||
* Если `--checkpoint_path` задан, но моделей там нет, они автоматически скачаются в этот каталог.
|
||||
* Если `--checkpoint_path` не задан, модели скачаются в путь по умолчанию `~/.cache/ace-step/checkpoints`.
|
||||
|
||||
На macOS используйте `--bf16 false`, чтобы избежать ошибок.
|
||||
|
||||
#### 🖥️ Генерация из командной строки
|
||||
|
||||
Чтобы генерировать без веб-интерфейса, используйте `infer.py`:
|
||||
|
||||
```bash
|
||||
python infer.py \
|
||||
--prompt "synth-pop, female vocal, warm analog synths, 110 bpm" \
|
||||
--lyrics_file my_song.txt \
|
||||
--duration 120 --steps 60 --seed 7 \
|
||||
--format mp3 --output_path outputs/my_song.mp3
|
||||
```
|
||||
|
||||
Полный список — `python infer.py --help`. Основные опции: `--prompt`, `--lyrics` / `--lyrics_file`, `--duration`, `--steps`, `--guidance_scale`, `--scheduler`, `--cfg_type`, `--omega_scale`, `--seed`, `--format`, `--output_path`. Флаги режима работы (`--bf16`, `--cpu_offload`, `--overlapped_decode`, `--torch_compile`, `--device_id`) те же, что у графического интерфейса.
|
||||
|
||||
Без `--prompt` скрипт ведёт себя как раньше и генерирует по случайному примеру из `examples/input_params`.
|
||||
|
||||
#### 🔍 Использование как библиотеки
|
||||
Если вы хотите встроить ACE-Step как библиотеку в собственный Python-проект, можно поставить последнюю версию прямо из GitHub.
|
||||
|
||||
**Установка через pip:**
|
||||
|
||||
1. **Убедитесь, что установлен Git:** этот способ требует наличия Git в системе и в переменной PATH.
|
||||
2. **Выполните команду установки:**
|
||||
```bash
|
||||
pip install git+https://github.com/ace-step/ACE-Step.git
|
||||
```
|
||||
Рекомендуется выполнять её внутри виртуального окружения, чтобы не ломать другие пакеты.
|
||||
|
||||
#### 🛠️ Аргументы командной строки
|
||||
|
||||
- `--checkpoint_path`: путь к весам модели (по умолчанию скачиваются автоматически)
|
||||
- `--server_name`: IP-адрес или имя хоста, на котором слушает сервер Gradio (по умолчанию `127.0.0.1`). Укажите `0.0.0.0`, чтобы открыть доступ с других устройств в сети.
|
||||
- `--port`: порт сервера Gradio (по умолчанию 7865)
|
||||
- `--device_id`: номер GPU (по умолчанию 0)
|
||||
- `--share`: включить публичную ссылку Gradio (по умолчанию False)
|
||||
- `--bf16`: использовать точность bfloat16 для ускорения инференса (по умолчанию True)
|
||||
- `--torch_compile`: использовать `torch.compile()` для оптимизации модели и ускорения инференса (по умолчанию False).
|
||||
- **На Windows нужен triton**:
|
||||
```
|
||||
pip install triton-windows
|
||||
```
|
||||
- `--cpu_offload`: выгружать веса модели в оперативную память для экономии видеопамяти (по умолчанию False)
|
||||
- `--overlapped_decode`: перекрывающееся декодирование для ускорения инференса (по умолчанию False)
|
||||
|
||||
## 📱 Описание интерфейса
|
||||
|
||||
Интерфейс ACE-Step разделён на вкладки под разные задачи генерации и редактирования:
|
||||
|
||||
### 📝 Вкладка Text2Music
|
||||
|
||||
1. **📋 Поля ввода**:
|
||||
- **🏷️ Tags**: описательные теги, жанры или описание сцены через запятую
|
||||
- **📜 Lyrics**: текст песни со структурными тегами вроде [verse], [chorus], [bridge]
|
||||
- **⏱️ Audio Duration**: желаемая длительность аудио (-1 — случайная)
|
||||
|
||||
2. **⚙️ Настройки**:
|
||||
- **🔧 Basic Settings**: количество шагов инференса, guidance scale, сиды
|
||||
- **🔬 Advanced Settings**: тонкая настройка типа планировщика, типа CFG, параметров ERG и прочего
|
||||
|
||||
3. **🚀 Генерация**: нажмите «Generate», чтобы создать музыку по введённым данным
|
||||
|
||||
### 🔄 Вкладка Retake
|
||||
|
||||
- 🎲 Повторная генерация с небольшими отличиями за счёт других сидов
|
||||
- 🎚️ Параметр variance задаёт, насколько результат будет отличаться от оригинала
|
||||
|
||||
### 🎨 Вкладка Repainting
|
||||
|
||||
- 🖌️ Выборочная перегенерация отдельных фрагментов трека
|
||||
- ⏱️ Задаются время начала и конца перерисовываемого участка
|
||||
- 🔍 Источник аудио выбирается: результат text2music, последняя перерисовка или загруженный файл
|
||||
|
||||
### ✏️ Вкладка Edit
|
||||
|
||||
- 🔄 Изменение готовой музыки через правку тегов или текста
|
||||
- 🎛️ Режим «only_lyrics» сохраняет мелодию, режим «remix» её меняет
|
||||
- 🎚️ Параметры редактирования задают, насколько сохраняется оригинал
|
||||
|
||||
### 📏 Вкладка Extend
|
||||
|
||||
- ➕ Добавление музыки в начало или в конец существующего трека
|
||||
- 📐 Задаются длины расширения слева и справа
|
||||
- 🔍 Выбирается источник аудио для расширения
|
||||
|
||||
## 📂 Примеры
|
||||
|
||||
В каталоге `examples/input_params` лежат примеры входных параметров — их можно использовать как образец для генерации.
|
||||
|
||||
## 🏗️ Архитектура
|
||||
|
||||
<p align="center">
|
||||
<img src="./assets/ACE-Step_framework.png" width="100%" alt="ACE-Step Framework">
|
||||
</p>
|
||||
|
||||
## 🔨 Обучение
|
||||
Подробная инструкция — в [TRAIN_INSTRUCTION.md](./TRAIN_INSTRUCTION.md).
|
||||
|
||||
## 📜 Лицензия и отказ от ответственности
|
||||
|
||||
Проект распространяется по лицензии [Apache License 2.0](./LICENSE)
|
||||
|
||||
ACE-Step позволяет создавать оригинальную музыку в самых разных жанрах и применим в творческом продакшене, образовании и развлечениях. Модель создавалась для позитивных и художественных сценариев использования, но мы осознаём и риски: непреднамеренное нарушение авторских прав из-за стилистического сходства, некорректное смешение культурных элементов, а также использование для генерации вредоносного контента. Для ответственного использования мы призываем проверять оригинальность полученных работ, явно указывать участие ИИ и получать необходимые разрешения при адаптации защищённых стилей или материалов. Используя ACE-Step, вы соглашаетесь придерживаться этих принципов и уважать художественную целостность, культурное разнообразие и требования законодательства. Авторы не несут ответственности за неправомерное использование модели, включая, помимо прочего, нарушение авторских прав, культурную бестактность или создание вредоносного контента.
|
||||
|
||||
🔔 Важное замечание
|
||||
Единственный официальный сайт проекта ACE-Step — наша страница на GitHub Pages.
|
||||
Никаких других сайтов мы не ведём.
|
||||
🚫 Поддельные домены включают (но не ограничиваются ими):
|
||||
ac\*\*p.com, a\*\*p.org, a\*\*\*c.org
|
||||
⚠️ Будьте осторожны. Не заходите на эти сайты, не доверяйте им и не совершайте на них платежей.
|
||||
|
||||
## 🙏 Благодарности
|
||||
|
||||
Проект развивается совместно ACE Studio и StepFun.
|
||||
|
||||
|
||||
## 📖 Цитирование
|
||||
|
||||
Если проект оказался полезен для вашего исследования, пожалуйста, сошлитесь на него:
|
||||
|
||||
```BibTeX
|
||||
@misc{gong2025acestep,
|
||||
title={ACE-Step: A Step Towards Music Generation Foundation Model},
|
||||
author={Junmin Gong, Wenxiao Zhao, Sen Wang, Shengyuan Xu, Jing Guo},
|
||||
howpublished={\url{https://github.com/ace-step/ACE-Step}},
|
||||
year={2025},
|
||||
note={GitHub repository}
|
||||
}
|
||||
```
|
||||
@@ -1,5 +1,15 @@
|
||||
# Training Instruction
|
||||
|
||||
## 0. Install the Training Dependencies
|
||||
|
||||
Training needs a few packages that a plain inference install does not pull in
|
||||
(`datasets`, `pytorch_lightning`, `matplotlib`, `tensorboard`, `tensorboardX`).
|
||||
Install them with the `train` extra:
|
||||
|
||||
```bash
|
||||
pip install -e ".[train]"
|
||||
```
|
||||
|
||||
## 1. Data Preparation
|
||||
|
||||
### Required File Format
|
||||
|
||||
@@ -10,6 +10,7 @@ import os
|
||||
import torch
|
||||
from diffusers import AutoencoderDC
|
||||
import torchaudio
|
||||
import soundfile as sf
|
||||
import torchvision.transforms as transforms
|
||||
from diffusers.models.modeling_utils import ModelMixin
|
||||
from diffusers.loaders import FromOriginalModelMixin
|
||||
@@ -60,7 +61,11 @@ class MusicDCAE(ModelMixin, ConfigMixin, FromOriginalModelMixin):
|
||||
self.shift_factor = -1.9091
|
||||
|
||||
def load_audio(self, audio_path):
|
||||
audio, sr = torchaudio.load(audio_path)
|
||||
# Read with soundfile rather than torchaudio.load(): since torchaudio
|
||||
# 2.11 the latter routes I/O through TorchCodec, an extra native
|
||||
# dependency we do not require.
|
||||
data, sr = sf.read(audio_path, dtype="float32", always_2d=True)
|
||||
audio = torch.from_numpy(data.T)
|
||||
if audio.shape[0] == 1:
|
||||
audio = audio.repeat(2, 1)
|
||||
return audio, sr
|
||||
@@ -362,7 +367,8 @@ class MusicDCAE(ModelMixin, ConfigMixin, FromOriginalModelMixin):
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
audio, sr = torchaudio.load("test.wav")
|
||||
_data, sr = sf.read("test.wav", dtype="float32", always_2d=True)
|
||||
audio = torch.from_numpy(_data.T)
|
||||
audio_lengths = torch.tensor([audio.shape[1]])
|
||||
audios = audio.unsqueeze(0)
|
||||
|
||||
@@ -378,5 +384,5 @@ if __name__ == "__main__":
|
||||
print("latents shape: ", latents.shape)
|
||||
print("latent_lengths: ", latent_lengths)
|
||||
print("sr: ", sr)
|
||||
torchaudio.save("test_reconstructed.wav", pred_wavs[0], sr)
|
||||
sf.write("test_reconstructed.wav", pred_wavs[0].float().cpu().transpose(0, 1).numpy(), sr)
|
||||
print("test_reconstructed.wav")
|
||||
|
||||
@@ -12,6 +12,7 @@ import os
|
||||
import re
|
||||
|
||||
import torch
|
||||
import soundfile as sf
|
||||
from loguru import logger
|
||||
from tqdm import tqdm
|
||||
import json
|
||||
@@ -46,7 +47,6 @@ from acestep.apg_guidance import (
|
||||
cfg_zero_star,
|
||||
cfg_double_condition_forward,
|
||||
)
|
||||
import torchaudio
|
||||
from .cpu_offload import cpu_offload
|
||||
|
||||
|
||||
@@ -1046,6 +1046,19 @@ class ACEStepPipeline:
|
||||
if right_pad_frame_length > 0:
|
||||
padd_list.append(retake_latents[:, :, :, -right_pad_frame_length:])
|
||||
target_latents = torch.cat(padd_list, dim=-1)
|
||||
|
||||
# Fix shape mismatch between target_latents and x0
|
||||
if target_latents.shape[-1] != x0.shape[-1]:
|
||||
if target_latents.shape[-1] < x0.shape[-1]:
|
||||
# Pad with zeros if target_latents is shorter
|
||||
padding = x0.shape[-1] - target_latents.shape[-1]
|
||||
target_latents = torch.nn.functional.pad(
|
||||
target_latents, (0, padding), "constant", 0
|
||||
)
|
||||
else:
|
||||
# Trim if target_latents is longer
|
||||
target_latents = target_latents[..., :x0.shape[-1]]
|
||||
|
||||
assert (
|
||||
target_latents.shape[-1] == x0.shape[-1]
|
||||
), f"{target_latents.shape=} {x0.shape=}"
|
||||
@@ -1392,13 +1405,17 @@ class ACEStepPipeline:
|
||||
else:
|
||||
output_path_wav = save_path
|
||||
|
||||
target_wav = target_wav.float()
|
||||
backend = "soundfile"
|
||||
if format == "ogg":
|
||||
backend = "sox"
|
||||
logger.info(f"Saving audio to {output_path_wav} using backend {backend}")
|
||||
torchaudio.save(
|
||||
output_path_wav, target_wav, sample_rate=sample_rate, format=format, backend=backend
|
||||
target_wav = target_wav.float().cpu()
|
||||
logger.info(f"Saving audio to {output_path_wav}")
|
||||
# Write with soundfile rather than torchaudio.save(): since torchaudio
|
||||
# 2.11 the latter ignores the `backend` argument and routes everything
|
||||
# through TorchCodec, an extra native dependency we do not require.
|
||||
# soundfile expects (samples, channels), torch tensors are (channels, samples).
|
||||
sf.write(
|
||||
output_path_wav,
|
||||
target_wav.transpose(0, 1).numpy(),
|
||||
sample_rate,
|
||||
format=format.upper(),
|
||||
)
|
||||
return output_path_wav
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ from loguru import logger
|
||||
import time
|
||||
import traceback
|
||||
import torchaudio
|
||||
import soundfile as sf
|
||||
from pathlib import Path
|
||||
import re
|
||||
from acestep.language_segmentation import LangSegment
|
||||
@@ -398,7 +399,10 @@ class Text2MusicDataset(Dataset):
|
||||
filename = item["filename"]
|
||||
sr = 48000
|
||||
try:
|
||||
audio, sr = torchaudio.load(filename)
|
||||
# soundfile instead of torchaudio.load(): torchaudio 2.11 routes
|
||||
# I/O through TorchCodec, an extra native dependency.
|
||||
_data, sr = sf.read(filename, dtype="float32", always_2d=True)
|
||||
audio = torch.from_numpy(_data.T)
|
||||
except Exception as e:
|
||||
logger.error(f"Failed to load audio {item}: {e}")
|
||||
return None
|
||||
|
||||
@@ -101,7 +101,17 @@ def create_text2music_ui(
|
||||
if not os.path.isdir(output_file_dir):
|
||||
os.makedirs(output_file_dir, exist_ok=True)
|
||||
json_files = [f for f in os.listdir(output_file_dir) if f.endswith('.json')]
|
||||
json_files.sort(reverse=True, key=lambda x: int(x.split('_')[1]))
|
||||
|
||||
def _mtime(name):
|
||||
# Output filenames are user-controlled (infer.py --output_path, or the
|
||||
# save_path passed from the UI), so a timestamp cannot be parsed out of
|
||||
# them: doing so used to raise ValueError and take the whole UI down.
|
||||
try:
|
||||
return os.path.getmtime(os.path.join(output_file_dir, name))
|
||||
except OSError:
|
||||
return 0.0
|
||||
|
||||
json_files.sort(key=_mtime, reverse=True)
|
||||
output_files = gr.Dropdown(choices=json_files, label="Select previous generated input params", scale=9, interactive=True)
|
||||
load_bnt = gr.Button("Load", variant="primary", scale=1)
|
||||
|
||||
@@ -134,7 +144,7 @@ def create_text2music_ui(
|
||||
)
|
||||
lora_weight = gr.Number(value=1.0, label="Lora weight", step=0.1, maximum=3, minimum=-3)
|
||||
|
||||
ref_audio_input = gr.Audio(type="filepath", label="Reference Audio (for Audio2Audio)", visible=False, elem_id="ref_audio_input", show_download_button=True)
|
||||
ref_audio_input = gr.Audio(type="filepath", label="Reference Audio (for Audio2Audio)", visible=False, elem_id="ref_audio_input")
|
||||
ref_audio_strength = gr.Slider(
|
||||
label="Refer audio strength",
|
||||
minimum=0.0,
|
||||
@@ -403,7 +413,6 @@ def create_text2music_ui(
|
||||
type="filepath",
|
||||
visible=False,
|
||||
elem_id="repaint_source_audio_upload",
|
||||
show_download_button=True,
|
||||
)
|
||||
repaint_source.change(
|
||||
fn=lambda x: gr.update(
|
||||
@@ -572,7 +581,6 @@ def create_text2music_ui(
|
||||
type="filepath",
|
||||
visible=False,
|
||||
elem_id="edit_source_audio_upload",
|
||||
show_download_button=True,
|
||||
)
|
||||
edit_source.change(
|
||||
fn=lambda x: gr.update(
|
||||
@@ -724,7 +732,6 @@ def create_text2music_ui(
|
||||
type="filepath",
|
||||
visible=False,
|
||||
elem_id="extend_source_audio_upload",
|
||||
show_download_button=True,
|
||||
)
|
||||
extend_source.change(
|
||||
fn=lambda x: gr.update(
|
||||
|
||||
@@ -48,7 +48,66 @@ def sample_data(json_data):
|
||||
)
|
||||
@click.option("--device_id", type=int, default=0, help="Device ID to use")
|
||||
@click.option("--output_path", type=str, default=None, help="Path to save the output")
|
||||
def main(checkpoint_path, bf16, torch_compile, cpu_offload, overlapped_decode, device_id, output_path):
|
||||
# --- generation parameters -------------------------------------------------
|
||||
# Without --prompt the script keeps its original behaviour and generates from a
|
||||
# random example in examples/input_params.
|
||||
@click.option(
|
||||
"--prompt",
|
||||
type=str,
|
||||
default=None,
|
||||
help="Style tags or description, comma separated. If omitted, a random example is used.",
|
||||
)
|
||||
@click.option("--lyrics", type=str, default=None, help="Lyrics, with [verse]/[chorus] tags.")
|
||||
@click.option(
|
||||
"--lyrics_file",
|
||||
type=click.Path(exists=True, dir_okay=False),
|
||||
default=None,
|
||||
help="Read lyrics from a UTF-8 file. Takes precedence over --lyrics.",
|
||||
)
|
||||
@click.option("--duration", type=float, default=60.0, help="Audio duration in seconds (-1 for random).")
|
||||
@click.option("--steps", type=int, default=60, help="Number of inference steps.")
|
||||
@click.option("--guidance_scale", type=float, default=15.0, help="Guidance scale.")
|
||||
@click.option(
|
||||
"--scheduler",
|
||||
type=click.Choice(["euler", "heun", "pingpong"]),
|
||||
default="euler",
|
||||
help="Scheduler type.",
|
||||
)
|
||||
@click.option(
|
||||
"--cfg_type",
|
||||
type=click.Choice(["cfg", "apg", "cfg_star"]),
|
||||
default="apg",
|
||||
help="CFG type. apg is recommended.",
|
||||
)
|
||||
@click.option("--omega_scale", type=float, default=10.0, help="Granularity scale.")
|
||||
@click.option("--seed", type=str, default=None, help="Manual seeds, comma separated. Random if omitted.")
|
||||
@click.option(
|
||||
"--format",
|
||||
"audio_format",
|
||||
type=click.Choice(["wav", "mp3", "ogg", "flac"]),
|
||||
default="wav",
|
||||
help="Output audio format.",
|
||||
)
|
||||
def main(
|
||||
checkpoint_path,
|
||||
bf16,
|
||||
torch_compile,
|
||||
cpu_offload,
|
||||
overlapped_decode,
|
||||
device_id,
|
||||
output_path,
|
||||
prompt,
|
||||
lyrics,
|
||||
lyrics_file,
|
||||
duration,
|
||||
steps,
|
||||
guidance_scale,
|
||||
scheduler,
|
||||
cfg_type,
|
||||
omega_scale,
|
||||
seed,
|
||||
audio_format,
|
||||
):
|
||||
os.environ["CUDA_VISIBLE_DEVICES"] = str(device_id)
|
||||
|
||||
model_demo = ACEStepPipeline(
|
||||
@@ -58,44 +117,70 @@ def main(checkpoint_path, bf16, torch_compile, cpu_offload, overlapped_decode, d
|
||||
cpu_offload=cpu_offload,
|
||||
overlapped_decode=overlapped_decode
|
||||
)
|
||||
print(model_demo)
|
||||
|
||||
data_sampler = DataSampler()
|
||||
if lyrics_file is not None:
|
||||
with open(lyrics_file, "r", encoding="utf-8") as f:
|
||||
lyrics = f.read()
|
||||
|
||||
json_data = data_sampler.sample()
|
||||
json_data = sample_data(json_data)
|
||||
print(json_data)
|
||||
if prompt is None:
|
||||
# No prompt given: keep the original behaviour and use a random example.
|
||||
data_sampler = DataSampler()
|
||||
json_data = data_sampler.sample()
|
||||
(
|
||||
audio_duration,
|
||||
prompt,
|
||||
sampled_lyrics,
|
||||
infer_step,
|
||||
sampled_guidance_scale,
|
||||
scheduler_type,
|
||||
sampled_cfg_type,
|
||||
sampled_omega_scale,
|
||||
manual_seeds,
|
||||
guidance_interval,
|
||||
guidance_interval_decay,
|
||||
min_guidance_scale,
|
||||
use_erg_tag,
|
||||
use_erg_lyric,
|
||||
use_erg_diffusion,
|
||||
oss_steps,
|
||||
guidance_scale_text,
|
||||
guidance_scale_lyric,
|
||||
) = sample_data(json_data)
|
||||
# Explicit options still win over the sampled example.
|
||||
lyrics = lyrics if lyrics is not None else sampled_lyrics
|
||||
manual_seeds = seed if seed is not None else manual_seeds
|
||||
else:
|
||||
audio_duration = duration
|
||||
lyrics = lyrics if lyrics is not None else "[instrumental]"
|
||||
infer_step = steps
|
||||
sampled_guidance_scale = guidance_scale
|
||||
scheduler_type = scheduler
|
||||
sampled_cfg_type = cfg_type
|
||||
sampled_omega_scale = omega_scale
|
||||
manual_seeds = seed
|
||||
guidance_interval = 0.5
|
||||
guidance_interval_decay = 0.0
|
||||
min_guidance_scale = 3.0
|
||||
use_erg_tag = True
|
||||
use_erg_lyric = True
|
||||
use_erg_diffusion = True
|
||||
oss_steps = None
|
||||
guidance_scale_text = 0.0
|
||||
guidance_scale_lyric = 0.0
|
||||
|
||||
(
|
||||
audio_duration,
|
||||
prompt,
|
||||
lyrics,
|
||||
infer_step,
|
||||
guidance_scale,
|
||||
scheduler_type,
|
||||
cfg_type,
|
||||
omega_scale,
|
||||
manual_seeds,
|
||||
guidance_interval,
|
||||
guidance_interval_decay,
|
||||
min_guidance_scale,
|
||||
use_erg_tag,
|
||||
use_erg_lyric,
|
||||
use_erg_diffusion,
|
||||
oss_steps,
|
||||
guidance_scale_text,
|
||||
guidance_scale_lyric,
|
||||
) = json_data
|
||||
click.echo(f"prompt: {prompt}")
|
||||
click.echo(f"duration: {audio_duration}s, steps: {infer_step}, seeds: {manual_seeds}")
|
||||
|
||||
model_demo(
|
||||
format=audio_format,
|
||||
audio_duration=audio_duration,
|
||||
prompt=prompt,
|
||||
lyrics=lyrics,
|
||||
infer_step=infer_step,
|
||||
guidance_scale=guidance_scale,
|
||||
guidance_scale=sampled_guidance_scale,
|
||||
scheduler_type=scheduler_type,
|
||||
cfg_type=cfg_type,
|
||||
omega_scale=omega_scale,
|
||||
cfg_type=sampled_cfg_type,
|
||||
omega_scale=sampled_omega_scale,
|
||||
manual_seeds=manual_seeds,
|
||||
guidance_interval=guidance_interval,
|
||||
guidance_interval_decay=guidance_interval_decay,
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# Training-only dependencies (trainer.py, convert2hf_dataset.py).
|
||||
# Install with: pip install -e ".[train]"
|
||||
datasets==3.4.1
|
||||
pytorch_lightning==2.5.1
|
||||
matplotlib==3.10.1
|
||||
tensorboard
|
||||
tensorboardX
|
||||
+2
-7
@@ -1,18 +1,15 @@
|
||||
datasets==3.4.1
|
||||
diffusers>=0.33.0
|
||||
gradio
|
||||
gradio>=6.0.0
|
||||
librosa==0.11.0
|
||||
loguru==0.7.3
|
||||
matplotlib==3.10.1
|
||||
numpy
|
||||
pypinyin==0.53.0
|
||||
pytorch_lightning==2.5.1
|
||||
soundfile==0.13.1
|
||||
torch
|
||||
torchaudio
|
||||
torchvision
|
||||
tqdm
|
||||
transformers==4.50.0
|
||||
transformers>=4.57.0
|
||||
py3langid==0.3.0
|
||||
hangul-romanize==0.1.0
|
||||
num2words==0.5.14
|
||||
@@ -22,5 +19,3 @@ cutlet
|
||||
fugashi[unidic-lite]
|
||||
click
|
||||
peft
|
||||
tensorboard
|
||||
tensorboardX
|
||||
@@ -1,5 +1,16 @@
|
||||
from setuptools import setup, find_namespace_packages
|
||||
|
||||
|
||||
def read_requirements(path):
|
||||
"""Read a requirements file, skipping comments and blank lines."""
|
||||
with open(path, encoding="utf-8") as f:
|
||||
return [
|
||||
line.strip()
|
||||
for line in f
|
||||
if line.strip() and not line.lstrip().startswith("#")
|
||||
]
|
||||
|
||||
|
||||
setup(
|
||||
name="ace_step",
|
||||
description="ACE Step: A Step Towards Music Generation Foundation Model",
|
||||
@@ -7,7 +18,7 @@ setup(
|
||||
long_description_content_type="text/markdown",
|
||||
version="0.2.0",
|
||||
packages=find_namespace_packages(),
|
||||
install_requires=open("requirements.txt", encoding="utf-8").read().splitlines(),
|
||||
install_requires=read_requirements("requirements.txt"),
|
||||
author="ACE Studio, StepFun AI",
|
||||
license="Apache 2.0",
|
||||
classifiers=[
|
||||
@@ -25,10 +36,7 @@ setup(
|
||||
"acestep.models.lyrics_utils": ["vocab.json"], # Specify the relative path to vocab.json
|
||||
},
|
||||
extras_require={
|
||||
"train": [
|
||||
"peft",
|
||||
"tensorboard",
|
||||
"tensorboardX"
|
||||
]
|
||||
# Only needed to train or fine-tune; inference does not import these.
|
||||
"train": read_requirements("requirements-train.txt"),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
@echo off
|
||||
chcp 65001 >nul 2>&1
|
||||
setlocal
|
||||
title ACE-Step
|
||||
pushd "%~dp0"
|
||||
|
||||
REM ============================ НАСТРОЙКИ ============================
|
||||
REM Каталог виртуального окружения
|
||||
set "VENV_DIR=venv"
|
||||
REM Порт веб-интерфейса
|
||||
set "PORT=7865"
|
||||
REM Адрес, на котором слушает сервер (0.0.0.0 - доступ из локальной сети)
|
||||
set "SERVER_NAME=127.0.0.1"
|
||||
REM Номер видеокарты
|
||||
set "DEVICE_ID=0"
|
||||
REM Путь к весам модели. Пусто - скачать в ~/.cache/ace-step/checkpoints
|
||||
set "CHECKPOINT_PATH="
|
||||
REM Сборка PyTorch (cu126 / cu124 / cu121 - под вашу версию CUDA)
|
||||
set "TORCH_INDEX=https://download.pytorch.org/whl/cu126"
|
||||
REM ==================================================================
|
||||
|
||||
REM Имя скрипта надо запомнить до shift: shift сдвигает и %0
|
||||
set "SCRIPT_NAME=%~nx0"
|
||||
|
||||
set "OPT_LOWVRAM=0"
|
||||
set "OPT_CPU=0"
|
||||
set "OPT_SHARE=0"
|
||||
set "DO_SETUP_ONLY=0"
|
||||
set "DO_REINSTALL=0"
|
||||
set "DO_UPDATE=0"
|
||||
|
||||
set "FROM_EXPLORER=0"
|
||||
echo %cmdcmdline% | find /i "%~nx0" >nul 2>&1 && set "FROM_EXPLORER=1"
|
||||
|
||||
REM ------------------------- разбор аргументов -------------------------
|
||||
:parse_args
|
||||
if "%~1"=="" goto args_done
|
||||
if /i "%~1"=="--help" goto usage
|
||||
if /i "%~1"=="-h" goto usage
|
||||
if /i "%~1"=="/?" goto usage
|
||||
if /i "%~1"=="--lowvram" ( set "OPT_LOWVRAM=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--cpu" ( set "OPT_CPU=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--share" ( set "OPT_SHARE=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--setup" ( set "DO_SETUP_ONLY=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--reinstall" ( set "DO_REINSTALL=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--update" ( set "DO_UPDATE=1" & shift & goto parse_args )
|
||||
if /i "%~1"=="--listen" ( set "SERVER_NAME=0.0.0.0" & shift & goto parse_args )
|
||||
if /i "%~1"=="--port" ( set "PORT=%~2" & shift & shift & goto parse_args )
|
||||
if /i "%~1"=="--device" ( set "DEVICE_ID=%~2" & shift & shift & goto parse_args )
|
||||
echo [ОШИБКА] Неизвестный аргумент: %~1
|
||||
echo Запустите "%SCRIPT_NAME% --help" для справки.
|
||||
goto fail
|
||||
:args_done
|
||||
|
||||
echo.
|
||||
echo ==========================================
|
||||
echo ACE-Step - генерация музыки
|
||||
echo ==========================================
|
||||
echo.
|
||||
|
||||
set "VENV_PY=%CD%\%VENV_DIR%\Scripts\python.exe"
|
||||
|
||||
if "%DO_REINSTALL%"=="1" (
|
||||
if exist "%VENV_DIR%\" (
|
||||
echo [1/4] Удаляю старое окружение "%VENV_DIR%"...
|
||||
rmdir /s /q "%VENV_DIR%"
|
||||
)
|
||||
)
|
||||
|
||||
REM ------------------------- поиск Python -------------------------
|
||||
REM Рабочим считаем окружение, в котором есть и python, и pip: каталог от
|
||||
REM прерванной установки выглядит как готовый, но валится дальше с невнятной
|
||||
REM ошибкой про интернет.
|
||||
if not exist "%VENV_PY%" goto venv_create
|
||||
"%VENV_PY%" -m pip --version >nul 2>&1 && goto venv_ready
|
||||
echo [1/4] Окружение "%VENV_DIR%" неработоспособно, пересоздаю...
|
||||
rmdir /s /q "%VENV_DIR%"
|
||||
|
||||
:venv_create
|
||||
echo [1/4] Ищу подходящий Python...
|
||||
set "SYS_PY="
|
||||
for %%V in (3.12 3.11 3.10 3.13) do (
|
||||
if not defined SYS_PY (
|
||||
py -%%V -c "import sys" >nul 2>&1 && set "SYS_PY=py -%%V"
|
||||
)
|
||||
)
|
||||
if not defined SYS_PY (
|
||||
python -c "import sys; sys.exit(0 if sys.version_info >= (3,10) else 1)" >nul 2>&1 && set "SYS_PY=python"
|
||||
)
|
||||
if not defined SYS_PY (
|
||||
echo.
|
||||
echo [ОШИБКА] Не найден Python 3.10 или новее.
|
||||
echo Установите его с https://www.python.org/downloads/
|
||||
echo и обязательно отметьте галочку "Add Python to PATH".
|
||||
goto fail
|
||||
)
|
||||
for /f "delims=" %%O in ('%SYS_PY% -c "import sys;print(sys.version.split()[0])" 2^>nul') do set "PYVER=%%O"
|
||||
echo Найден Python %PYVER% (%SYS_PY%)
|
||||
|
||||
echo [1/4] Создаю виртуальное окружение в "%VENV_DIR%"...
|
||||
%SYS_PY% -m venv "%VENV_DIR%"
|
||||
if errorlevel 1 goto venv_failed
|
||||
if not exist "%VENV_PY%" goto venv_failed
|
||||
"%VENV_PY%" -m pip --version >nul 2>&1 || goto venv_failed
|
||||
set "FRESH_VENV=1"
|
||||
|
||||
:venv_ready
|
||||
if not defined FRESH_VENV echo [1/4] Виртуальное окружение найдено: %VENV_DIR%
|
||||
|
||||
REM ------------------------- зависимости -------------------------
|
||||
echo [2/4] Проверяю зависимости...
|
||||
|
||||
set "NEED_TORCH=0"
|
||||
"%VENV_PY%" -c "import importlib.util,sys; sys.exit(0 if importlib.util.find_spec('torch') else 1)" >nul 2>&1 || set "NEED_TORCH=1"
|
||||
REM Проверяем именно установку пакета: сам каталог acestep лежит рядом со скриптом,
|
||||
REM поэтому find_spec('acestep') сработал бы даже без установленных зависимостей.
|
||||
set "NEED_ACESTEP=0"
|
||||
"%VENV_PY%" -c "import importlib.metadata as md, importlib.util as u, sys; md.version('ace_step'); sys.exit(0 if u.find_spec('click') and u.find_spec('gradio') else 1)" >nul 2>&1 || set "NEED_ACESTEP=1"
|
||||
|
||||
if "%DO_UPDATE%"=="1" set "NEED_TORCH=1"
|
||||
if "%DO_UPDATE%"=="1" set "NEED_ACESTEP=1"
|
||||
|
||||
if "%NEED_TORCH%%NEED_ACESTEP%"=="00" goto deps_ready
|
||||
|
||||
echo Обновляю pip...
|
||||
"%VENV_PY%" -m pip install --upgrade pip setuptools wheel --quiet
|
||||
if errorlevel 1 (
|
||||
echo [ОШИБКА] Не удалось обновить pip. Проверьте подключение к интернету.
|
||||
goto fail
|
||||
)
|
||||
|
||||
if "%NEED_TORCH%"=="1" (
|
||||
if "%OPT_CPU%"=="1" (
|
||||
echo Устанавливаю PyTorch для CPU. Это займёт несколько минут...
|
||||
"%VENV_PY%" -m pip install --upgrade torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
|
||||
) else (
|
||||
echo Устанавливаю PyTorch с поддержкой CUDA. Это займёт несколько минут...
|
||||
"%VENV_PY%" -m pip install --upgrade torch torchvision torchaudio --index-url %TORCH_INDEX%
|
||||
)
|
||||
if errorlevel 1 (
|
||||
echo [ОШИБКА] Не удалось установить PyTorch.
|
||||
echo Если у вас другая версия CUDA, поменяйте TORCH_INDEX в начале этого файла.
|
||||
goto fail
|
||||
)
|
||||
)
|
||||
|
||||
if "%NEED_ACESTEP%"=="1" (
|
||||
echo Устанавливаю ACE-Step и зависимости...
|
||||
"%VENV_PY%" -m pip install -e .
|
||||
if errorlevel 1 (
|
||||
echo [ОШИБКА] Не удалось установить ACE-Step.
|
||||
goto fail
|
||||
)
|
||||
)
|
||||
|
||||
:deps_ready
|
||||
|
||||
if "%OPT_LOWVRAM%"=="1" (
|
||||
"%VENV_PY%" -c "import importlib.util,sys; sys.exit(0 if importlib.util.find_spec('triton') else 1)" >nul 2>&1 || (
|
||||
echo Режим экономии VRAM: устанавливаю triton-windows...
|
||||
"%VENV_PY%" -m pip install triton-windows --quiet
|
||||
if errorlevel 1 echo [ВНИМАНИЕ] triton-windows не установился, --torch_compile может не заработать.
|
||||
)
|
||||
)
|
||||
|
||||
REM ------------------------- проверка GPU -------------------------
|
||||
echo [3/4] Проверяю видеокарту...
|
||||
if "%OPT_CPU%"=="1" goto gpu_cpu_mode
|
||||
|
||||
set "BF16=true"
|
||||
set "GPUINFO="
|
||||
set "GPUTMP=%TEMP%\acestep_gpu_%RANDOM%.txt"
|
||||
"%VENV_PY%" -c "import torch; print((torch.cuda.get_device_name(0) + ' - ' + str(round(torch.cuda.get_device_properties(0).total_memory/1073741824, 1)) + ' GB VRAM') if torch.cuda.is_available() else 'NO_CUDA')" > "%GPUTMP%" 2>nul
|
||||
if exist "%GPUTMP%" set /p GPUINFO=<"%GPUTMP%"
|
||||
del "%GPUTMP%" >nul 2>&1
|
||||
if not defined GPUINFO set "GPUINFO=NO_CUDA"
|
||||
if not "%GPUINFO%"=="NO_CUDA" goto gpu_ok
|
||||
echo.
|
||||
echo [ВНИМАНИЕ] CUDA недоступна - модель будет работать на процессоре ^(очень медленно^).
|
||||
echo Если у вас есть видеокарта NVIDIA, обновите драйвер и переустановите PyTorch:
|
||||
echo "%SCRIPT_NAME%" --update
|
||||
echo.
|
||||
goto gpu_done
|
||||
|
||||
:gpu_ok
|
||||
echo %GPUINFO%
|
||||
goto gpu_done
|
||||
|
||||
:gpu_cpu_mode
|
||||
echo Принудительный режим CPU. Генерация будет очень медленной.
|
||||
set "DEVICE_ID=-1"
|
||||
set "BF16=false"
|
||||
|
||||
:gpu_done
|
||||
|
||||
if "%DO_SETUP_ONLY%"=="1" (
|
||||
echo.
|
||||
echo Установка завершена. Для запуска выполните "%SCRIPT_NAME%".
|
||||
goto success
|
||||
)
|
||||
|
||||
REM ------------------------- запуск -------------------------
|
||||
set "ARGS=--port %PORT% --server_name %SERVER_NAME% --device_id=%DEVICE_ID% --bf16 %BF16%"
|
||||
if not "%CHECKPOINT_PATH%"=="" set ARGS=%ARGS% --checkpoint_path "%CHECKPOINT_PATH%"
|
||||
if "%OPT_SHARE%"=="1" set "ARGS=%ARGS% --share true"
|
||||
if "%OPT_LOWVRAM%"=="1" set "ARGS=%ARGS% --cpu_offload true --overlapped_decode true --torch_compile true"
|
||||
|
||||
echo [4/4] Запускаю веб-интерфейс...
|
||||
echo.
|
||||
if "%OPT_LOWVRAM%"=="1" echo Режим: экономия видеопамяти
|
||||
echo Идёт загрузка моделей, это занимает время.
|
||||
echo При первом запуске дополнительно скачиваются веса (~8 ГБ).
|
||||
echo.
|
||||
echo Интерфейс будет доступен на http://%SERVER_NAME%:%PORT%
|
||||
echo когда ниже появится строка "Running on local URL".
|
||||
echo Остановить: Ctrl+C в этом окне.
|
||||
echo.
|
||||
|
||||
"%VENV_PY%" -m acestep.gui %ARGS%
|
||||
if errorlevel 1 (
|
||||
echo.
|
||||
echo [ОШИБКА] ACE-Step завершился с ошибкой. Текст ошибки - выше.
|
||||
goto fail
|
||||
)
|
||||
goto success
|
||||
|
||||
REM ------------------------- справка -------------------------
|
||||
:usage
|
||||
echo.
|
||||
echo Использование: %SCRIPT_NAME% [флаги]
|
||||
echo.
|
||||
echo --lowvram Режим экономии видеопамяти (~8 ГБ VRAM)
|
||||
echo --cpu Запуск на процессоре, без CUDA (очень медленно)
|
||||
echo --share Публичная ссылка Gradio
|
||||
echo --port ^<N^> Порт веб-интерфейса (по умолчанию %PORT%)
|
||||
echo --device ^<N^> Номер видеокарты (по умолчанию %DEVICE_ID%)
|
||||
echo --listen Слушать 0.0.0.0 (доступ из локальной сети)
|
||||
echo --reinstall Пересоздать виртуальное окружение с нуля
|
||||
echo --update Обновить зависимости
|
||||
echo --setup Только установка, без запуска
|
||||
echo --help Эта справка
|
||||
echo.
|
||||
echo Настройки по умолчанию - в блоке НАСТРОЙКИ в начале файла.
|
||||
echo.
|
||||
goto success
|
||||
|
||||
REM ------------------------- завершение -------------------------
|
||||
:venv_failed
|
||||
echo.
|
||||
echo [ОШИБКА] Не удалось создать рабочее виртуальное окружение в "%VENV_DIR%".
|
||||
echo Переустановите Python с https://www.python.org/downloads/,
|
||||
echo отметив "Add Python to PATH", и запустите "%SCRIPT_NAME% --reinstall".
|
||||
goto fail
|
||||
|
||||
:fail
|
||||
echo.
|
||||
pause
|
||||
popd
|
||||
endlocal
|
||||
exit /b 1
|
||||
|
||||
:success
|
||||
if "%FROM_EXPLORER%"=="1" pause
|
||||
popd
|
||||
endlocal
|
||||
exit /b 0
|
||||
@@ -0,0 +1,233 @@
|
||||
#!/usr/bin/env bash
|
||||
# ACE-Step: настройка окружения и запуск веб-интерфейса на Linux / macOS.
|
||||
# Windows-аналог — start.bat.
|
||||
set -uo pipefail
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# ============================ НАСТРОЙКИ ============================
|
||||
VENV_DIR="${VENV_DIR:-venv}" # каталог виртуального окружения
|
||||
PORT="${PORT:-7865}" # порт веб-интерфейса
|
||||
SERVER_NAME="${SERVER_NAME:-127.0.0.1}" # 0.0.0.0 — доступ из локальной сети
|
||||
DEVICE_ID="${DEVICE_ID:-0}" # номер видеокарты
|
||||
CHECKPOINT_PATH="${CHECKPOINT_PATH:-}" # пусто — скачать в ~/.cache/ace-step
|
||||
# Сборка PyTorch под CUDA (cu126 / cu124 / cu121). Только для Linux.
|
||||
TORCH_INDEX="${TORCH_INDEX:-https://download.pytorch.org/whl/cu126}"
|
||||
# ==================================================================
|
||||
|
||||
SCRIPT_NAME="$(basename "$0")"
|
||||
OPT_LOWVRAM=0
|
||||
OPT_CPU=0
|
||||
OPT_SHARE=0
|
||||
DO_SETUP_ONLY=0
|
||||
DO_REINSTALL=0
|
||||
DO_UPDATE=0
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
|
||||
Использование: ./$SCRIPT_NAME [флаги]
|
||||
|
||||
--lowvram Режим экономии видеопамяти (~8 ГБ VRAM)
|
||||
--cpu Запуск на процессоре, без CUDA (очень медленно)
|
||||
--share Публичная ссылка Gradio
|
||||
--port <N> Порт веб-интерфейса (по умолчанию $PORT)
|
||||
--device <N> Номер видеокарты (по умолчанию $DEVICE_ID)
|
||||
--listen Слушать 0.0.0.0 (доступ из локальной сети)
|
||||
--reinstall Пересоздать виртуальное окружение с нуля
|
||||
--update Обновить зависимости
|
||||
--setup Только установка, без запуска
|
||||
--help Эта справка
|
||||
|
||||
Настройки по умолчанию — в блоке НАСТРОЙКИ в начале файла,
|
||||
их можно переопределить переменными окружения (PORT=7870 ./$SCRIPT_NAME).
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
die() {
|
||||
echo
|
||||
echo "[ОШИБКА] $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--help|-h) usage; exit 0 ;;
|
||||
--lowvram) OPT_LOWVRAM=1; shift ;;
|
||||
--cpu) OPT_CPU=1; shift ;;
|
||||
--share) OPT_SHARE=1; shift ;;
|
||||
--setup) DO_SETUP_ONLY=1; shift ;;
|
||||
--reinstall) DO_REINSTALL=1; shift ;;
|
||||
--update) DO_UPDATE=1; shift ;;
|
||||
--listen) SERVER_NAME="0.0.0.0"; shift ;;
|
||||
--port) PORT="${2:?--port требует значение}"; shift 2 ;;
|
||||
--device) DEVICE_ID="${2:?--device требует значение}"; shift 2 ;;
|
||||
*)
|
||||
echo "[ОШИБКА] Неизвестный аргумент: $1" >&2
|
||||
echo "Запустите ./$SCRIPT_NAME --help для справки." >&2
|
||||
exit 1 ;;
|
||||
esac
|
||||
done
|
||||
|
||||
echo
|
||||
echo "=========================================="
|
||||
echo " ACE-Step - генерация музыки"
|
||||
echo "=========================================="
|
||||
echo
|
||||
|
||||
case "$(uname -s)" in
|
||||
Darwin) IS_MAC=1 ;;
|
||||
*) IS_MAC=0 ;;
|
||||
esac
|
||||
|
||||
VENV_PY="$PWD/$VENV_DIR/bin/python"
|
||||
|
||||
# Рабочим считаем окружение, в котором есть и python, и pip: каталог от
|
||||
# прерванной установки (или venv без ensurepip) выглядит как готовый, но валится
|
||||
# дальше с невнятной ошибкой.
|
||||
venv_ok() {
|
||||
[ -x "$VENV_PY" ] && "$VENV_PY" -m pip --version >/dev/null 2>&1
|
||||
}
|
||||
|
||||
venv_failed() {
|
||||
echo >&2
|
||||
echo "[ОШИБКА] Не удалось создать рабочее виртуальное окружение в \"$VENV_DIR\"." >&2
|
||||
if [ "$IS_MAC" = 0 ] && command -v apt >/dev/null 2>&1; then
|
||||
echo "На Debian/Ubuntu для этого нужен отдельный пакет:" >&2
|
||||
echo " sudo apt install python3-venv" >&2
|
||||
fi
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ "$DO_REINSTALL" = 1 ] && [ -d "$VENV_DIR" ]; then
|
||||
echo "[1/4] Удаляю старое окружение \"$VENV_DIR\"..."
|
||||
rm -rf "$VENV_DIR"
|
||||
fi
|
||||
|
||||
# ------------------------- поиск Python -------------------------
|
||||
if venv_ok; then
|
||||
echo "[1/4] Виртуальное окружение найдено: $VENV_DIR"
|
||||
else
|
||||
if [ -d "$VENV_DIR" ]; then
|
||||
echo "[1/4] Окружение \"$VENV_DIR\" неработоспособно, пересоздаю..."
|
||||
rm -rf "$VENV_DIR"
|
||||
fi
|
||||
echo "[1/4] Ищу подходящий Python..."
|
||||
SYS_PY=""
|
||||
for candidate in python3.12 python3.11 python3.10 python3.13 python3; do
|
||||
if command -v "$candidate" >/dev/null 2>&1 &&
|
||||
"$candidate" -c 'import sys; sys.exit(0 if sys.version_info >= (3,10) else 1)' 2>/dev/null; then
|
||||
SYS_PY="$candidate"
|
||||
break
|
||||
fi
|
||||
done
|
||||
[ -n "$SYS_PY" ] || die "Не найден Python 3.10 или новее. Установите его и повторите."
|
||||
|
||||
echo " Найден Python $("$SYS_PY" -c 'import sys; print(sys.version.split()[0])') ($SYS_PY)"
|
||||
echo "[1/4] Создаю виртуальное окружение в \"$VENV_DIR\"..."
|
||||
"$SYS_PY" -m venv "$VENV_DIR" || venv_failed
|
||||
venv_ok || venv_failed
|
||||
fi
|
||||
|
||||
# ------------------------- зависимости -------------------------
|
||||
echo "[2/4] Проверяю зависимости..."
|
||||
|
||||
NEED_TORCH=0
|
||||
"$VENV_PY" -c "import importlib.util,sys; sys.exit(0 if importlib.util.find_spec('torch') else 1)" 2>/dev/null || NEED_TORCH=1
|
||||
|
||||
# Проверяем именно установку пакета: каталог acestep лежит рядом со скриптом,
|
||||
# поэтому find_spec('acestep') сработал бы и без установленных зависимостей.
|
||||
NEED_ACESTEP=0
|
||||
"$VENV_PY" -c "import importlib.metadata as md, importlib.util as u, sys; md.version('ace_step'); sys.exit(0 if u.find_spec('click') and u.find_spec('gradio') else 1)" 2>/dev/null || NEED_ACESTEP=1
|
||||
|
||||
if [ "$DO_UPDATE" = 1 ]; then
|
||||
NEED_TORCH=1
|
||||
NEED_ACESTEP=1
|
||||
fi
|
||||
|
||||
if [ "$NEED_TORCH" = 1 ] || [ "$NEED_ACESTEP" = 1 ]; then
|
||||
echo " Обновляю pip..."
|
||||
"$VENV_PY" -m pip install --upgrade pip setuptools wheel --quiet ||
|
||||
die "Не удалось обновить pip. Проверьте подключение к интернету."
|
||||
fi
|
||||
|
||||
if [ "$NEED_TORCH" = 1 ]; then
|
||||
if [ "$IS_MAC" = 1 ]; then
|
||||
# На macOS колёса с PyPI уже собраны с поддержкой MPS.
|
||||
echo " Устанавливаю PyTorch (macOS/MPS). Это займёт несколько минут..."
|
||||
"$VENV_PY" -m pip install --upgrade torch torchvision torchaudio
|
||||
elif [ "$OPT_CPU" = 1 ]; then
|
||||
echo " Устанавливаю PyTorch для CPU. Это займёт несколько минут..."
|
||||
"$VENV_PY" -m pip install --upgrade torch torchvision torchaudio \
|
||||
--index-url https://download.pytorch.org/whl/cpu
|
||||
else
|
||||
echo " Устанавливаю PyTorch с поддержкой CUDA. Это займёт несколько минут..."
|
||||
"$VENV_PY" -m pip install --upgrade torch torchvision torchaudio --index-url "$TORCH_INDEX"
|
||||
fi || die "Не удалось установить PyTorch. Если у вас другая версия CUDA, поменяйте TORCH_INDEX."
|
||||
fi
|
||||
|
||||
if [ "$NEED_ACESTEP" = 1 ]; then
|
||||
echo " Устанавливаю ACE-Step и зависимости..."
|
||||
"$VENV_PY" -m pip install -e . || die "Не удалось установить ACE-Step."
|
||||
fi
|
||||
|
||||
if [ "$OPT_LOWVRAM" = 1 ] && [ "$IS_MAC" = 0 ]; then
|
||||
if ! "$VENV_PY" -c "import importlib.util,sys; sys.exit(0 if importlib.util.find_spec('triton') else 1)" 2>/dev/null; then
|
||||
echo " Режим экономии VRAM: устанавливаю triton..."
|
||||
"$VENV_PY" -m pip install triton --quiet ||
|
||||
echo "[ВНИМАНИЕ] triton не установился, --torch_compile может не заработать."
|
||||
fi
|
||||
fi
|
||||
|
||||
# ------------------------- проверка устройства -------------------------
|
||||
echo "[3/4] Проверяю устройство..."
|
||||
BF16=true
|
||||
if [ "$OPT_CPU" = 1 ]; then
|
||||
echo " Принудительный режим CPU. Генерация будет очень медленной."
|
||||
DEVICE_ID=-1
|
||||
BF16=false
|
||||
elif [ "$IS_MAC" = 1 ]; then
|
||||
# На MPS bfloat16 приводит к ошибкам, см. README.
|
||||
echo " macOS: используется MPS, bf16 отключён."
|
||||
BF16=false
|
||||
else
|
||||
GPUINFO="$("$VENV_PY" -c "import torch; print((torch.cuda.get_device_name(0) + ' - ' + str(round(torch.cuda.get_device_properties(0).total_memory/1073741824, 1)) + ' GB VRAM') if torch.cuda.is_available() else 'NO_CUDA')" 2>/dev/null || echo NO_CUDA)"
|
||||
if [ "$GPUINFO" = "NO_CUDA" ]; then
|
||||
echo
|
||||
echo "[ВНИМАНИЕ] CUDA недоступна - модель будет работать на процессоре (очень медленно)."
|
||||
echo "Если у вас есть видеокарта NVIDIA, обновите драйвер и переустановите PyTorch:"
|
||||
echo " ./$SCRIPT_NAME --update"
|
||||
echo
|
||||
else
|
||||
echo " $GPUINFO"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "$DO_SETUP_ONLY" = 1 ]; then
|
||||
echo
|
||||
echo "Установка завершена. Для запуска выполните ./$SCRIPT_NAME"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# ------------------------- запуск -------------------------
|
||||
ARGS=(--port "$PORT" --server_name "$SERVER_NAME" "--device_id=$DEVICE_ID" --bf16 "$BF16")
|
||||
[ -n "$CHECKPOINT_PATH" ] && ARGS+=(--checkpoint_path "$CHECKPOINT_PATH")
|
||||
[ "$OPT_SHARE" = 1 ] && ARGS+=(--share true)
|
||||
if [ "$OPT_LOWVRAM" = 1 ]; then
|
||||
ARGS+=(--cpu_offload true --overlapped_decode true)
|
||||
[ "$IS_MAC" = 0 ] && ARGS+=(--torch_compile true)
|
||||
fi
|
||||
|
||||
echo "[4/4] Запускаю веб-интерфейс..."
|
||||
echo
|
||||
[ "$OPT_LOWVRAM" = 1 ] && echo " Режим: экономия видеопамяти"
|
||||
echo " Идёт загрузка моделей, это занимает время."
|
||||
echo " При первом запуске дополнительно скачиваются веса (~8 ГБ)."
|
||||
echo
|
||||
echo " Интерфейс будет доступен на http://$SERVER_NAME:$PORT"
|
||||
echo " когда ниже появится строка \"Running on local URL\"."
|
||||
echo " Остановить: Ctrl+C в этом окне."
|
||||
echo
|
||||
|
||||
exec "$VENV_PY" -m acestep.gui "${ARGS[@]}"
|
||||
Reference in New Issue
Block a user