今回の記事では音楽を自動で作成できるAudiocraftの実装を紹介します。
Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。
今回の内容
・Audiocraftとは
・Audiocraftの実装
Audiocraftとは
Audiocraftは、音楽生成のための容易に操作可能で簡潔なモデル、MusicGenのコードとモデルを提供するプラットフォームとして機能します。MusicGenモデルは、4つのコードブックを保持した32 kHz EnCodec トークナイザーを用いて、サンプリングレートが50Hzでトレーニングされた、一段階の自動回帰Transformerモデルとして定義されています。
このモデルは既存の手法、例えばMusicLMと異なる特性を持っています。MusicGenは自己教師ありのセマンティック表現を必要とせず、4つのコードブックを一度のパスで生成することが可能です。各コードブック間にわずかな遅延を設けることにより、それらのコードブックは並行して予測可能となります。これにより、音楽生成の自動回帰ステップは1秒あたり50ステップとなります。
詳細は以下のリンクからご確認ください。
Audiocraftの導入
ここからはGoogle colabを使用して、Audiocraftを実装していきましょう。
まずは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の実装を紹介しました。