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

使用AI生成背景音乐

原创
作者头像
Luoyger
修改2024-03-13 12:30:40
4930
修改2024-03-13 12:30:40
举报
文章被收录于专栏:AI技术探索和应用

生成背景音乐可以使用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接口代码
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档