Merge branch 'main' into sayo_dev

This commit is contained in:
Sayo
2025-05-08 12:54:44 +08:00
3 changed files with 104 additions and 59 deletions
+3 -18
View File
@@ -244,27 +244,10 @@ If you intend to integrate ACE-Step as a library into your own Python projects,
1. **Ensure Git is installed:** This method requires Git to be installed on your system and accessible in your system's PATH.
2. **Execute the installation command:**
```bash
pip install git+[https://github.com/ace-step/ACE-Step.git](https://github.com/ace-step/ACE-Step.git)
pip install git+https://github.com/ace-step/ACE-Step.git
```
It's recommended to use this command within a virtual environment to avoid conflicts with other packages.
Once the installation is complete, you can import and use the ACE-Step API as shown below:
```python
from acestep.api import ACEStep
model = ACEStep()
audio_out = model.infer(
prompt="upbeat pop, catchy melody, female singer",
lyrics="[verse]\nSun is shining bright today\nFeeling happy, come what may",
audio_duration=5.0, # 5 seconds
infer_step=20 # Fewer steps for speed
)
audio_out.save_wav("output.wav")
```
#### 🛠️ Command Line Arguments
- `--checkpoint_path`: Path to the model checkpoint (default: downloads automatically)
@@ -337,6 +320,7 @@ The `examples/input_params` directory contains sample input parameters that can
3. Prepare your dataset in Huggingface format ([Huggingface Datasets documentation](https://huggingface.co/docs/datasets/index)). The dataset should contain the following fields:
- `keys`: Unique identifier for each audio sample
- `filename`: Path to the audio file
- `tags`: List of descriptive tags (e.g., `["pop", "rock"]`)
- `norm_lyrics`: Normalized lyrics text
- Optional fields:
@@ -347,6 +331,7 @@ Example dataset entry:
```json
{
"keys": "1ce52937-cd1d-456f-967d-0f1072fcbb58",
"filename": "data/audio/1ce52937-cd1d-456f-967d-0f1072fcbb58.wav",
"tags": ["pop", "acoustic", "ballad", "romantic", "emotional"],
"speaker_emb_path": "",
"norm_lyrics": "I love you, I love you, I love you",
+23 -28
View File
@@ -100,7 +100,8 @@ class ACEStepPipeline:
):
if not checkpoint_dir:
if persistent_storage_path is None:
checkpoint_dir = os.path.join(os.path.dirname(__file__), "checkpoints")
checkpoint_dir = os.path.join(os.path.expanduser("~"), ".cache/ace-step/checkpoints")
os.makedirs(checkpoint_dir, exist_ok=True)
else:
checkpoint_dir = os.path.join(persistent_storage_path, "checkpoints")
ensure_directory_exists(checkpoint_dir)
@@ -167,15 +168,13 @@ class ACEStepPipeline:
repo_id=REPO_ID,
subfolder="music_dcae_f8c8",
filename="config.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="music_dcae_f8c8",
filename="diffusion_pytorch_model.safetensors",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
# download vocoder model
@@ -184,15 +183,13 @@ class ACEStepPipeline:
repo_id=REPO_ID,
subfolder="music_vocoder",
filename="config.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="music_vocoder",
filename="diffusion_pytorch_model.safetensors",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
# download ace_step transformer model
@@ -201,15 +198,13 @@ class ACEStepPipeline:
repo_id=REPO_ID,
subfolder="ace_step_transformer",
filename="config.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="ace_step_transformer",
filename="diffusion_pytorch_model.safetensors",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
# download text encoder model
@@ -218,36 +213,31 @@ class ACEStepPipeline:
repo_id=REPO_ID,
subfolder="umt5-base",
filename="config.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="umt5-base",
filename="model.safetensors",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
cache_dir=checkpoint_dir,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="umt5-base",
filename="special_tokens_map.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="umt5-base",
filename="tokenizer_config.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
)
hf_hub_download(
repo_id=REPO_ID,
subfolder="umt5-base",
filename="tokenizer.json",
local_dir=checkpoint_dir,
local_dir_use_symlinks=False,
)
logger.info("Models downloaded")
@@ -1339,8 +1329,8 @@ class ACEStepPipeline:
pred_wavs = [pred_wav.cpu().float() for pred_wav in pred_wavs]
for i in tqdm(range(bs)):
output_audio_path = self.save_wav_file(
pred_wavs[i], i, sample_rate=sample_rate
)
pred_wavs[i], i, save_path=save_path, sample_rate=sample_rate, format=format
)
output_audio_paths.append(output_audio_path)
return output_audio_paths
@@ -1351,14 +1341,19 @@ class ACEStepPipeline:
logger.warning("save_path is None, using default path ./outputs/")
base_path = f"./outputs"
ensure_directory_exists(base_path)
output_path_wav = (
f"{base_path}/output_{time.strftime('%Y%m%d%H%M%S')}_{idx}.wav"
)
else:
base_path = save_path
ensure_directory_exists(base_path)
output_path_wav = (
f"{base_path}/output_{time.strftime('%Y%m%d%H%M%S')}_{idx}.wav"
)
ensure_directory_exists(os.path.dirname(save_path))
if os.path.isdir(save_path):
logger.info(f"Provided save_path '{save_path}' is a directory. Appending timestamped filename.")
output_path_wav = os.path.join(save_path, f"output_{time.strftime('%Y%m%d%H%M%S')}_{idx}.wav")
else:
output_path_wav = save_path
target_wav = target_wav.float()
logger.info(f"Saving audio to {output_path_wav}")
torchaudio.save(
output_path_wav, target_wav, sample_rate=sample_rate, format=format
)
+78 -13
View File
@@ -4,9 +4,7 @@
"metadata": {
"colab": {
"provenance": [],
"machine_shape": "hm",
"gpuType": "L4",
"authorship_tag": "ABX9TyMkPvEHcvZ84lF6ESOuPfMJ",
"gpuType": "T4",
"include_colab_link": true
},
"kernelspec": {
@@ -26,9 +24,54 @@
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/github/usamireko/ACE-Step/blob/main/inference.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
"<a href=\"https://colab.research.google.com/github/TheNeodev/ACE-Step/blob/main/inference.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# ACE-Step Inference\n",
"\n",
"\n",
"<p align=\"center\">\n",
" <img src=\"https://raw.githubusercontent.com/ace-step/ACE-Step/refs/heads/main/assets/orgnization_logos.png\" width=\"100%\" alt=\"StepFun Logo\">\n",
"</p>\n",
"\n",
" A Step Towards Music Generation Foundation Model\n",
"\n",
"\n",
"\n",
"## Credits:\n",
"\n",
"* Ace-Step by [Ace-Step](https://github.com/ace-step/ACE-Step)\n",
"\n",
"* Colab improvement by [NeoDev](https://github.com/TheNeodev)"
],
"metadata": {
"id": "w4sQAC7AB5GV"
}
},
{
"cell_type": "markdown",
"source": [
"**🖥️ Hardware Performance**\n",
"\n",
"We have evaluated ACE-Step across different hardware setups, yielding the following throughput results:\n",
"\n",
"| Device | RTF (27 steps) | Time to render 1 min audio (27 steps) | RTF (60 steps) | Time to render 1 min audio (60 steps) |\n",
"| --------------- | -------------- | ------------------------------------- | -------------- | ------------------------------------- |\n",
"| NVIDIA RTX 4090 | 34.48 × | 1.74 s | 15.63 × | 3.84 s |\n",
"| NVIDIA A100 | 27.27 × | 2.20 s | 12.27 × | 4.89 s |\n",
"| NVIDIA RTX 3090 | 12.76 × | 4.70 s | 6.48 × | 9.26 s |\n",
"| MacBook M2 Max | 2.27 × | 26.43 s | 1.03 × | 58.25 s |\n",
"\n",
"\n",
"We use RTF (Real-Time Factor) to measure the performance of ACE-Step. Higher values indicate faster generation speed. 27.27x means to generate 1 minute of music, it takes 2.2 seconds (60/27.27). The performance is measured on a single GPU with batch size 1 and 27 steps."
],
"metadata": {
"id": "pXuz4oKlDFk_"
}
},
{
"cell_type": "code",
"execution_count": null,
@@ -39,17 +82,37 @@
"outputs": [],
"source": [
"#@title Install and Download\n",
"!wget -O /content/mini.sh https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-x86_64.sh\n",
"!chmod +x /content/mini.sh\n",
"!bash /content/mini.sh -b -f -p /usr/local\n",
"!conda install -q -y jupyter\n",
"!conda install -q -y google-colab -c conda-forge\n",
"!python -m ipykernel install --name \"py310\" --user\n",
"\n",
"\n",
"import codecs\n",
"\n",
"\n",
"\n",
"print(\"Installing...\")\n",
"!sudo apt update > /dev/null 2>&1\n",
"!sudo apt install python3.10 > /dev/null 2>&1\n",
"!sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 > /dev/null 2>&1\n",
"!sudo update-alternatives --set python3 /usr/bin/python3.10 > /dev/null 2>&1\n",
"!curl -sS https://bootstrap.pypa.io/get-pip.py | python3 > /dev/null 2>&1\n",
"import sys\n",
"sys.path.append('/usr/local/lib/python3.10/dist-packages')\n",
"\n",
"\n",
"repopath = codecs.decode('erdhverzragf.gkg', 'rot_13')\n",
"\n",
"\n",
"!git clone https://github.com/usamireko/ACE-Step\n",
"%cd /content/ACE-Step\n",
"!pip install -r requirements.txt\n",
"!pip install huggingface-hub numpy==1.26.0\n",
"!huggingface-cli download ACE-Step/ACE-Step-v1-3.5B --local-dir /content/ACE-Step/checkpoints --local-dir-use-symlinks False"
"\n",
"\n",
"!pip install uv pyngrok > /dev/null 2>&1\n",
"!uv pip install -r {repopath} > /dev/null 2>&1\n",
"!uv pip install huggingface-hub numpy==1.26.0 > /dev/null 2>&1\n",
"!huggingface-cli download ACE-Step/ACE-Step-v1-3.5B --local-dir /content/ACE-Step/checkpoints --local-dir-use-symlinks False\n",
"\n",
"\n",
"import os\n",
"os.environ['MPLBACKEND'] = 'agg'"
]
},
{
@@ -58,6 +121,8 @@
"#@title Run Gradio UI\n",
"bf16 = True # @param {\"type\":\"boolean\"}\n",
"\n",
"\n",
"print(\" * Running UI...\")\n",
"!python app.py --checkpoint_path ./checkpoints/ --port 7865 --device_id 0 --share true --bf16 {bf16}"
],
"metadata": {