今回の記事では音楽を自動で作成できるAudiocraftの実装を紹介します。

Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。

今回の内容

・Audiocraftとは

・Audiocraftの実装

Audiocraftとは

Audiocraftは、音楽生成のための容易に操作可能で簡潔なモデル、MusicGenのコードとモデルを提供するプラットフォームとして機能します。MusicGenモデルは、4つのコードブックを保持した32 kHz EnCodec トークナイザーを用いて、サンプリングレートが50Hzでトレーニングされた、一段階の自動回帰Transformerモデルとして定義されています。

このモデルは既存の手法、例えばMusicLMと異なる特性を持っています。MusicGenは自己教師ありのセマンティック表現を必要とせず、4つのコードブックを一度のパスで生成することが可能です。各コードブック間にわずかな遅延を設けることにより、それらのコードブックは並行して予測可能となります。これにより、音楽生成の自動回帰ステップは1秒あたり50ステップとなります。

詳細は以下のリンクからご確認ください。

Audiocraftの導入

ここからはGoogle colabを使用して、Audiocraftを実装していきましょう。

Open In Colab

まずはGPUを使用できるように設定をします。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

Googleドライブをマウントします。

from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive

公式リポジトリをクローンします。

!git clone https://github.com/facebookresearch/audiocraft
%cd audiocraft

必要なライブラリをインストールします。

!pip install -U audiocraft

無条件サンプル生成(model.generate_unconditional)

まずは無条件サンプルにより音楽を生成します。

学習済モデルを選択します。

from audiocraft.models import MusicGen

# Using small model, better results would be obtained with `medium` or `large`.
model = MusicGen.get_pretrained('medium')

パラメータを設定します。

model.set_generation_params(
    use_sampling=True,
    top_k=250,
    duration=30
)

# use_sampling(bool、オプション):Trueの場合、サンプリングを使用します。それ以外の場合はargmaxデコーディングを行います。デフォルトはTrueです。
# top_k(int、オプション):サンプリングに使用されるtop_kの値。デフォルトは250です。
# top_p(float、オプション):サンプリングに使用されるtop_pの値。これが0に設定された場合、top_kが使用されます。デフォルトは0.0です。
# temperature(float、オプション):softmaxの温度パラメータ。デフォルトは1.0です。
# duration(float、オプション):生成される波形の持続時間。デフォルトは30.0です。
# cfg_coef(float、オプション):分類器フリーガイダンスに使用される係数。デフォルトは3.0です。

音楽を生成します。

from audiocraft.utils.notebook import display_audio

output = model.generate_unconditional(num_samples=2, progress=True)
display_audio(output, sample_rate=32000)

無条件サンプルによる音楽が2つ生成できました。

生成した音楽ファイルを保存することができます。

from audiocraft.data.audio import audio_write
for idx, one_wav in enumerate(output):
    audio_write(f'unconditional_{idx}', one_wav.cpu(),sample_rate = 32000,strategy="loudness", loudness_compressor=True)

テキストによる音楽生成(model.generate)

次にテキスト(プロンプト)を与えて、音楽を生成してみます。

以下の例では、①「80s pop track with bassy drums and synth」、②「90s rock song with loud guitars and heavy drums」というテキストから2つの音楽を生成します。

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)

結果を保存します。

from audiocraft.data.audio import audio_write
for idx, one_wav in enumerate(output):
    # Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
    audio_write(f'generate_{idx}', one_wav.cpu(),sample_rate = 32000,strategy="loudness", loudness_compressor=True)

テキスト+音声から新しい音楽を生成(model.generate_with_chroma)

次に元からある音楽に対してテキスト(プロンプト)を与えて、新たな音楽を生成してみます。

まずは元となる音楽を指定します。

import torchaudio
from audiocraft.utils.notebook import display_audio

model = MusicGen.get_pretrained('melody')
model.set_generation_params(duration=30)

melody_waveform, sr = torchaudio.load("assets/bach.mp3")
melody_waveform = melody_waveform.unsqueeze(0).repeat(2, 1, 1)
display_audio(melody_waveform, sample_rate=32000)

指定した音楽に対してテキスト(プロンプト)を与えて、音楽を生成してみます。

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)

以下の例では、①「80s pop track with bassy drums and synth」、②「90s rock song with loud guitars and heavy drums」というテキストから2つの音楽を生成します。

from audiocraft.data.audio import audio_write
for idx, one_wav in enumerate(output):
    # Will save under {idx}.wav, with loudness normalization at -14 db LUFS.
    audio_write(f'{idx}', one_wav.cpu(),sample_rate = 32000,strategy="loudness", loudness_compressor=True)

まとめ

最後までご覧いただきありがとうございました。

今回の記事では音楽を自動で作成できるAudiocraftの実装を紹介しました。

コメントを残す