Closed3

audiocraftをためしてみる

kun432kun432

https://github.com/facebookresearch/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は以前も別のものを試してみたことがあるけど、その時の感想としては、

  • プロンプトに合致した音楽かどうかが微妙だった
  • 聞いてて心地よいか?ということとは別

だったので、まだ時期尚早というふうに感じた。その点も念頭に置いて試してみる。

kun432kun432

手っ取り早く試すにはGradioのデモが用意されているのでそちらで。

https://huggingface.co/spaces/facebook/MusicGen

ここではちょっとコードも見てみたいので手元で試していく。

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ぐらいだった。

kun432kun432

まとめ

  • 以前に試して別の物とは違って、プロンプトの指定に沿った形で生成されるので、ある程度期待した通りというか、イメージしていたものに近いものが生成された。
  • 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.

このスクラップは2023/06/11にクローズされました