> For the complete documentation index, see [llms.txt](https://docs.clore.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.clore.ai/guides/guides_v2-zh/yin-pin-yu-yu-yin/audiocraft-music.md).

# AudioCraft 音乐

在 Clore.ai 上使用 Meta 的 AudioCraft 生成音乐和音频

使用 Meta 的 AudioCraft（MusicGen）生成音乐和音频。

{% hint style="success" %}
所有示例都可以在通过以下方式租用的 GPU 服务器上运行 [CLORE.AI 市场](https://clore.ai/marketplace).
{% endhint %}

## 在 CLORE.AI 上租用

1. 访问 [CLORE.AI 市场](https://clore.ai/marketplace)
2. 按 GPU 类型、VRAM 和价格筛选
3. 选择 **按需** （固定费率）或 **竞价** （出价）
4. 配置你的订单：
   * 选择 Docker 镜像
   * 设置端口（SSH 用 TCP，Web UI 用 HTTP）
   * 如有需要，添加环境变量
   * 输入启动命令
5. 选择支付方式： **CLORE**, **BTC**，或 **USDT/USDC**
6. 创建订单并等待部署

### 访问你的服务器

* 在以下位置查找连接信息 **我的订单**
* Web 界面：使用 HTTP 端口 URL
* SSH： `ssh -p <port> root@<proxy-address>`

## 什么是 AudioCraft？

AudioCraft 包括：

* **MusicGen** - 文本生成音乐
* **AudioGen** - 音效生成
* **EnCodec** - 音频压缩
* **MAGNeT** - 更快的生成

## 模型大小

| 模型 | 显存   | 质量      | 速度 |
| -- | ---- | ------- | -- |
| 小型 | 4GB  | 好       | 快  |
| 中型 | 8GB  | 很高      | 中等 |
| 大型 | 16GB | 最佳      | 慢  |
| 旋律 | 8GB  | 优秀 + 旋律 | 中等 |

## 快速部署

**Docker 镜像：**

```
pytorch/pytorch:2.11.0-cuda12.8-cudnn9-devel
```

**端口：**

```
22/tcp
7860/http
```

**命令：**

```bash
pip install audiocraft gradio scipy && \\
python -c "
import gradio as gr
from audiocraft.models import MusicGen
import scipy.io.wavfile as wav
import tempfile

model = MusicGen.get_pretrained('facebook/musicgen-medium')
model.set_generation_params(duration=10)

def generate(prompt, duration):
    model.set_generation_params(duration=duration)
    output = model.generate([prompt])
    audio = output[0].cpu().numpy().T
    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as f:
        wav.write(f.name, 32000, audio)
        return f.name

demo = gr.Interface(
    fn=generate,
    inputs=[gr.Textbox(label='提示'), gr.Slider(5, 30, value=10, label='时长（秒）')],
    outputs=gr.Audio(label='生成的音乐'),
    title='MusicGen'
)
demo.launch(server_name='0.0.0.0', server_port=7860)
"
```

## 访问你的服务

部署后，找到你的 `http_pub` URL 在 **我的订单**:

1. 前往 **我的订单** 页面
2. 点击你的订单
3. 找到 `http_pub` URL（例如， `abc123.clorecloud.net`)

使用 `https://YOUR_HTTP_PUB_URL` 替代 `localhost` 在下面的示例中。

## 安装

```bash
pip install audiocraft
pip install scipy torchaudio
```

## MusicGen：文本生成音乐

### 基础生成

```python
from audiocraft.models import MusicGen
import torchaudio

# 加载模型
model = MusicGen.get_pretrained('facebook/musicgen-medium')
model.set_generation_params(duration=15)  # 秒

# 生成
prompt = "充满活力的电子舞曲，重低音"
output = model.generate([prompt])

# 保存
audio = output[0].cpu()
torchaudio.save("music.wav", audio, sample_rate=32000)
```

### 多个提示词

```python
prompts = [
    "放松的钢琴爵士",
    "史诗般的管弦乐电影感",
    "原声吉他民谣",
    "激烈的重金属"
]

outputs = model.generate(prompts)

for i, output in enumerate(outputs):
    torchaudio.save(f"music_{i}.wav", output.cpu(), sample_rate=32000)
```

### 旋律条件控制

使用旋律作为参考：

```python
from audiocraft.models import MusicGen
import torchaudio

# 加载旋律模型
model = MusicGen.get_pretrained('facebook/musicgen-melody')
model.set_generation_params(duration=15)

# 加载参考旋律
melody, sr = torchaudio.load("reference.wav")
melody = melody.unsqueeze(0).cuda()

# 根据旋律生成
output = model.generate_with_chroma(
    ["爵士钢琴版本"],
    melody,
    sr
)

torchaudio.save("jazz_version.wav", output[0].cpu(), sample_rate=32000)
```

### 续写

从现有音频继续：

```python

# 加载要继续的音频
audio, sr = torchaudio.load("start.wav")
audio = audio.unsqueeze(0).cuda()

# 继续
output = model.generate_continuation(
    audio,
    prompt_sample_rate=sr,
    descriptions=["加入鼓点，能量更强"],
    progress=True
)

torchaudio.save("continued.wav", output[0].cpu(), sample_rate=32000)
```

## AudioGen：音效

```python
from audiocraft.models import AudioGen

# 加载模型
model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=5)

# 生成声音
prompts = [
    "远处狗叫，",
    "雨滴敲打窗户，",
    "汽车发动，",
    "演唱会上的人群欢呼"
]

outputs = model.generate(prompts)

for i, output in enumerate(outputs):
    torchaudio.save(f"sound_{i}.wav", output.cpu(), sample_rate=16000)
```

## 生成参数

```python
model.set_generation_params(
    duration=30,           # 长度（秒）
    top_k=250,             # Top-k 采样
    top_p=0.0,             # 核采样（0 = 禁用）
    temperature=1.0,       # 随机性
    cfg_coef=3.0,          # 无分类器引导
    two_step_cfg=False,    # 两步 CFG
)
```

### 参数效果

| 参数          | 低值   | 高值      |
| ----------- | ---- | ------- |
| temperature | 保守   | 创意      |
| top\_k      | 更集中  | 更多样     |
| cfg\_coef   | 宽松理解 | 严格遵循提示词 |

## 批量处理

```python
from audiocraft.models import MusicGen
import torchaudio
import os

model = MusicGen.get_pretrained('facebook/musicgen-medium')
model.set_generation_params(duration=15)

prompts = [
    {"name": "intro", "prompt": "神秘的氛围感前奏，逐渐铺陈"},
    {"name": "verse", "prompt": "轻松的 lo-fi 说唱节拍"},
    {"name": "chorus", "prompt": "充满活力的电子流行副歌"},
    {"name": "outro", "prompt": "平静的钢琴淡出"},
]

output_dir = "./music_parts"
os.makedirs(output_dir, exist_ok=True)

for item in prompts:
    output = model.generate([item["prompt"]])
    torchaudio.save(
        os.path.join(output_dir, f"{item['name']}.wav"),
        output[0].cpu(),
        sample_rate=32000
    )
    print(f"已生成：{item['name']}")
```

## 流式生成

```python
from audiocraft.models import MusicGen
import torch

model = MusicGen.get_pretrained('facebook/musicgen-small')

# 启用流式输出
streamer = model.get_streaming_generator(
    "欢快的流行音乐",
    max_gen_len=256  # 令牌
)

all_tokens = []
for tokens in streamer:
    all_tokens.append(tokens)
    # 处理分块...

# 全部解码
audio = model.decode(torch.cat(all_tokens, dim=-1))
```

## 立体声生成

```python
from audiocraft.models import MusicGen

# 加载立体声模型
model = MusicGen.get_pretrained('facebook/musicgen-stereo-medium')
model.set_generation_params(duration=15)

output = model.generate(["电影感管弦乐配乐"])

# 输出形状：立体声为 [batch, 2, samples]

torchaudio.save("stereo_music.wav", output[0].cpu(), sample_rate=32000)
```

## API 服务器

```python
from fastapi import FastAPI
from fastapi.responses import FileResponse
from audiocraft.models import MusicGen
import torchaudio
import tempfile

app = FastAPI()
model = MusicGen.get_pretrained('facebook/musicgen-medium')

@app.post("/generate")
async def generate_music(prompt: str, duration: int = 10):
    model.set_generation_params(duration=duration)
    output = model.generate([prompt])

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        torchaudio.save(f.name, output[0].cpu(), sample_rate=32000)
        return FileResponse(f.name, media_type="audio/wav")

@app.post("/generate_with_melody")
async def generate_with_melody(prompt: str, melody_path: str, duration: int = 15):
    melody, sr = torchaudio.load(melody_path)

    model_melody = MusicGen.get_pretrained('facebook/musicgen-melody')
    model_melody.set_generation_params(duration=duration)

    output = model_melody.generate_with_chroma([prompt], melody.unsqueeze(0).cuda(), sr)

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as f:
        torchaudio.save(f.name, output[0].cpu(), sample_rate=32000)
        return FileResponse(f.name, media_type="audio/wav")

# 运行：uvicorn server:app --host 0.0.0.0 --port 8000
```

## 提示词工程

### 有效提示词

```python

# 风格 + 乐器 + 情绪
"欢快的爵士，带萨克斯和钢琴，快乐而有活力"

# 风格参考
"lo-fi hip hop 节拍，适合学习的轻松音乐，黑胶噼啪声"

# 电影感
"史诗般的管弦乐预告片音乐，逐渐营造紧张感，戏剧化"

# 具体元素
"原声吉他的扫弦节奏，民谣歌曲，篝火氛围"
```

### 糟糕的提示词

```python

# 太模糊
"好听的音乐"  # 不够具体

# 歌词
"祝你生日快乐..."  # 不会起作用

# 艺术家名称
"像披头士那样"  # 不理解艺术家
```

## 后处理

### 合并片段

```python
from pydub import AudioSegment

intro = AudioSegment.from_wav("intro.wav")
verse = AudioSegment.from_wav("verse.wav")
chorus = AudioSegment.from_wav("chorus.wav")

# 交叉淡入淡出
song = intro.append(verse, crossfade=1000)
song = song.append(chorus, crossfade=1000)

song.export("full_song.mp3", format="mp3")
```

### 添加效果

```python
from pydub import AudioSegment
from pydub.effects import normalize, compress_dynamic_range

audio = AudioSegment.from_wav("generated.wav")

# 归一化音量
audio = normalize(audio)

# 添加压缩
audio = compress_dynamic_range(audio)

# 淡入/淡出
audio = audio.fade_in(2000).fade_out(3000)

audio.export("processed.wav", format="wav")
```

## 内存优化

```python
import torch
from audiocraft.models import MusicGen

# 使用更小的模型
model = MusicGen.get_pretrained('facebook/musicgen-small')

# 启用 CPU 卸载
model.to('cpu')

# 在 GPU 上生成，立即卸载
with torch.cuda.amp.autocast():
    output = model.generate(["提示词"])
    output = output.cpu()
    torch.cuda.empty_cache()
```

## 性能

| 模型 | GPU      | 30秒生成  |
| -- | -------- | ------ |
| 小型 | RTX 3090 | \~10 秒 |
| 中型 | RTX 3090 | \~25 秒 |
| 大型 | RTX 4090 | \~45秒  |
| 旋律 | RTX 3090 | \~30 秒 |

## 对比

| 功能   | MusicGen | Stable Audio | Riffusion |
| ---- | -------- | ------------ | --------- |
| 质量   | 很高       | 很高           | 好         |
| 时长   | 30秒      | 90秒          | 循环        |
| 旋律输入 | 是        | 否            | 否         |
| 开源   | 是        | 否            | 是         |

## 故障排查

### 内存不足

* 使用更小的模型（small 而不是 large）
* 缩短时长
* 清除缓存： `torch.cuda.empty_cache()`

### 质量较差

* 使用更具体的提示词
* 尝试 medium 或 large 模型
* 调整 temperature（0.8-1.2）

### 重复输出

* 提高 top\_k
* 降低 cfg\_coef
* 尝试不同的提示词

## 成本估算

CLORE.AI 市场常见费率（截至 2024 年）：

| GPU       | 小时费率    | 日费率     | 4 小时会话  |
| --------- | ------- | ------- | ------- |
| RTX 3060  | \~$0.03 | \~$0.70 | \~$0.12 |
| RTX 3090  | \~$0.06 | \~$1.50 | \~$0.25 |
| RTX 4090  | \~$0.10 | \~$2.30 | \~$0.40 |
| A100 40GB | \~$0.17 | \~$4.00 | \~$0.70 |
| A100 80GB | \~$0.25 | \~$6.00 | \~$1.00 |

*价格因提供商和需求而异。请查看* [*CLORE.AI 市场*](https://clore.ai/marketplace) *以获取当前费率。*

**节省费用：**

* 使用 **竞价** 可中断工作市场——约三分之一的服务器将现货价格定得低于按需价格（中位数约优惠 13%），其余则与按需价格持平
* 使用 **CLORE** 代币支付
* 比较不同提供商的价格

## 下一步

* [Bark TTS](/guides/guides_v2-zh/yin-pin-yu-yu-yin/bark-tts.md) - 语音生成
* [RVC 变声克隆](/guides/guides_v2-zh/yin-pin-yu-yu-yin/rvc-voice-clone.md) - 语音转换
* [Demucs 分离](/guides/guides_v2-zh/yin-pin-yu-yu-yin/demucs-separation.md) - 音频分离


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.clore.ai/guides/guides_v2-zh/yin-pin-yu-yu-yin/audiocraft-music.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
