跳到主要内容

Audiocraft 音频生成

AudioCraft: MusicGen 文本转音乐, AudioGen 文本转声音。

技能元数据

来源内置(默认安装)
路径skills/mlops/models/audiocraft
版本1.0.0
作者Orchestra Research
许可证MIT
依赖项audiocraft, torch>=2.0.0, transformers>=4.30.0
平台linux, macos
标签多模态, 音频生成, 文本转音乐, 文本转音频, MusicGen
信息

以下是当此技能触发时,Hermes 加载的完整技能定义。这是技能激活时智能体看到的指令。

AudioCraft:音频生成

使用 Meta 的 AudioCraft 进行文本到音乐和文本到音频生成的综合指南,涵盖 MusicGen、AudioGen 和 EnCodec。

何时使用 AudioCraft

在以下情况下使用 AudioCraft:

  • 需要从文本描述生成音乐
  • 创建音效和环境音频
  • 构建音乐生成应用
  • 需要旋律条件的音乐生成
  • 想要立体声音频输出
  • 需要可控的音乐生成及风格迁移

主要功能:

  • MusicGen:带旋律条件的文本到音乐生成
  • AudioGen:文本到音效生成
  • EnCodec:高保真神经音频编解码器
  • 多种模型尺寸:从 Small (300M) 到 Large (3.3B)
  • 立体声支持:完整的立体声音频生成
  • 风格条件:MusicGen-Style 用于基于参考的生成

改用替代方案:

  • Stable Audio:用于更长的商业音乐生成
  • Bark:用于带音乐/音效的文本转语音
  • Riffusion:用于基于频谱图的音乐生成
  • OpenAI Jukebox:用于带歌词的原始音频生成

快速入门

安装

# 从 PyPI 安装
pip install audiocraft

# 从 GitHub 安装(最新版)
pip install git+https://github.com/facebookresearch/audiocraft.git

# 或使用 HuggingFace Transformers
pip install transformers torch torchaudio

基本文本到音乐(AudioCraft)

import torchaudio
from audiocraft.models import MusicGen

# 加载模型
model = MusicGen.get_pretrained('facebook/musicgen-small')

# 设置生成参数
model.set_generation_params(
duration=8, # 秒
top_k=250,
temperature=1.0
)

# 从文本生成
descriptions = ["happy upbeat electronic dance music with synths"]
wav = model.generate(descriptions)

# 保存音频
torchaudio.save("output.wav", wav[0].cpu(), sample_rate=32000)

使用 HuggingFace Transformers

from transformers import AutoProcessor, MusicgenForConditionalGeneration
import scipy

# 加载模型和处理器
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
model.to("cuda")

# 生成音乐
inputs = processor(
text=["80s pop track with bassy drums and synth"],
padding=True,
return_tensors="pt"
).to("cuda")

audio_values = model.generate(
**inputs,
do_sample=True,
guidance_scale=3,
max_new_tokens=256
)

# 保存
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("output.wav", rate=sampling_rate, data=audio_values[0, 0].cpu().numpy())

使用 AudioGen 进行文本到音效

from audiocraft.models import AudioGen

# 加载 AudioGen
model = AudioGen.get_pretrained('facebook/audiogen-medium')

model.set_generation_params(duration=5)

# 生成音效
descriptions = ["dog barking in a park with birds chirping"]
wav = model.generate(descriptions)

torchaudio.save("sound.wav", wav[0].cpu(), sample_rate=16000)

核心概念

架构概述

AudioCraft 架构:
┌──────────────────────────────────────────────────────────────┐
│ 文本编码器 (T5) │
│ │ │
│ 文本嵌入 │
└────────────────────────┬─────────────────────────────────────┘

┌────────────────────────▼─────────────────────────────────────┐
│ Transformer 解码器 (LM) │
│ 自回归生成音频令牌 │
│ 使用高效的令牌交织模式 │
└────────────────────────┬─────────────────────────────────────┘

┌────────────────────────▼─────────────────────────────────────┐
│ EnCodec 音频解码器 │
│ 将令牌转换回音频波形 │
└──────────────────────────────────────────────────────────────┘

模型变体

模型尺寸描述用例
musicgen-small300M文本到音乐快速生成
musicgen-medium1.5B文本到音乐平衡
musicgen-large3.3B文本到音乐最佳质量
musicgen-melody1.5B文本 + 旋律旋律条件
musicgen-melody-large3.3B文本 + 旋律最佳旋律
musicgen-stereo-*各异立体声输出立体声生成
musicgen-style1.5B风格迁移基于参考
audiogen-medium1.5B文本到音效音效

生成参数

参数默认值描述
duration8.0时长(秒)(1-120)
top_k250Top-k 采样
top_p0.0核采样(0 = 禁用)
temperature1.0采样温度
cfg_coef3.0无分类器引导

MusicGen 用法

文本到音乐生成

from audiocraft.models import MusicGen
import torchaudio

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

# 配置生成
model.set_generation_params(
duration=30, # 最长 30 秒
top_k=250, # 采样多样性
top_p=0.0, # 0 = 仅使用 top_k
temperature=1.0, # 创造性(越高越多样)
cfg_coef=3.0 # 文本遵循度(越高越严格)
)

# 生成多个样本
descriptions = [
"epic orchestral soundtrack with strings and brass",
"chill lo-fi hip hop beat with jazzy piano",
"energetic rock song with electric guitar"
]

# 生成(返回 [批次, 通道, 样本])
wav = model.generate(descriptions)

# 保存每个
for i, audio in enumerate(wav):
torchaudio.save(f"music_{i}.wav", audio.cpu(), sample_rate=32000)

旋律条件生成

from audiocraft.models import MusicGen
import torchaudio

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

# 加载旋律音频
melody, sr = torchaudio.load("melody.wav")

# 使用旋律条件生成
descriptions = ["acoustic guitar folk song"]
wav = model.generate_with_chroma(descriptions, melody, sr)

torchaudio.save("melody_conditioned.wav", wav[0].cpu(), sample_rate=32000)

立体声生成

from audiocraft.models import MusicGen

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

descriptions = ["ambient electronic music with wide stereo panning"]
wav = model.generate(descriptions)

# wav 形状:[批次, 2, 样本] 用于立体声
print(f"立体声形状: {wav.shape}") # [1, 2, 480000]
torchaudio.save("stereo.wav", wav[0].cpu(), sample_rate=32000)

音频续写

from transformers import AutoProcessor, MusicgenForConditionalGeneration

processor = AutoProcessor.from_pretrained("facebook/musicgen-medium")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-medium")

# 加载要续写的音频
import torchaudio
audio, sr = torchaudio.load("intro.wav")

# 使用文本和音频进行处理
inputs = processor(
audio=audio.squeeze().numpy(),
sampling_rate=sr,
text=["continue with a epic chorus"],
padding=True,
return_tensors="pt"
)

# 生成续写部分
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=512)

MusicGen-Style 用法

风格条件生成

from audiocraft.models import MusicGen

# 加载风格模型
model = MusicGen.get_pretrained('facebook/musicgen-style')

# 配置带风格的生成
model.set_generation_params(
duration=30,
cfg_coef=3.0,
cfg_coef_beta=5.0 # 风格影响力
)

# 配置风格条件器
model.set_style_conditioner_params(
eval_q=3, # RVQ 量化器(1-6)
excerpt_length=3.0 # 风格摘录时长
)

# 加载风格参考
style_audio, sr = torchaudio.load("reference_style.wav")

# 使用文本 + 风格生成
descriptions = ["upbeat dance track"]
wav = model.generate_with_style(descriptions, style_audio, sr)

仅风格生成(无文本)

# 在没有文本提示的情况下生成匹配风格
model.set_generation_params(
duration=30,
cfg_coef=3.0,
cfg_coef_beta=None # 禁用双无分类器引导,仅用于纯风格
)

wav = model.generate_with_style([None], style_audio, sr)

AudioGen 用法

音效生成

from audiocraft.models import AudioGen
import torchaudio

model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=10)

# 生成各种声音
descriptions = [
"thunderstorm with heavy rain and lightning",
"busy city traffic with car horns",
"ocean waves crashing on rocks",
"crackling campfire in forest"
]

wav = model.generate(descriptions)

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

EnCodec 使用

音频压缩

from audiocraft.models import CompressionModel
import torch
import torchaudio

# 加载 EnCodec
model = CompressionModel.get_pretrained('facebook/encodec_32khz')

# 加载音频
wav, sr = torchaudio.load("audio.wav")

# 确保正确的采样率
if sr != 32000:
resampler = torchaudio.transforms.Resample(sr, 32000)
wav = resampler(wav)

# 编码为 tokens
with torch.no_grad():
encoded = model.encode(wav.unsqueeze(0))
codes = encoded[0] # 音频编码

# 解码回音频
with torch.no_grad():
decoded = model.decode(codes)

torchaudio.save("reconstructed.wav", decoded[0].cpu(), sample_rate=32000)

常见工作流程

工作流程 1:音乐生成流水线

import torch
import torchaudio
from audiocraft.models import MusicGen

class MusicGenerator:
def __init__(self, model_name="facebook/musicgen-medium"):
self.model = MusicGen.get_pretrained(model_name)
self.sample_rate = 32000

def generate(self, prompt, duration=30, temperature=1.0, cfg=3.0):
self.model.set_generation_params(
duration=duration,
top_k=250,
temperature=temperature,
cfg_coef=cfg
)

with torch.no_grad():
wav = self.model.generate([prompt])

return wav[0].cpu()

def generate_batch(self, prompts, duration=30):
self.model.set_generation_params(duration=duration)

with torch.no_grad():
wav = self.model.generate(prompts)

return wav.cpu()

def save(self, audio, path):
torchaudio.save(path, audio, sample_rate=self.sample_rate)

# 使用示例
generator = MusicGenerator()
audio = generator.generate(
"史诗般的电影管弦乐",
duration=30,
temperature=1.0
)
generator.save(audio, "epic_music.wav")

工作流程 2:声音设计批量处理

import json
from pathlib import Path
from audiocraft.models import AudioGen
import torchaudio

def batch_generate_sounds(sound_specs, output_dir):
"""
根据规格描述批量生成声音。

Args:
sound_specs: 包含 {"name": str, "description": str, "duration": float} 的列表
output_dir: 输出目录路径
"""
model = AudioGen.get_pretrained('facebook/audiogen-medium')
output_dir = Path(output_dir)
output_dir.mkdir(exist_ok=True)

results = []

for spec in sound_specs:
model.set_generation_params(duration=spec.get("duration", 5))

wav = model.generate([spec["description"]])

output_path = output_dir / f"{spec['name']}.wav"
torchaudio.save(str(output_path), wav[0].cpu(), sample_rate=16000)

results.append({
"name": spec["name"],
"path": str(output_path),
"description": spec["description"]
})

return results

# 使用示例
sounds = [
{"name": "explosion", "description": "带有碎片的巨大爆炸", "duration": 3},
{"name": "footsteps", "description": "在木地板上的脚步声", "duration": 5},
{"name": "door", "description": "木门吱呀作响并关闭", "duration": 2}
]

results = batch_generate_sounds(sounds, "sound_effects/")

工作流程 3:Gradio 演示

import gradio as gr
import torch
import torchaudio
from audiocraft.models import MusicGen

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

def generate_music(prompt, duration, temperature, cfg_coef):
model.set_generation_params(
duration=duration,
temperature=temperature,
cfg_coef=cfg_coef
)

with torch.no_grad():
wav = model.generate([prompt])

# 保存到临时文件
path = "temp_output.wav"
torchaudio.save(path, wav[0].cpu(), sample_rate=32000)
return path

demo = gr.Interface(
fn=generate_music,
inputs=[
gr.Textbox(label="音乐描述", placeholder="欢快的电子舞曲"),
gr.Slider(1, 30, value=8, label="时长(秒)"),
gr.Slider(0.5, 2.0, value=1.0, label="温度"),
gr.Slider(1.0, 10.0, value=3.0, label="CFG 系数")
],
outputs=gr.Audio(label="生成的音乐"),
title="MusicGen 演示"
)

demo.launch()

性能优化

内存优化

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

# 在生成过程之间清空缓存
torch.cuda.empty_cache()

# 生成更短的时长
model.set_generation_params(duration=10) # 而不是 30

# 使用半精度
model = model.half()

批处理效率

# 一次处理多个提示词(效率更高)
descriptions = ["提示词1", "提示词2", "提示词3", "提示词4"]
wav = model.generate(descriptions) # 单批次

# 而不是
for desc in descriptions:
wav = model.generate([desc]) # 多批次(更慢)

GPU 显存要求

模型FP32 显存FP16 显存
musicgen-small~4GB~2GB
musicgen-medium~8GB~4GB
musicgen-large~16GB~8GB

常见问题

问题解决方案
CUDA 内存溢出使用更小的模型,减少时长
质量差增加 cfg_coef,使用更好的提示词
生成太短检查最大时长设置
音频伪影尝试不同的温度
立体声不工作使用立体声模型变体

参考资料

资源