AudioCraft音频生成Skill audiocraft-audio-generation

AudioCraft是一个用于音频生成的PyTorch库,基于深度学习技术,能够根据文本描述自动生成音乐和音效。它支持MusicGen(文本到音乐)和AudioGen(文本到音频),适用于音乐创作、音效设计、AI应用开发等领域。关键词:音频生成、文本到音乐、AI生成内容、深度学习、PyTorch、MusicGen、AudioGen、AIGC。

AIGC 0 次安装 0 次浏览 更新于 3/21/2026

name: audiocraft-audio-generation description: 用于音频生成的PyTorch库,包括文本到音乐(MusicGen)和文本到音频(AudioGen)。当您需要从文本描述生成音乐、创建音效或进行旋律条件音乐生成时使用。 version: 1.0.0 author: Orchestra Research license: MIT tags: [多模态, 音频生成, 文本到音乐, 文本到音频, MusicGen] dependencies: [audiocraft, torch>=2.0.0, transformers>=4.30.0]

AudioCraft:音频生成

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

何时使用AudioCraft

使用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

基本文本到音乐(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 = ["欢快活泼的电子舞曲,带有合成器"]
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=["80年代流行曲目,带有低音鼓和合成器"],
    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 = ["狗在公园里叫,伴有鸟鸣声"]
wav = model.generate(descriptions)

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

核心概念

架构概述

AudioCraft 架构:
┌──────────────────────────────────────────────────────────────┐
│                    文本编码器(T5)                          │
│                         │                                     │
│                    文本嵌入                                   │
└────────────────────────┬─────────────────────────────────────┘
                         │
┌────────────────────────▼─────────────────────────────────────┐
│               Transformer解码器(LM)                        │
│     自回归生成音频令牌                                       │
│     使用高效的令牌交错模式                                   │
└────────────────────────┬─────────────────────────────────────┘
                         │
┌────────────────────────▼─────────────────────────────────────┐
│                EnCodec音频解码器                              │
│        将令牌转换回音频波形                                   │
└──────────────────────────────────────────────────────────────┘

模型变体

模型 大小 描述 使用案例
musicgen-small 300M 文本到音乐 快速生成
musicgen-medium 1.5B 文本到音乐 平衡
musicgen-large 3.3B 文本到音乐 最佳质量
musicgen-melody 1.5B 文本 + 旋律 旋律条件
musicgen-melody-large 3.3B 文本 + 旋律 最佳旋律
musicgen-stereo-* 可变 立体声输出 立体声生成
musicgen-style 1.5B 风格传递 基于参考
audiogen-medium 1.5B 文本到音效 音效

生成参数

参数 默认值 描述
duration 8.0 长度(秒)(1-120)
top_k 250 Top-k采样
top_p 0.0 核心采样(0 = 禁用)
temperature 1.0 采样温度
cfg_coef 3.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 = [
    "史诗般的管弦乐配乐,带有弦乐和铜管乐器",
    "轻松的Lo-Fi嘻哈节奏,带有爵士钢琴",
    "充满活力的摇滚歌曲,带有电吉他"
]

# 生成(返回 [批次, 通道, 样本])
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 = ["原声吉他民歌"]
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 = ["环境电子音乐,带有宽立体声平移"]
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=["继续史诗合唱"],
    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 = ["欢快的舞曲"]
wav = model.generate_with_style(descriptions, style_audio, sr)

纯风格生成(无文本)

# 生成匹配风格,无文本提示
model.set_generation_params(
    duration=30,
    cfg_coef=3.0,
    cfg_coef_beta=None  # 禁用双CFG用于纯风格
)

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 = [
    "雷暴伴有大雨和闪电",
    "繁忙的城市交通,伴有汽车喇叭声",
    "海浪拍打岩石",
    "森林中噼啪作响的篝火"
]

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)

# 编码为令牌
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):
    """
    从规格生成多个音效。

    参数:
        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": "爆炸", "description": "巨大爆炸伴有碎片", "duration": 3},
    {"name": "脚步声", "description": "木地板上的脚步声", "duration": 5},
    {"name": "门", "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 VRAM FP16 VRAM
musicgen-small ~4GB ~2GB
musicgen-medium ~8GB ~4GB
musicgen-large ~16GB ~8GB

常见问题

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

参考

资源