MusicGen是Meta在2023年开源的单阶段文本生成音乐模型,它最大的特点是简单直接:输入一段文字描述,比如“一段轻快的钢琴曲,带有爵士鼓点伴奏”,模型就能输出一段带有旋律、和声与节奏伴奏的完整音频。相比传统需要MIDI编曲或DAW软件的制作流程,MusicGen把创作门槛降到了一句话的级别。本文将从原理、环境搭建、实操代码和参数调优几个方面,完整讲清楚如何用MusicGen根据文字描述生成音乐。

一、MusicGen的工作原理与模型规格
MusicGen并没有直接从文字生成音频波形,而是采用了一种分层架构。上层是一个基于Transformer的语言模型,负责把文字描述映射成离散的音频token序列;下层使用Meta自家的EnCodec神经编解码器,把这些token还原成可听见的音频。简单理解,就是把“作曲”这件事变成了“写作”——模型像写文章一样,一个token一个token地“写”出音乐。
这种设计的优势在于训练和推理都很稳定,避免了直接生成波形常见的噪音和失真问题。同时MusicGen支持“旋律引导”功能,也就是说你可以给它一段参考音频的和弦进行,再结合文字描述,生成遵循这条旋律走向的新曲子,这对翻唱、变奏、风格迁移非常实用。
MusicGen提供了三个规格的模型:small(3亿参数)、medium(15亿参数)和large(33亿参数)。small模型推理最快,适合快速试听和低配显卡;medium在质量和速度之间比较平衡,是大多数场景的推荐选择;large生成质量最高,细节更丰富,但显存占用和生成耗时也明显增加。如果你的显卡只有4到6G显存,建议从small或medium入手,并且使用float16半精度加载来降低显存压力。
二、两种上手方式:Transformers库与WebUI
最直接的方式是用Hugging Face的Transformers库调用。先安装依赖:pip install transformers scipy,然后加载模型和处理器,几行代码就能完成一次生成。下面是完整的示例:
from transformers import AutoProcessor, MusicgenForConditionalGeneration
import scipy.io.wavfile as wavfile
# 加载处理器和模型,这里使用medium规格
processor = AutoProcessor.from_pretrained("facebook/musicgen-medium")
model = MusicgenForConditionalGeneration.from_pretrained(
"facebook/musicgen-medium", torch_dtype="float16"
)
# 文字描述:旋律与伴奏的风格要求
prompt = "轻快的钢琴旋律,配上柔和的爵士鼓点和贝斯伴奏,节奏明快"
inputs = processor(text=[prompt], padding=True, return_tensors="pt")
# 生成音频token,max_new_token约等于 采样率51Hz * 秒数
audio = model.generate(**inputs, max_new_tokens=1024, do_sample=True, guidance_scale=3.0)
# 保存为wav文件,采样率固定为32kHz
sampling_rate = model.config.audio_encoder.sampling_rate
wavfile.write("output.wav", sampling_rate, audio[0, 0].cpu().float().numpy())
print("生成完成")有几个细节需要注意。MusicGen的采样率固定为32kHz,保存wav时要用模型配置里的采样率,否则音频会变调。max_new_tokens决定了音频长度,模型大约每秒生成51个token,1024个token大约对应20秒的音乐。guidance_scale是文字引导强度,值越大,生成结果越贴合文字描述,但过高会导致音频听起来生硬,一般设置在2到4之间比较合适。
如果你不想写代码,也可以使用社区提供的WebUI界面,例如audiocraft的官方demo或基于Gradio搭建的第三方界面。WebUI中通常可以直接填写文字提示、选择模型大小、调整生成时长和采样参数,点击生成即可在线试听和下载。对于只是偶尔生成背景音乐的用户来说,WebUI的上手成本几乎为零;而对于需要批量生成、接入自己产品线的开发者,Transformers库的方式更灵活,还可以通过GPU加速和多进程并发提升吞吐量。
三、关键参数调优与进阶技巧
除了前面提到的guidance_scale和max_new_tokens,还有几个参数会直接影响生成质量。temperature控制随机性,值越高旋律变化越大但可能杂乱,值越低越保守稳定,默认1.0,建议在0.8到1.2之间尝试。top_k限制采样时只从概率最高的k个token中挑选,常见的设置是250,能有效避免出现突兀的音符。另外,文字描述的写法也很关键,用英文描述通常比中文效果更好,因为训练数据以英文为主,比如写成“upbeat piano melody with soft jazz drums and bass”,同时把乐器、风格、节奏、情绪这些要素都写进去,生成结果的匹配度会明显提升。
进阶玩法是旋律引导生成。思路是先用EnCodec把一段参考音频编码成和弦token,作为条件输入,这样模型生成的音乐会遵循参考音频的和弦走向。这个功能在audiocraft原版库中支持得更完整,代码大致如下:
import torchaudio
from audiocraft.models import MusicGen
model = MusicGen.get_pretrained("medium")
model.set_generation_params(duration=15) # 生成15秒音频
# 加载参考音频,提取和弦条件
wav, sr = torchaudio.load("reference.wav")
wav = wav.mean(dim=0, keepdim=True)
# unconditional为None表示走文本分支,melody为旋律引导分支
out = model.generate_with_chroma(
descriptions=["electronic dance beat with strong bass"],
melody_wavs=wav,
melody_sample_rate=sr
)使用旋律引导时要注意,参考音频最好是单轨、干净的旋律片段,太复杂的混音会让和弦提取变得混乱。生成结果会保留参考音频的音高走向,但音色、风格和编曲则由你的文字描述决定,比如把一段人声哼唱的旋律变成电子舞曲版本,效果往往令人惊喜。
四、常见问题与实用建议
实践中最常见的问题是显存不足。如果加载medium模型时报CUDA out of memory,可以换用small模型,或者在from_pretrained时指定device_map="auto"配合量化方案,把部分权重卸载到CPU。其次是生成速度慢的问题,音频生成是逐token推理的,时长越长耗时线性增长,批量生成时可以把多个文字描述放进同一个列表一次性传入,能显著提高显卡利用率。
另一个常见困扰是生成结果不符合描述。遇到这种情况,优先检查描述是否过于笼统,“好听的曲子”这类提示几乎等于没写。建议按照“风格+主奏乐器+伴奏乐器+节奏+情绪”的结构来组织提示词,必要时做几轮对比测试,固定其他参数只改一处描述,逐步逼近想要的效果。生成完成后,如果需要把32kHz的wav用于正式发布,可以用ffmpeg重采样到44.1kHz并进行响度归一化,让成品更符合平台的标准。掌握了这些方法之后,你就能够用一句话的描述快速产出可用的音乐素材,无论是短视频配乐、游戏音效还是灵感demo,MusicGen都是一个值得常备的工具。