当你需要一段背景音乐。
做短视频要BGM,做播客要片头曲,做游戏要场景音乐,做个PPT演示也想配点氛围感。但你不会作曲,不会弹琴,不会用FL Studio。
以前你只能去素材网站找——免费的质量差,好的要收费,还有版权问题。用流行歌曲?侵权。用免版税素材?千篇一律。
现在你可以用AI生成。打几个字描述你想要的风格,AI给你一段独一无二的音乐。这篇用Meta开源的MusicGen在VPS上搭一个文字生成音乐的工具。
MusicGen是什么
MusicGen是Meta(Facebook母公司)开源的AI音乐生成模型。你输入文字描述,它输出音频。不需要MIDI,不需要乐理知识,打字就行。
比如你输入:“一段轻快的电子舞曲,节奏感强,适合健身房”,它给你生成30秒的电子乐。
输入:“安静的钢琴曲,有点忧伤,像下雨天的咖啡馆”,它给你生成一段钢琴独奏。
不是从素材库里找,是实时生成的——每次生成的结果都不一样,你拿到的音乐是独一无二的。
先说限制
别期望太高。MusicGen生成的音乐有几个明显短板:
音质:不如专业制作。听起来像demo,有AI生成的那种微妙"不对劲"感。特别是人声——MusicGen生成的人声基本不可用,像是外星语。
时长:单次生成最长约30秒(受显存/内存限制)。想要更长的需要拼接,拼接处会有明显断裂感。
速度:CPU模式下生成30秒音频大约需要2-5分钟。不快,但能接受——你去泡杯咖啡回来就好了。
版权:Meta声明MusicGen生成的音频可以自由使用。但AI音乐的版权领域目前法律还不清晰,商业用途建议咨询专业人士。
适合的场景:短视频BGM、播客片头、游戏原型、个人项目配乐。不适合:正式发行的音乐作品、商业广告主曲。
部署MusicGen
MusicGen是Python项目,用Docker封装。
mkdir-p/home/musicgencd/home/musicgenDockerfile:
FROM python:3.11-slim RUN apt-get update && apt-get install -y \ libgl1 libglib2.0-0 ffmpeg \ && rm -rf /var/lib/apt/lists/* # 安装CPU版PyTorch + MusicGen RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu RUN pip install flask audiocraft WORKDIR /app COPY app.py . EXPOSE 5006 CMD ["python", "app.py"]app.py:
fromflaskimportFlask,request,send_fileimporttorchfromaudiocraft.modelsimportMusicGenfromaudiocraft.data.audioimportaudio_writeimportioimporttempfileimportos app=Flask(__name__)model=Nonedefget_model():globalmodelifmodelisNone:print("加载MusicGen模型...")# medium模型,平衡质量和速度model=MusicGen.get_pretrained('facebook/musicgen-medium')model.set_generation_params(duration=15)# 默认15秒returnmodel@app.route('/generate',methods=['POST'])defgenerate():data=request.json prompt=data.get('prompt','')duration=data.get('duration',15)ifnotprompt:return{'error':'No prompt'},400m=get_model()m.set_generation_params(duration=min(duration,30))# 最大30秒# 生成wav=m.generate([prompt])# 转成音频文件(用临时目录,读入内存后再返回,避免目录清理后文件丢失)withtempfile.TemporaryDirectory()astmpdir:output_name=os.path.join(tmpdir,'output')audio_write(output_name,wav[0].cpu(),m.sample_rate,strategy="loudness",format="wav")withopen(output_name+'.wav','rb')asf:file_data=f.read()returnsend_file(io.BytesIO(file_data),mimetype='audio/wav',download_name='music.wav')if__name__=='__main__':app.run(host='0.0.0.0',port=5006)docker-compose.yml:
services:musicgen:build:.ports:-"5006:5006"restart:alwaysvolumes:-/home/musicgen/models:/root/.cache# 缓存模型,避免每次重启重新下载dockercompose up-d--build构建过程比较长(PyTorch + audiocraft依赖多),第一次大约15-20分钟。镜像大小约5GB。
第一次请求会下载模型文件(medium模型约1.5GB),下载完缓存在volume里,后续重启不用重下。
网页前端
<!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>AI音乐生成</title><style>*{margin:0;padding:0;box-sizing:border-box;}body{font-family:system-ui,sans-serif;background:#1a1a2e;color:#eee;padding:20px;min-height:100vh;}.container{max-width:700px;margin:0 auto;}h1{text-align:center;margin-bottom:30px;font-size:28px;}.input-group{margin-bottom:20px;}label{display:block;margin-bottom:8px;color:#aaa;}textarea{width:100%;height:100px;background:#16213e;color:#eee;border:1px solid #333;border-radius:8px;padding:12px;font-size:15px;font-family:inherit;resize:none;}.controls{display:flex;gap:10px;align-items:center;margin:15px 0;}select{padding:8px;background:#16213e;color:#eee;border:1px solid #333;border-radius:6px;}.btn{padding:12px 32px;background:#e94560;color:white;border:none;border-radius:8px;font-size:16px;cursor:pointer;width:100%;}.btn:hover{background:#c81e45;}.btn:disabled{background:#555;cursor:not-allowed;}.loading{text-align:center;padding:30px;color:#aaa;}.result{margin-top:20px;display:none;}audio{width:100%;margin-top:10px;}.download{display:inline-block;margin-top:10px;color:#e94560;text-decoration:none;}.tips{background:#16213e;border-radius:8px;padding:16px;margin-top:20px;font-size:14px;line-height:1.8;}.tips h3{color:#e94560;margin-bottom:8px;}.preset{display:inline-block;padding:6px 12px;background:#16213e;border:1px solid #333;border-radius:20px;margin:4px;cursor:pointer;font-size:13px;}.preset:hover{border-color:#e94560;}</style></head><body><divclass="container"><h1>🎵 AI音乐生成</h1><divclass="input-group"><label>描述你想要的音乐</label><textareaid="prompt"placeholder="例如:轻快的电子舞曲,节奏感强,适合健身房"></textarea></div><divstyle="margin:10px 0;"><labelstyle="font-size:13px;color:#888;">快捷模板:</label><spanclass="preset"onclick="document.getElementById('prompt').value='轻快的电子舞曲,节奏感强,适合健身房'">电子舞曲</span><spanclass="preset"onclick="document.getElementById('prompt').value='安静的钢琴曲,有点忧伤,像下雨天的咖啡馆'">钢琴忧伤</span><spanclass="preset"onclick="document.getElementById('prompt').value='欢快的尤克里里配乐,夏日海滩的感觉'">尤克里里</span><spanclass="preset"onclick="document.getElementById('prompt').value='史诗感的管弦乐,像电影配乐的高潮部分'">史诗管弦</span><spanclass="preset"onclick="document.getElementById('prompt').value='lo-fi hip hop, chill, 砸嘴声, 适合学习'">Lo-fi</span></div><divclass="controls"><label>时长:</label><selectid="duration"><optionvalue="10">10秒</option><optionvalue="15"selected>15秒</option><optionvalue="30">30秒</option></select></div><buttonclass="btn"id="genBtn"onclick="generate()">生成音乐</button><divclass="loading"id="loading"style="display:none;">生成中,CPU模式大约需要2-5分钟,去泡杯茶吧 ☕</div><divclass="result"id="result"><audioid="player"controls></audio><br><aclass="download"id="downloadBtn"href="#"download="music.wav">⬇ 下载WAV</a></div><divclass="tips"><h3>提示词技巧</h3>• 用英文描述效果更好(模型训练数据以英文为主)<br>• 包含:风格 + 乐器 + 情绪 + 场景<br>• 好例子:"upbeat acoustic guitar, warm, sunny morning, folk"<br>• 坏例子:"好听的歌"(太模糊,AI不知道你要什么)</div></div><script>asyncfunctiongenerate(){constprompt=document.getElementById('prompt').value;if(!prompt.trim())return;constduration=document.getElementById('duration').value;constbtn=document.getElementById('genBtn');btn.disabled=true;document.getElementById('loading').style.display='block';document.getElementById('result').style.display='none';try{constres=awaitfetch('/api/generate',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({prompt,duration:parseInt(duration)})});constblob=awaitres.blob();consturl=URL.createObjectURL(blob);document.getElementById('player').src=url;document.getElementById('downloadBtn').href=url;document.getElementById('result').style.display='block';}catch(err){alert('生成失败:'+err.message);}finally{btn.disabled=false;document.getElementById('loading').style.display='none';}}</script></body></html>放到/home/musicgen/web/index.html。
Nginx反代
server { listen 80; server_name music.你的域名.com; location / { root /home/musicgen/web; index index.html; } location /api/generate { proxy_pass http://127.0.0.1:5006/generate; proxy_set_header Host $host; proxy_read_timeout 600s; # 生成可能要几分钟,超时调到10分钟 } }nginx-t&&nginx-sreload certbot--nginx-dmusic.你的域名.com实测效果
我在VPS上(4核CPU,8G内存)测了几组提示词:
测试1:“upbeat electronic dance music, energetic, gym workout”
生成15秒。节奏感确实有,鼓点清晰,电子音色。有点单调(15秒内没有明显变化),但作为BGM能用。生成耗时约3分钟。
测试2:“calm piano, melancholic, rainy day, coffee shop”
生成15秒。钢琴音色还原度不错,旋律确实有忧伤感。比测试1好——可能钢琴比电子乐更容易生成。耗时约2分半。
测试3:“epic orchestral, cinematic, battle scene, dramatic”
生成15秒。管弦乐的气势出来了,但层次感不够——真实交响乐有多个声部,AI生成的偏扁平。当游戏原型音乐可以,正式用不行。耗时约3分钟。
测试4:“欢快的中文民谣,吉他伴奏”
生成15秒。用中文描述效果明显不如英文。吉他音色OK,但"中文民谣"的风格没体现出来。换成英文"acoustic folk, cheerful, guitar"后效果好很多。
结论:纯器乐效果还行,复杂编曲和人声不行。英文提示词比中文效果好得多。作为"快速生成一段能用的BGM"的工具,合格了。
提示词技巧
MusicGen的提示词写法直接决定质量。几个要点:
用英文。模型的训练数据以英文为主,英文描述的风格识别更准。
写具体不写模糊。"好听的歌"→AI不知道你要什么。"upbeat ukulele, tropical, summer vibe"→AI知道要欢快的尤克里里夏日风。
拆维度写。好的提示词包含:乐器、风格、情绪、节奏、场景。
✅ lo-fi hip hop, chill, mellow, jazz chords, vinyl crackle, study music ✅ epic orchestral, strings, brass, dramatic, cinematic, building tension ✅ acoustic guitar, fingerpicking, warm, cozy, morning, folk ❌ 好听的背景音乐 ❌ pop song ❌ something cool避免人声。除非你想要"外星语"效果。加"instrumental"或"no vocals"到提示词里。
资源和性能
内存:medium模型加载后占约4GB。加上PyTorch本身,总共约5-6GB。4G内存的VPS跑不了,至少8G。
CPU:4核是底线。2核能跑但每首都等10分钟,体验很差。
存储:镜像5GB + 模型文件1.5GB,预留10GB空间。
如果想更快:需要GPU。但GPU VPS贵(按小时算大概几毛到几块一小时),除非你天天用,否则不划算。CPU模式适合偶尔生成几段BGM的场景。
替代方案:用API而非本地部署
如果你的VPS带不动MusicGen(内存不够),可以用API方式——不本地部署模型,而是调云端API生成音乐。
几个选择:
- Suno API(非官方):Suno是目前效果最好的AI音乐生成,但有API限制
- Stability AI Audio API:付费API,效果好
- Replicate托管MusicGen:按次付费,不用自己部署
用API的话就不需要大内存VPS了,普通2G内存的机器跑个前端转发就行。缺点是要花钱——不过Replicate上跑一次MusicGen大概几分钱,比买GPU VPS便宜。
到这一步,你的VPS上有一个AI音乐生成工具了。打开网页,打几个字,等几分钟,下载一段独一无二的音频。
不会作曲?没关系。AI替你作。你只需要描述你想要的感觉——剩下的交给模型。
整个工具链还是那个套路:Docker容器 + Flask API + HTML前端 + Nginx反代。你已经用同样的模式部署了对话界面、知识库、图片工具箱、PDF解析、翻译平台、客服系统。再加一个音乐生成——你的VPS现在是一个小型AI工具集合了。