欢迎回来

登录 EAKE AI,继续您的智能之旅

忘记密码?
还没有账号?立即注册

AudioCraft 音频生成

2026-05-20 · Skills中心

AudioCraft 音频生成

AudioCraft:MusicGen 文生音乐、AudioGen 文生音效

AudioCraft 音频生成完整指南

Meta 的 AudioCraft 指南,涵盖 MusicGen 文生音乐、AudioGen 文生音效和 EnCodec 神经音频编解码器。

使用场景

需要以下场景时使用 AudioCraft:

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

主要特点:

  • MusicGen:文本转音乐,支持旋律条件控制
  • AudioGen:文本转音效生成
  • EnCodec:高保真神经音频编解码器
  • 多种模型规格:从 300M 小模型到 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

基础文本转音乐


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
)

# 生成
description = ["retro funk, upbeat, drums and synth bass, 100 BPM"]
wav = model.generate(description)

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

立体声生成


# 生成立体声音乐
model = MusicGen.get_pretrained('facebook/musicgen-stereo-large')

# 可以通过描述指定风格
wav = model.generate(
    ["sad piano melody, minor key, cinematic"],
    progress=True
)

# 保存为立体声 WAV
torchaudio.save("stereo_music.wav", wav[0].cpu(), sample_rate=32000)

旋律条件控制


# 用参考旋律控制生成
melody, sr = torchaudio.load("reference_melody.wav")
melody = torchaudio.functional.resample(melody, sr, model.sample_rate)

# 基于旋律生成
conditioned = model.generate(
    descriptions=["upbeat dance track"],
    melody_wavs=melody,
    progress=True
)

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

AudioGen 文生音效


from audiocraft.models import AudioGen

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

model.set_generation_params(duration=5)

# 生成音效
descriptions = ["sword clash sound, metallic", "footsteps on wooden floor"]
wav = model.generate(descriptions)

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

核心概念

模型系列

模型参数量用途生成时长
MusicGen-Small300M快速原型最长 30 秒
MusicGen-Medium1.5B平衡质量/速度最长 30 秒
MusicGen-Large3.3B最高质量最长 30 秒
AudioGen600M-1B音效生成最长 10 秒

EnCodec 编解码器

EnCodec 用于压缩和解压缩音频,比传统编解码器(如 MP3、Opus)更高的质量。


from audiocraft.modules import AudioEncoder

# 加载编码器
encoder = AudioEncoder.get_encoder('facebook/encodec_32khz')

# 编码音频
audio = load_audio("input.wav")
codes = encoder.encode(audio)

# 解码
decoded = encoder.decode(codes)

EnCodec 音频编解码

音频压缩


import torch
from audiocraft.modules import AudioEncoder

encoder = AudioEncoder.get_encoder('facebook/encodec_24khz')

# 编码
audio, sr = torchaudio.load("music.wav")
codes = encoder.encode(audio)

# 量化比特流
quantized = encoder.quantize(codes)
compressed_size = quantized.numel() * quantized.element_size()

# 解码还原
decoded_audio = encoder.decode(encoder.dequantize(quantized))

常见工作流

工作流 1:音乐应用


import streamlit as st
from audiocraft.models import MusicGen

@st.cache_resource
def load_model():
    return MusicGen.get_pretrained('facebook/musicgen-small')

model = load_model()

prompt = st.text_input("描述你想要生成的音乐:")
if st.button("生成"):
    with st.spinner("生成中..."):
        model.set_generation_params(duration=8)
        wav = model.generate([prompt])
        st.audio(wav[0, 0].cpu().numpy(), sample_rate=32000)

工作流 2:音效库生成


from audiocraft.models import AudioGen
import os

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

sfx_descriptions = [
    "explosion, deep boom",
    "rain on window",
    "keyboard typing fast",
    "door creaking open"
]

for i, desc in enumerate(sfx_descriptions):
    wav = model.generate([desc])
    torchaudio.save(f"sfx_{i:03d}.wav", wav[0, 0].cpu(), sample_rate=32000)

print(f"生成了 {len(sfx_descriptions)} 个音效")

工作流 3:批处理


from audiocraft.models import MusicGen
from tqdm import tqdm

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

prompts = [
    "jazz, saxophone solo, relaxed",
    "electronic, synth pad, upbeat",
    "classical, piano, melancholic"
]

for i, prompt in enumerate(prompts):
    print(f"生成中: {prompt}")
    model.set_generation_params(duration=10)
    wav = model.generate([prompt])
    torchaudio.save(f"batch_{i}.wav", wav[0, 0].cpu(), sample_rate=32000)

高级用法

混合条件生成


# 多个条件组合
wav = model.generate(
    descriptions=[
        "rock song, electric guitar, drums"
    ],
    melody_wavs=melody,  # 旋律条件
    descriptions=[style_prompt]  # 风格文本
)

温度和采样控制


# 高随机性(创意)
model.set_generation_params(temperature=1.5, top_k=500)

# 低随机性(确定性)
model.set_generation_params(temperature=0.1, top_k=50)

自定义模型权重


# 加载自定义微调的 MusicGen
model = MusicGen.get_pretrained('path/to/custom_musicgen')
model.set_generation_params(duration=15)
wav = model.generate(["custom style music"])

Gradio 演示


import gradio as gr
from audiocraft.models import MusicGen

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

def generate_music(prompt, duration):
    model.set_generation_params(duration=duration)
    wav = model.generate([prompt])
    return wav[0, 0].cpu().numpy(), model.sample_rate

demo = gr.Interface(
    fn=generate_music,
    inputs=["text", gr.Slider(1, 30, value=8)],
    outputs=gr.Audio(label="Generated Music"),
    title="MusicGen 音乐生成器"
)
demo.launch()

性能优化

GPU 加速


import torch
# 确保使用 CUDA
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = model.to(device)

内存优化


# 使用小模型减少内存占用
model = MusicGen.get_pretrained('facebook/musicgen-small')

# 批量处理
batches = [prompts[i:i+2] for i in range(0, len(prompts), 2)]
for batch in batches:
    wavs = model.generate(batch)

常见问题

MusicGen-Style3.3B风格迁移最长 30 秒
问题解决方案
CUDA OOM使用小模型(musicgen-small),缩短时长
生成的音乐质量差丰富描述文本,加入乐器名称和风格
旋律条件不生效确保旋律采样率与模型采样率一致(32kHz)
生成慢使用 GPU 加速,检查批大小

资源链接

  • GitHub: https://github.com/facebookresearch/audiocraft
  • 论文: https://arxiv.org/abs/2307.12574
  • HuggingFace: https://huggingface.co/facebook/musicgen-small
  • 在线演示: https://huggingface.co/spaces/facebook/MusicGen

评论区

发表评论


音频有噪声尝试不同的 temperature/top_k 参数