前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用AI生成背景音乐

使用AI生成背景音乐

原创
作者头像
Luoyger
修改2024-03-13 12:30:40
3910
修改2024-03-13 12:30:40
举报

生成背景音乐可以使用Meta开源的AudioCraft项目。

开源项目地址:https://github.com/facebookresearch/audiocraft

输入:prompt,描述音乐的风格。

输出:音乐文件目录

生成音乐代码示例

简单测试生成音乐,代码如下,可能消耗比较多的GPU内存。

Prompt示例:There are obvious heavy drums and create a hot and enthusiastic atmosphere.

代码语言:javascript
复制
from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write
model = MusicGen.get_pretrained('melody')
model.set_generation_params(duration=48)  # generate 8 seconds.
descriptions = ['There are obvious heavy drums and create a hot and enthusiastic atmosphere']
wav = model.generate(descriptions)  # generates 3 samples.
for idx, one_wav in enumerate(wav):
    # Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
    audio_write(f'{idx}', one_wav.cpu(), model.sample_rate, strategy="loudness", loudness_compressor=True)

若需要封装成服务提供API接口,可以参考如下。

API接口代码

使用了Queue队列,考虑到资源,目前是串行的队列,后续请求堵塞,在请求结束时,才从队列中取出当前任务,表示当前任务完成。

代码语言:javascript
复制
import os
import time
import logging
import torch
from datetime import datetime
from fastapi import FastAPI
from audiocraft.models import MusicGen
from audiocraft.data.audio import audio_write
from queue import Queue


logging.basicConfig(
    format='%(asctime)s - %(levelname)s - %(lineno)d: %(message)s',
    filename='music_gen_service.log',
    encoding='utf-8',
    level=logging.DEBUG)

app = FastAPI()
request_queue = Queue(maxsize=10)  # 设置队列最大容量为10

output_dir = "../data/music_gen"

@app.get('/api/music_gen')
def generate(description: str, duration: int):
    logging.info(f"music generate start, duration: {duration}, description: {description}")
    try:
        request_queue.put(1, block=True, timeout=None)  # 将请求放入队列,如果队列已满则阻塞
        logging.info(f"music generate start, duration: {duration}, description: {description}")
        now = datetime.now()
        today = "/" + now.strftime("%Y%m%d") + "/"
        timestamp = str(int(time.time() * 1000))

        description_list = []
        description_list.append(description)
        model = MusicGen.get_pretrained('small')
        model.set_generation_params(duration=duration)  # generate 'duration' seconds.
        wav = model.generate(description_list)  # generates samples based on descriptions
        for one_wav in wav:
            # 产出的音乐文件存储于../data/music_gen/{YYYYMMDD}/{timestamp}.wav中
            audio_write(os.path.join(output_dir+today, timestamp), one_wav.cpu(), model.sample_rate, strategy="loudness", loudness_compressor=True)
        torch.cuda.empty_cache()
    except Exception as ee:
        logging.error(f"music generate failed, msg: {ee}, duration: {duration}, description: {description}")
        return {"code": 400, "msg": str(ee)}
    finally:
        request_queue.get()  # 处理完成后从队列中取出请求

    logging.info(f"music generate success, duration: {duration}, description: {description}")
    return {"code": 0, "msg": "Success", "data": {"path": os.path.abspath(output_dir) + today + timestamp + ".wav"}}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 生成音乐代码示例
  • API接口代码
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档