构建 MusicGen API 以在本地生成自定义音乐曲目

社区文章 发布于2024年12月4日

得益于生成式 AI,我们创作和体验音乐的方式正在发生演变。像 MusicGen 这样的工具处于这场革命的最前沿,使开发者和创作者能够从文本描述中生成独特的音频。想象一下,只需一个简单的 API,就能生成一个量身定制的、鼓舞人心的原声带或舒缓的旋律。

在本文中,我将指导您使用 facebook/musicgen-large 构建一个 MusicGen API,结合技术指导和对生成式音频如何重塑创意领域的见解。


MusicGen 的强大功能

由 Meta 开发的 MusicGen 是一个强大的文本转音频模型,能够根据“放松的钢琴音乐”或“充满活力的舞曲节奏”等提示创建各种音乐作品。它的多功能性使其非常适合:

  • 为视频内容制作个性化原声带。
  • 为应用程序、游戏或体验创作背景音乐。
  • 音乐制作人的快速原型设计。

与传统音乐创作不同,MusicGen 不需要高级作曲技能。这种创造力的民主化正是生成式 AI 具有如此变革性的原因。


设置您的环境

在深入编写代码之前,让我们确保拥有正确的工具。

要求

要在本地运行 API,您需要:

  • Python 3.9+
  • 兼容 CUDA 的 GPU 以实现更快处理(CPU 也可以)。
  • 库:torchtransformersFastAPIuvicornscipy

安装

安装所需的库

pip install torch transformers fastapi uvicorn scipy

此设置可让您的机器无缝运行 facebook/musicgen-large 模型并处理音频。


介绍 MusicGen API

API 有什么作用?

API:

  1. 接受描述所需音乐风格的提示
  2. 允许用户指定生成音频的时长
  3. 返回两个独特的音频轨道以增加多样性。

我们使用 FastAPI 来管理 API 端点,利用其高性能和自动验证功能。


代码:构建 MusicGen API

以下是 API 的完整实现

from fastapi import FastAPI, HTTPException, BackgroundTasks
from pydantic import BaseModel
import uvicorn
import os
import scipy.io.wavfile
import torch
from transformers import pipeline
import random
import traceback

app = FastAPI()

class MusicRequest(BaseModel):
    prompt: str
    duration: int  # Duration for each track

# Disable tokenizers parallelism warning
os.environ["TOKENIZERS_PARALLELISM"] = "false"

@app.post("/generate-music/")
async def generate_music(request: MusicRequest, background_tasks: BackgroundTasks):
    if request.duration <= 0:
        raise HTTPException(status_code=400, detail="Duration must be greater than zero")

    synthesiser = None

    try:
        # Set device (GPU or CPU)
        device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        print(f"Using device: {'CUDA' if device.type == 'cuda' else 'CPU'}")

        # Optionally limit GPU memory usage
        if device.type == 'cuda':
            try:
                torch.cuda.set_per_process_memory_fraction(0.8, device=0)
                print("Limited GPU memory usage to 80%")
            except Exception as mem_error:
                print(f"Failed to limit GPU memory: {mem_error}")

        # Load MusicGen Large model
        synthesiser = pipeline("text-to-audio", model="facebook/musicgen-large", device=0 if device.type == 'cuda' else -1)
        print("Model loaded successfully")

        # Generate two audio tracks using a random seed
        random_seed = random.randint(0, 2**32 - 1)
        torch.manual_seed(random_seed)
        if device.type == 'cuda':
            torch.cuda.manual_seed_all(random_seed)

        music1 = synthesiser(request.prompt, forward_params={"do_sample": True, "max_length": request.duration * 50})
        random_seed += 1
        torch.manual_seed(random_seed)
        if device.type == 'cuda':
            torch.cuda.manual_seed_all(random_seed)
        music2 = synthesiser(request.prompt, forward_params={"do_sample": True, "max_length": request.duration * 50})

        # Save audio files
        output1 = os.path.join(os.getcwd(), "song1.wav")
        scipy.io.wavfile.write(output1, rate=music1["sampling_rate"], data=music1["audio"])

        output2 = os.path.join(os.getcwd(), "song2.wav")
        scipy.io.wavfile.write(output2, rate=music2["sampling_rate"], data=music2["audio"])

        return {"song1": output1, "song2": output2}

    except Exception as e:
        traceback.print_exc()
        raise HTTPException(status_code=500, detail=f"Error generating music: {e}")

    finally:
        if synthesiser:
            del synthesiser
        torch.cuda.empty_cache()
        print("Cleaned up resources")

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

挑战与解决方案

GPU 内存管理

问题:长音频轨道可能导致 GPU 内存问题。
解决方案:将 GPU 内存使用量限制为 80%

torch.cuda.set_per_process_memory_fraction(0.8, device=0)

模型初始化开销

问题:加载大型模型会延迟响应时间。
解决方案:使用 FastAPI 的后台任务来异步处理操作。


在本地运行 API

启动 API 服务器

uvicorn app:app --host 0.0.0.0 --port 8000

示例请求

要生成音乐,请向 /generate-music/ 发送 POST 请求

{
  "prompt": "calm and meditative music",
  "duration": 30
}

API 将返回两个生成的音频文件路径(song1.wavsong2.wav)。


生成式音频为何重要

像 MusicGen 这样的生成式 AI 让创作者能够以过去无法想象的方式尝试音乐。无论您是为电影配乐制作原型,还是为游戏添加背景音乐,这项技术都能消除入门障碍。

音乐制作的民主化使任何人——从业余爱好者到专业人士——都能创造出独特而个性化的作品。


下一步:提升您的 API

考虑通过以下方式扩展此 API:

  1. 添加后期处理:使用 Pydub 等库通过归一化和滤镜增强音频。
  2. 前端集成:为非技术用户构建一个与 API 交互的界面。
  3. 云部署:将 API 托管到 AWS 或 Azure 等平台以实现更广泛的访问。

结论

生成式 AI 正在重新定义音乐制作的边界。通过将 MusicGen 等模型与 FastAPI 等工具相结合,我们不仅在构建 API,还在创造表达创意的新方式。

如果您有兴趣探索 AI 如何提升您的工作流程,或者想要构建自定义 API,请随时与我联系。我们可以共同构建音乐和 AI 的未来。

image/webp

社区

已删除

注册登录 以评论