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文件:
- 首先将txt文件转成midi格式文件. midi格式是一种数字音乐标准, 是一种通用的音乐文件格式. midi格式文件并不包含声音文件本身, 而是包含一组描述如何播放声音的指令.
- 使用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作曲的创作能力叭!
(魔搭创空间操作指引,下方阅读原文可直达)
https://modelscope.cn/studios/AI-ModelScope/RWKV-4-Music/summary
原始input曲谱:
魔搭创空间推荐2组参数生成曲谱效果,看看大家喜欢哪组呢:
only piano:true,max length:512,temperature:1,top_k:8,top_p:0.8
01:03
only piano:false,max length:512,temperature:1,top_k:10,top_p:0.8