🚀 UniMusプロジェクト: OpenJMLA
UniMusプロジェクトのOpenJMLAは、音楽のタグ付けを行うゼロショットシステムです。従来の音楽タグ付け研究がクローズドセットのタスクに焦点を当てていたのに対し、本システムはオープンセットの音楽タグ付け問題を解決することを目指しています。
 
JMLAの再実装
音楽タグ付けは、音楽レコーディングのタグを予測するタスクです。しかし、従来の音楽タグ付け研究は主にクローズドセットの音楽タグ付けタスクに焦点を当てており、新しいタグに一般化することができません。本研究では、オープンセットの音楽タグ付け問題を解決するために、音楽と言語の結合注意(JMLA)モデルによってモデル化されたゼロショット音楽タグ付けシステムを提案します。JMLAモデルは、事前学習されたマスク付きオートエンコーダによってモデル化されたオーディオエンコーダと、Falcon7Bによってモデル化されたデコーダで構成されています。任意の長さのオーディオを固定長の埋め込みに変換するために、プリシーバーリサンプラーを導入します。エンコーダとデコーダの層間の情報の流れを改善するために、エンコーダとデコーダの層間に密な注意接続を導入します。インターネットから大規模な音楽と説明のデータセットを収集します。JMLAモデルを訓練するために、ChatGPTを使用して生の説明を形式化された多様な説明に変換することを提案します。提案するJMLAシステムは、GTZANデータセットで64.82%のゼロショットオーディオタグ付け精度を達成し、以前のゼロショットシステムを上回り、FMAおよびMagnaTagATuneデータセットで以前のシステムと同等の結果を達成します。
📦 インストール
- conda create -name SpectPrompt python=3.9
- pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
- pip install transformers datasets librosa einops_exts einops mmcls peft ipdb torchlibrosa
- pip install -U openmim
- mim install mmcv==1.7.1
🚀 クイックスタート
以下に、🤗 Transformersを使用してOpenJMLAを使う簡単な例を示します。
🤗 Transformers
OpenJMLAを推論に使用するには、以下に示すように数行のコードを入力するだけです。
from transformers import AutoModel, AutoTokenizer
import torch
import numpy as np
model = AutoModel.from_pretrained('UniMus/OpenJMLA', trust_remote_code=True)
device = model.device
music_path = '/path/to/music.wav'
from wav_to_mel import wav_to_mel
lms = wav_to_mel(music_path)
import os
from torch.nn.utils.rnn import pad_sequence
import random
from transforms import Normalize, SpecRandomCrop, SpecPadding, SpecRepeat
transforms = [ Normalize(-4.5, 4.5), SpecRandomCrop(target_len=2992), SpecPadding(target_len=2992), SpecRepeat() ]
lms = lms.numpy()
for trans in transforms:
lms = trans(lms)
input_dic = dict()
input_dic['filenames'] = [music_path.split('/')[-1]]
input_dic['ans_crds'] = [0]
input_dic['audio_crds'] = [0]
input_dic['attention_mask'] = torch.tensor([[1, 1, 1, 1, 1]]).to(device)
input_dic['input_ids'] = torch.tensor([[1, 694, 5777, 683, 13]]).to(device)
input_dic['spectrogram'] = torch.from_numpy(lms).unsqueez(dim=0).to(device)
model.eval()
gen_ids = model.forward_test(input)
gen_text = model.neck.tokenizer.batch_decode(gen_ids.clip(0))
gen_text = gen_text.split('<s>')[-1].split('\n')[0].strip()
gen_text = gen_text.replace(' in Chinese','')
gen_text = gen_text.replace(' Chinese','')
print(gen_text)
💻 使用例
音楽:
https://www.youtube.com/watch?v=Q_yuO8UNGmY
キャプション:
楽器: ボーカル、ピアノ、弦楽器
ジャンル: ポップ
テーマ: 失恋
ムード: 憂鬱
時代: 現代
テンポ: 速い
最適なシーン: 小さく薄暗いバー。この曲の憂鬱なムードは、ステージをイメージしたメロディーに相まっています。
📄 引用
もしあなたの研究で当社の論文やコードが役に立った場合は、スターを付けて引用を考慮してください。
@article{JMLA,
title={JOINT MUSIC AND LANGUAGE ATTENTION MODELS FOR ZERO-SHOT MUSIC TAGGING},
author={Xingjian Du, Zhesong Yu, Jiaju Lin, Bilei Zhu, Qiuqiang Kong},
journal={arXiv preprint arXiv:2310.10159},
year={2023}
}