AI谱曲 | 基于RWKV的最佳开源AI作曲模型魔搭推理实践

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,5000CU*H 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: AI谱曲 | 基于RWKV的最佳开源AI作曲模型魔搭推理实践

RWKV-4-Music开源直链

模型下载

BlinkDL/rwkv-4-music · Hugging Face

Python代码:

https://github.com/BlinkDL/ChatRWKV/tree/main/music

训练MIDI数据集:

https://huggingface.co/datasets/breadlicker45/bread-midi-dataset

模型链接:

https://modelscope.cn/models/AI-ModelScope/rwkv-4-world/summary

https://modelscope.cn/models/AI-ModelScope/rwkv-4-music/summary

创空间体验链接:

https://modelscope.cn/studios/AI-ModelScope/RWKV-4-Music/summary

https://modelscope.cn/studios/BlinkDL/RWKV-CHN-PRO/summary

RWKV-4-Music模型推理

模型的推理过程分为两步:

1、使用RWKV-4-Music音乐生成模型, 以类似于文本生成的方式生成一长串编码着乐器, 音符, 时长等信息的字符串, 并将字符串保存入txt文件;

2、将txt文件转换wav文件:

  1. 首先将txt文件转成midi格式文件. midi格式是一种数字音乐标准, 是一种通用的音乐文件格式. midi格式文件并不包含声音文件本身, 而是包含一组描述如何播放声音的指令.

  1. 使用midi2audio的python包将midi格式转成wav格式.

当然推理的步骤可能略为繁琐, 我们也提供了创空间平台, 便于大家进行模型体验:

https://modelscope.cn/studios/AI-ModelScope/RWKV-4-Music/summary

以下推理所需的资料可以直接从创空间的git中方便的获取. 或者你也可以从下面提供的网址中进行下载.

请注意: 以下的推理运行需要linux系统环境下进行.

# 安装git, git-lfs. 这里提供两种方式
sudo apt install git git-lfs  # 使用apt安装
# conda install git git-lfs -c conda-forge  # 使用conda安装
git clone http://www.modelscope.cn/studios/AI-ModelScope/RWKV-4-Music.git

1. 生成txt文件

首先, 我们需要准备运行的环境

pip install rwkv tqdm mido midi2audio requests certifi -U
# 安装fluidsynth软件包, 在midi->wav的时候需要. 我们给出了两种安装方式. 
sudo apt install fluidsynth  # 使用apt安装
# conda install fluidsynth -c conda-forge  # 使用conda安装

以下的推理代码参考了作者的github仓库:

https://github.com/BlinkDL/ChatRWKV/blob/main/music/run.py

相关包的导入

import os
import torch
from rwkv.model import RWKV
from rwkv.utils import PIPELINE
from tqdm import tqdm
from modelscope import snapshot_download

使用modelscope的snapshot_download函数下载模型, 并载入.

下载的文件夹中包含120M和560M的模型. 我们使用560M的模型.

model_dir = snapshot_download('AI-ModelScope/rwkv-4-music', revision='v1.0.1')
ckpt_120M_fname = "RWKV-4-MIDI-120M-v1-20230714-ctx4096.pth"
ckpt_560M_fname = "RWKV-4-MIDI-560M-v1-20230717-ctx4096.pth"
ckpt_fpath = os.path.join(model_dir, ckpt_560M_fname)
# tokenizer-midi.json文件下载路径: https://github.com/BlinkDL/ChatRWKV/blob/main/music/tokenizer-midi.json
tokenizer_fpath = "tokenizer-midi.json"
model = RWKV(model=ckpt_fpath, strategy='cuda fp32')
model.eval()
pipeline = PIPELINE(model, tokenizer_fpath)

定义一些参数

# e.g. 
# input_text = 'v:5b:3 v:5b:2 t125 t125 t125 t106 pi:43:5 t24 pi:4a:7 t15 pi:4f:7 t17 pi:56:7 t18 pi:54:7 t125 t49 pi:51:7 t117 pi:4d:7 t125 t125 t111 pi:37:7 t14 pi:3e:6 t15 pi:43:6 t12 pi:4a:7 t17 pi:48:7 t125 t60 pi:45:7 t121 pi:41:7 t125 t117 s:46:5 s:52:5 f:46:5 f:52:5 t121 s:45:5 s:46:0 s:51:5 s:52:0 f:45:5 f:46:0 f:51:5 f:52:0 t121 s:41:5 s:45:0 s:4d:5 s:51:0 f:41:5 f:45:0 f:4d:5 f:51:0 t102 pi:37:0 pi:3e:0 pi:41:0 pi:43:0 pi:45:0 pi:48:0 pi:4a:0 pi:4d:0 pi:4f:0 pi:51:0 pi:54:0 pi:56:0 t19 s:3e:5 s:41:0 s:4a:5 s:4d:0 f:3e:5 f:41:0 f:4a:5 f:4d:0 t121 v:3a:5 t121 v:39:7 t15 v:3a:0 t106 v:35:8 t10 v:39:0 t111 v:30:8 v:35:0 t125 t117 v:32:8 t10 v:30:0 t125 t125 t103 v:5b:0 v:5b:0 t9 pi:4a:7'
input_text = ''
only_piano = False
max_length = 512
max_length = min(max_length, 4096)
temperature = 1
top_k = 8
top_p = 0.8
#
txt_fpath = 'midi.txt'
midi_fpath = 'midi_bin.midi'
wav_fpath = 'wav_bin.wav'

进行模型的推理和文本生成

input_text = input_text.strip()
input_text = f'<pad> {input_text}'
output_text = '<start>'
#
occurrence = {}
state = None
for i in tqdm(range(max_length)):
    if i == 0:
        out, state = model.forward(pipeline.encode(input_text), state)
    else:
        out, state = model.forward([token], state)
    #
    for n in occurrence:
        out[n] -= (0 + occurrence[n] * 0.5)
    out[0] += (i - 2000) / 500  # try not to be too short or too long
    out[127] -= 1  # avoid "t125"
    #
    if only_piano:
        out[128:12416] -= 1e10
        out[13952:20096] -= 1e10
    # find the best sampling for your taste
    token = pipeline.sample_logits(
        out, temperature=temperature, top_k=top_k, top_p=top_p)
    if token == 0:
        break
    for n in occurrence:
        occurrence[n] *= 0.997  # decay repetition penalty
    if token >= 128 or token == 127:
        occurrence[token] = 1 + \
            (occurrence[token] if token in occurrence else 0)
    else:
        occurrence[token] = 0.3 + \
            (occurrence[token] if token in occurrence else 0)
    output_text += f" {pipeline.decode([token])}"
output_text += ' <end>'

将生成的文本写入txt文件

with open(txt_fpath, "w") as f:
    f.write(output_text)

2. txt文件 -> wav文件

当然以下的步骤可能比较繁琐, 我们也可以使用创空间提供的txt -> wav的功能方便的进行格式转换.

https://modelscope.cn/studios/AI-ModelScope/RWKV-4-Music/summary

txt文件 -> midi文件

# midi_util文件下载: https://github.com/briansemrau/MIDI-LLM-tokenizer/blob/main/midi_util.py
# vocab_config文件下载: https://github.com/briansemrau/MIDI-LLM-tokenizer/blob/main/vocab_config.json
import midi_util
from midi_util import VocabConfig
def txt_to_midi(text_fpath: str, output_fpath: str):
    vocab_config = "vocab_config.json"
    cfg = VocabConfig.from_json(vocab_config)
    with open(text_fpath, "r") as f:
        text = f.read()
    text = text.strip()
    mid = midi_util.convert_str_to_midi(cfg, text)
    mid.save(output_fpath)
txt_to_midi(txt_fpath, midi_fpath)

midi文件 -> wav文件

# 这里的.sf2文件下载路径: https://github.com/vyshor/MusicAids/blob/master/default_sound_font.sf2
from midi2audio import FluidSynth
def midi_to_wav(midi_path: str, wav_path: str) -> None:
    # 设置音源,你需要下载一个.sf2文件,这是一个音源文件
    fs = FluidSynth('default_sound_font.sf2')
    fs.midi_to_audio(midi_path, wav_path)
midi_to_wav(midi_fpath, wav_fpath)

然后我们就获得了wav_bin.wav的音频文件, 听一下我们产生的音频啦!!!

效果展示

我们录制了一段魔搭创空间的创作效果,来感受一下AI作曲的创作能力叭!


image.png

(魔搭创空间操作指引,下方阅读原文可直达)

https://modelscope.cn/studios/AI-ModelScope/RWKV-4-Music/summary

原始input曲谱:

image.png

魔搭创空间推荐2组参数生成曲谱效果,看看大家喜欢哪组呢:

only piano:true,max length:512,temperature:1,top_k:8,top_p:0.8

image.png

01:03

only piano:false,max length:512,temperature:1,top_k:10,top_p:0.8

image.png

相关文章
|
11天前
|
人工智能 测试技术 API
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。
|
4天前
|
机器学习/深度学习 人工智能 UED
OpenAI o1模型:AI通用复杂推理的新篇章
OpenAI发布了其最新的AI模型——o1,这款模型以其独特的复杂推理能力和全新的训练方式,引起了业界的广泛关注。今天,我们就来深入剖析o1模型的特点、背后的原理,以及一些有趣的八卦信息。
135 73
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
【9月更文挑战第4天】赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
赋能百业:多模态处理技术与大模型架构下的AI解决方案落地实践
|
1天前
|
人工智能 云栖大会
AI Infra的前沿技术与应用实践 | 2024云栖大会预告
AI Infra的前沿技术与应用实践 | 2024云栖大会
|
6天前
|
人工智能 自动驾驶 云计算
【通义】AI视界|谷歌大模型被盯上!欧盟最高隐私监管机构对PaLM2模型展开调查~
本文汇总了近24小时内科技领域的五大要闻:欧盟对谷歌PaLM2模型启动隐私合规调查;甲骨文推出Zettascale云计算集群,集成大量NVIDIA GPU强化计算力;红杉资本偏好AI应用投资而非模型构建;夸克新推智能助手CueMe,支持长达2万字内容生成;沃尔沃与NVIDIA合作,未来车型将采用后者先进芯片提升自动驾驶功能。以上内容由通义自动生成。
|
8天前
|
机器学习/深度学习 人工智能 供应链
【通义】AI视界|OpenAI的“草莓”模型预计两周内上线!像人类一样思考!
本文介绍了近期科技领域的五大亮点:OpenAI即将推出的新一代AI模型“草莓”,具备高级推理能力;亚马逊测试AI技术加速有声读物生产,通过语音克隆提高效率;Kimi API新增联网搜索功能,拓宽信息来源;顺丰发布物流行业专用大语言模型“丰语”,提升工作效率;钉钉推出“AI班级群”功能,改善家校沟通体验。更多详情,请访问[通义官网]。
|
12天前
|
人工智能 自然语言处理 数据挖掘
【通义】AI视界|性能超越GPT-4o?最强大的开源AI模型来了……
本文介绍了五项最新AI技术动态,包括性能超越GPT-4o的开源AI模型Reflection70B、智谱清言App限时免费的视频通话功能、哈佛医学院研发的癌症诊断AI模型CHIEF、Replit推出的AI编程助手,以及英特尔与日本AIST合作设立的芯片制造研发中心。这些进展展示了AI领域的快速创新与广泛应用。更多详情,请访问通义官网体验。
|
10天前
|
人工智能 自然语言处理 自动驾驶
【通义】AI视界|马斯克亲自辟谣:xAI不可能在特斯拉的推理计算机上运行
本文精选了24小时内的重要科技新闻,包括马斯克辟谣xAI不会运行在特斯拉计算机上、谷歌发布AlphaProteo AI模型、百度贴吧“弱智吧”成为AI训练佳选、荣耀推出跨应用智能体以及苹果即将在iOS 18.2中加入图像生成功能。更多内容请访问通义官网体验。
|
11天前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
4天前
|
机器学习/深度学习 人工智能 搜索推荐
AI与未来医疗:革命性的技术,触手可及的健康
本文探讨了人工智能(AI)在医疗领域的应用及其潜力。从诊断辅助、个性化治疗到药物研发,AI正在改变我们理解健康和疾病的方式。同时,本文也讨论了AI面临的伦理挑战和数据隐私问题,呼吁建立相应的法律法规来保障患者权益。最后,本文对AI在未来医疗中的角色进行了展望,认为AI将继续推动医疗领域的创新和发展。
26 8