audiocraftをためしてみる
Audiocraft is a PyTorch library for deep learning research on audio generation. At the moment, it contains the code for MusicGen, a state-of-the-art controllable text-to-music model.
MusicGenは以前も別のものを試してみたことがあるけど、その時の感想としては、
- プロンプトに合致した音楽かどうかが微妙だった
- 聞いてて心地よいか?ということとは別
だったので、まだ時期尚早というふうに感じた。その点も念頭に置いて試してみる。
手っ取り早く試すにはGradioのデモが用意されているのでそちらで。
ここではちょっとコードも見てみたいので手元で試していく。
pyenv-virtualenv&Jupyter Labで試す。pythonは3.10.11。
$ pip install jupyterlab ipywidgets
$ jupyter-lab --ip='0.0.0.0'
以降はJupyter Labで。
audiocraftのインストールは3つの方法があるが、今回はレポジトリをクローンしてパッケージをインストールすることとする。レポジトリ内にnotebookがあるため。
!pip install 'torch>=2.0'
!git clone https://github.com/facebookresearch/audiocraft
%cd audiocraft
!pip install -e .
クローンしたレポジトリにdemo.ipynb
があるのでこれを開いて上から順に実行していけばOK。
ということで順に追っていく。
最初にモデルの指定。モデルはsmall(300M)/medium(1.5B)/melody(1.5B)/large(3.3B)の4種類。まずはsmallから。実行すると初回はモデルがダウンロードされる。ちなみにlargeは結構時間がかかった。
from audiocraft.models import MusicGen
model = MusicGen.get_pretrained('small')
次に生成パラメータを指定する。LLMとかでもおなじみのものがちらほら。とりあえず以下はデフォルト値を並べてみた。durationが生成される音楽の長さになる。
model.set_generation_params(
use_sampling=True,
top_k=250,
top_p=0.0,
temperature=1.0,
duration=30.0,
cfg_coef=3.0,
)
でここから4つの音楽生成方法があるようなので順にやっていく。
- Unconditional samples using
model.generate_unconditional
- Music continuation using
model.generate_continuation
- Text-conditional samples using
model.generate
- Melody-conditional samples using
model.generate_with_chroma
Unconditional Generation
なにも条件をつけずに完全にランダムで生成する、ということだと思う。
from audiocraft.utils.notebook import display_audio
output = model.generate_unconditional(num_samples=2, progress=True)
display_audio(output, sample_rate=32000)
Music Continuation
音楽の冒頭部分を渡して、それに対してプロンプトに従って続きを生成する、というものの様子。2つの例として、冒頭部分の音楽を直接torchaudioで生成した場合と、mp3ファイルを読み込んでwavにする場合が紹介されている。
まず最初の例。「ビッビッ」というビープ音が生成されている。
import math
import torchaudio
import torch
from audiocraft.utils.notebook import display_audio
def get_bip_bip(bip_duration=0.125, frequency=440,
duration=0.5, sample_rate=32000, device="cuda"):
"""Generates a series of bip bip at the given frequency."""
t = torch.arange(
int(duration * sample_rate), device="cuda", dtype=torch.float) / sample_rate
wav = torch.cos(2 * math.pi * 440 * t)[None]
tp = (t % (2 * bip_duration)) / (2 * bip_duration)
envelope = (tp >= 0.5).float()
return wav * envelope
display_audio(get_bip_bip(), 32000)
この音源と、2つのプロンプトを渡すと、それぞれのプロンプトに従った音源の続きが生成される。
res = model.generate_continuation(
get_bip_bip(0.125).expand(2, -1, -1),
32000, ['Jazz jazz and only jazz',
'Heartful EDM with beautiful synths and chords'],
progress=True)
display_audio(res, 32000)
再生してみると、最初は同じビープ音で始まって、その後が異なる音楽になっているのがわかる。
音楽ファイルを読み込んで続きを生成する場合はこんな感じ。
prompt_waveform, prompt_sr = torchaudio.load("./assets/bach.mp3")
prompt_duration = 2
prompt_waveform = prompt_waveform[..., :int(prompt_duration * prompt_sr)]
display_audio(prompt_waveform, 32000)
output = model.generate_continuation(prompt_waveform, prompt_sample_rate=prompt_sr, progress=True)
display_audio(output, sample_rate=32000)
上記の例では、mp3ファイルにはバッハの「運命」の冒頭だけが含まれていてその続きを生成している。生成された続きは雰囲気は同じだけど旋律は「運命」とは異なるものになっていた。
上記の例ではプロンプトは指定していないが、以下のようにdescriptionを指定できる。その場合、音源はpromptとして指定する。一般的にいうプロンプトとはちょっと意味合いが違うのか。
output = model.generate_continuation(prompt=prompt_waveform, prompt_sample_rate=prompt_sr, progress=True, descriptions=['Game Music for Knight-and-magic-like RPG'])
Text-conditional Generation
プロンプトだけで音楽を生成する。
from audiocraft.utils.notebook import display_audio
output = model.generate(
descriptions=[
'80s pop track with bassy drums and synth',
'90s rock song with loud guitars and heavy drums',
],
progress=True
)
display_audio(output, sample_rate=32000)
なんかすごいそれっぽくて懐かしいのが流れてきたw
Melody-conditional Generation
メロディの音源の雰囲気はそのままに、プロンプトに沿った形で音楽を生成する。この場合は専用のモデルが必要になる様子。
import torchaudio
from audiocraft.utils.notebook import display_audio
model = MusicGen.get_pretrained('melody')
model.set_generation_params(duration=20)
melody_waveform, sr = torchaudio.load("assets/bach.mp3")
melody_waveform = melody_waveform.unsqueeze(0).repeat(2, 1, 1)
output = model.generate_with_chroma(
descriptions=[
'80s pop track with bassy drums and synth',
'90s rock song with loud guitars and heavy drums',
],
melody_wavs=melody_waveform,
melody_sample_rate=sr,
progress=True
)
display_audio(output, sample_rate=32000)
鼻歌とかのメロディーに伴奏付けてくれたりとかってのができると思う。
気になるリソースだけど、nvidia-smi見てる限り、small/melodyで10GB、largeだと18GBぐらいだった。
まとめ
- 以前に試して別の物とは違って、プロンプトの指定に沿った形で生成されるので、ある程度期待した通りというか、イメージしていたものに近いものが生成された。
- text completionやimage uncropみたいな感じで、続きを生成してくれるなど、いくつかモードがあるのも面白い。
MusicGenはまだまだ先だなーと思ってたけど、もうここまでのものができてるのか、というところに素直に驚いた。このレベルなら「技術的には」実際のユースケースで使える日はそんなに遠くんなさそうに思える。特に、Melody-conditional Generationなんかはミュージシャンの作曲支援とかでとても良さそうに思える。
気になったのはどういうデータセットを使っているか、というところだけど、レポジトリトップに以下とあった。
We use 20K hours of licensed music to train MusicGen. Specifically, we rely on an internal dataset of 10K high-quality music tracks, and on the ShutterStock and Pond5 music data.
なるほど、少なくとも大手音楽出版のものは含まれていないと。どうしてもこの辺の課題は出てくるよなー。まあLLMもそうだしStable Diffusionあたりも同じではある。
ちなみにAudiocraftのライセンスは以下となっていた。実質商用利用はできないってことになるのかな。
The code in this repository is released under the MIT license as found in the LICENSE file.
The weights in this repository are released under the CC-BY-NC 4.0 license as found in the LICENSE_weights file.