AIによる音楽生成は、近年特に注目を集める分野です。Suno AIのV3が話題を呼ぶ一方で、商用利用も可能な完全オープンなソリューションとして、Metaが開発したMusicGenがMindSpore NLPを通じて利用可能になりました。
MusicGenは、テキストプロンプトや既存のオーディオを条件として、高品質な音楽波形を直接生成できる単一Transformerベースのモデルです。MindSpore NLPではHugging Faceとの互換性を重視し、動的グラフによる柔軟な実装により、最新のSOTAモデルを迅速に統合・実行できます。
準備:モデルのロード
まず、軽量版の`musicgen-small`を読み込みます。これは推論速度が優れており、開発・検証段階に最適です。
from mindnlp.transformers import MusicgenForConditionalGeneration
generator = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
サポートされるモデルサイズには`small`(推奨:高速)、`medium`(バランス)、`big`(高品質)があり、用途に応じて選択可能です。
生成戦略の選択
MusicGenは「貪欲探索(greedy)」と「確率的サンプリング(sampling)」の2種類のデコード方式をサポートします。実験結果から、`do_sample=True`を指定したサンプリング方式の方が音楽的な多様性と自然さが顕著に向上します。本ガイドではすべてこの方式を採用します。
パターン1:無条件生成(ランダム音楽)
明示的な入力なしで、モデル自身が初期状態をランダムに決定して音楽を構成します。
uncond_input = generator.get_unconditional_inputs(num_samples=1)
waveform = generator.generate(**uncond_input, do_sample=True, max_new_tokens=768)
出力されたテンソルをWAV形式で保存するには、以下のように処理します:
import scipy
sr = generator.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("random_music.wav", rate=sr, data=waveform[0, 0].asnumpy())
パターン2:テキスト条件付き生成
自然言語によるスタイル指示で音楽を制御します。`AutoProcessor`でテキストをトークン化・埋め込み変換します。
from mindnlp.transformers import AutoProcessor
proc = AutoProcessor.from_pretrained("facebook/musicgen-small")
text_prompts = [
"jazz fusion piece with walking bass and syncopated piano",
"ambient electronic track with soft pads and slow arpeggios"
]
processed = proc(
text=text_prompts,
padding=True,
return_tensors="ms"
)
output = generator.generate(
**processed,
do_sample=True,
guidance_scale=3.0,
max_new_tokens=768
)
scipy.io.wavfile.write("text_conditioned.wav", rate=sr, data=output[0, 0].asnumpy())
`guidance_scale`はテキスト条件への従順度を調整するパラメータで、値が大きいほどプロンプトの意図に忠実になります。
パターン3:オーディオ条件付き生成(スタイル転送)
既存の音声クリップを入力として、そのリズム・トーンを継承しつつ新しい楽曲を生成します。ここでは`datasets`ライブラリでGTZANデータセットからサンプルを取得します。
from datasets import load_dataset
import numpy as np
ds = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample_audio = next(iter(ds))["audio"]
# 長さを半分に短縮(処理負荷軽減)
truncated = sample_audio["array"][:len(sample_audio["array"]) // 2]
audio_input = proc(
audio=truncated,
sampling_rate=sample_audio["sampling_rate"],
text=["funky 70s soul groove with Hammond organ"],
padding=True,
return_tensors="ms"
)
generated = generator.generate(
**audio_input,
do_sample=True,
guidance_scale=3.5,
max_new_tokens=256
)
scipy.io.wavfile.write("audio_conditioned.wav", rate=sr, data=generated[0, 0].asnumpy())
アーキテクチャ概要
MusicGenは、以下の3つのコンポーネントから構成されます:
- テキストエンコーダー:t5-baseをそのまま利用し、入力文を連続潜在表現へマッピング
- 音楽LMデコーダー:離散化された音響トークン列を予測するTransformer(ゼロから学習済み)
- 音響復元モジュール:EnCodec(32kHz)でトークンを波形へ再構成
従来のマルチステージ設計とは異なり、MusicGenは単一の言語モデルで全工程を統合。これにより、生成品質と制御性の両立を実現しています。