Compare commits

...
11 Commits
Author SHA1 Message Date
Leonid PershinandClaude Opus 5 7f441defcc feat: add start.sh for Linux/macOS, harden both launchers
start.sh mirrors start.bat: finds Python 3.10+, creates the venv,
installs PyTorch (CUDA index on Linux, the MPS build on macOS, or the CPU
index with --cpu), installs ACE-Step, reports the device and launches the
UI. Same flags, and the defaults can also come from the environment
(PORT=7870 ./start.sh). On macOS it passes --bf16 false, which the README
already calls for. Dropped start.sh from .gitignore, where it sat among
the upstream author's local scratch files.

Both launchers also gain two fixes found while testing on WSL:

- A venv is only accepted if pip works in it, not merely if the
  interpreter exists. A directory left by an interrupted install looked
  ready and then failed several steps later with a misleading "check your
  internet connection". Such a venv is now recreated, and if creation
  fails on Debian/Ubuntu the error points at python3-venv, which is the
  actual cause there.
- The launch banner announced the URL as if the server were already up,
  while model loading still had a minute to go. It now says the interface
  will be available once "Running on local URL" appears.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 20:31:18 +03:00
Leonid PershinandClaude Opus 5 e9ea6b9bab feat: generation options for infer.py, and split out training deps
infer.py could only render a random example from examples/input_params:
there was no way to pass your own prompt, lyrics, duration or seed, so
using it for anything specific meant writing a separate script. Add
--prompt, --lyrics/--lyrics_file, --duration, --steps, --guidance_scale,
--scheduler, --cfg_type, --omega_scale, --seed and --format alongside the
existing runtime flags. Without --prompt the old random-example behaviour
is kept, so existing invocations are unaffected.

Also move the training-only packages out of the default install.
datasets, pytorch_lightning, matplotlib, tensorboard and tensorboardX are
imported by trainer.py and convert2hf_dataset.py, never on the inference
path, but every user was installing them — and datasets==3.4.1 is a hard
pin that drags constraints onto huggingface-hub. They now live in
requirements-train.txt behind the existing (previously ineffective)
"train" extra: pip install -e ".[train]".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 20:31:07 +03:00
Leonid PershinandClaude Opus 5 c7953dc4e0 fix: don't crash the UI on output files with custom names
create_text2music_ui() sorted the saved *_input_params.json files with
int(name.split('_')[1]), which assumes the generated
output_<timestamp>_<idx>_ shape. Output names are user-controlled — via
infer.py --output_path or a save_path from the UI — so any other name
raised ValueError while the Blocks were being built and took the whole
interface down before it could start:

    ValueError: invalid literal for int() with base 10: 'base'

Sort by mtime instead. That is what "previous generated input params"
means anyway (newest first) and it works for any filename; a file that
disappears between listdir() and getmtime() sorts last rather than
raising.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 20:30:58 +03:00
Leonid PershinandClaude Opus 5 0584397884 fix: write and read audio with soundfile instead of torchaudio
torchaudio 2.11 routes torchaudio.save()/load() through TorchCodec and
ignores the `backend` argument, so every generation died at the save
step with "ImportError: TorchCodec is required for save_with_torchcodec"
after the diffusion had already finished. Reference-audio loading
(audio2audio, repaint, extend) and the training dataset loader hit the
same wall.

soundfile is already a required dependency and covers all four output
formats the UI offers, so use it directly rather than pulling in
TorchCodec and its native FFmpeg stack:

- pipeline_ace_step.save_wav_file(): sf.write(), transposing
  (channels, samples) -> (samples, channels); drops the now-unused
  torchaudio import
- MusicDCAE.load_audio() and text2music_dataset: sf.read(dtype=float32,
  always_2d=True), transposed back to (channels, samples)

torchaudio is still used for Resample/MelScale transforms, which are
unaffected.

Verified end to end: 10s generation on an RTX 3060 in 9.7s, output is
valid non-silent 48kHz stereo; load_audio round-trips it; wav/mp3/ogg/
flac all write and read back.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 19:03:29 +03:00
Leonid PershinandClaude Opus 5 6e3273d049 deps: migrate the UI to Gradio 6
Gradio was unpinned, so a fresh install pulled Gradio 6, where
gr.Audio no longer accepts show_download_button — the UI crashed on
startup with TypeError. Move forward to Gradio 6 instead of pinning
back to 5:

- requirements: gradio>=6.0.0
- drop the removed show_download_button kwarg (4 call sites)
- requirements: transformers>=4.57.0 — Gradio 6 requires
  huggingface-hub>=1.0, which transformers==4.50.0 forbids. Only
  UMT5EncoderModel and AutoTokenizer are used, so the bump is safe.

Verified: pip check clean, UI renders and server callbacks work on
gradio 6.26.0 / transformers 5.16.1 / huggingface-hub 1.30.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 18:38:12 +03:00
Leonid PershinandClaude Opus 5 911899635a docs: add Russian README and a Windows start.bat launcher
- README_RU.md: full Russian translation, linked from README.md
- start.bat: one-click setup + launch for Windows. Finds Python 3.10+,
  creates the venv, installs PyTorch (CUDA or CPU) and ACE-Step, checks
  the GPU, then starts the web UI. Flags: --lowvram, --cpu, --share,
  --port, --device, --listen, --reinstall, --update, --setup, --help.
- Both READMEs document the launcher.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 18:38:05 +03:00
Gong Junmin 1bee4c9f5b Merge pull request #373 from iackov/fix/extend-mode-shape-mismatch 2026-02-15 12:57:54 +08:00
Gong Junmin 4a24cfb662 Merge pull request #375 from ace-step/copilot/add-external-link-for-model 2026-02-15 12:57:18 +08:00
copilot-swe-agent[bot]andChuxiJ 66b690b05b Add external link for ACE-Step v1.5 model
Co-authored-by: ChuxiJ <30956809+ChuxiJ@users.noreply.github.com>
2026-01-28 00:09:54 +00:00
copilot-swe-agent[bot] bf3510b949 Initial plan 2026-01-28 00:08:27 +00:00
jackj 435e9fd667 Fix: Shape mismatch in extend mode causing AssertionError
- Added automatic shape alignment for target_latents and x0
- Handles both shorter (padding) and longer (trimming) cases
- Fixes crash in extend mode with long audio files
- Minimal impact on audio quality (~0.05-0.15 sec)

Resolves issue where extend mode fails with AssertionError
when target_latents shape doesn't match x0 shape after
padding/trimming operations.
2026-01-23 23:15:42 +05:00
14 changed files with 1232 additions and 61 deletions
-1
View File
@@ -200,5 +200,4 @@ ui/components_demo.py
data_sampler_demo.py
pipeline_ace_step_demo.py
*.wav
start.sh
exps/*
+72 -1
View File
@@ -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
![Demo Interface](assets/demo_interface.png)
@@ -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
View File
@@ -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
```
![image](./assets/cpu_offload_performance.png)
- 📢 **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. 🎉
![image](https://github.com/user-attachments/assets/0a13d90a-9086-47ee-abab-976bad20fa7c)
- 🚀 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`.
## 🚀 Использование
![Demo Interface](assets/demo_interface.png)
### 🔍 Базовый запуск
```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}
}
```
+10
View File
@@ -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
+9 -3
View File
@@ -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")
+25 -8
View File
@@ -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
+5 -1
View File
@@ -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
+12 -5
View File
@@ -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(
+99 -14
View File
@@ -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,23 +117,24 @@ def main(checkpoint_path, bf16, torch_compile, cpu_offload, overlapped_decode, d
cpu_offload=cpu_offload,
overlapped_decode=overlapped_decode
)
print(model_demo)
if lyrics_file is not None:
with open(lyrics_file, "r", encoding="utf-8") as f:
lyrics = f.read()
if prompt is None:
# No prompt given: keep the original behaviour and use a random example.
data_sampler = DataSampler()
json_data = data_sampler.sample()
json_data = sample_data(json_data)
print(json_data)
(
audio_duration,
prompt,
lyrics,
sampled_lyrics,
infer_step,
guidance_scale,
sampled_guidance_scale,
scheduler_type,
cfg_type,
omega_scale,
sampled_cfg_type,
sampled_omega_scale,
manual_seeds,
guidance_interval,
guidance_interval_decay,
@@ -85,17 +145,42 @@ def main(checkpoint_path, bf16, torch_compile, cpu_offload, overlapped_decode, d
oss_steps,
guidance_scale_text,
guidance_scale_lyric,
) = json_data
) = 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
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,
+7
View File
@@ -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
View File
@@ -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
+14 -6
View File
@@ -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"),
},
)
+266
View File
@@ -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
Executable
+233
View File
@@ -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[@]}"