audiocraft-audio-generation について
音声生成ワークフローを構築する開発者向けに、MetaのAudioCraftでテキストから音楽や音声を生成する方法を解説します。MusicGen、AudioGen、EnCodecを扱い、メロディーやスタイルによる条件付けも紹介します。
主な機能
- 01MusicGenによるテキストからの音楽生成
- 02AudioGenによるテキストからの音声生成
- 03メロディー条件付き生成
- 04参照音源に基づくスタイル生成
- 05EnCodecによる音声圧縮
活用シーン
- 01テキスト記述から音楽を作成
- 02効果音や環境音の生成
- 03音楽生成アプリの構築
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill audiocraft-audio-generationインストール後、Claude Code で/audiocraft-audio-generationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/advanced-usage.mdmusicgen-style-usage.mdmusicgen-usage.mdtroubleshooting.md詳細
AudioCraft:オーディオ生成
MusicGen、AudioGen、EnCodecを使用した、MetaのAudioCraftによるテキストから音楽・オーディオを生成するための包括的なガイドです。
AudioCraftを使用する場面
AudioCraftを使用する場面:
- テキストの説明から音楽を生成したい場合
- 効果音や環境音を作成する場合
- 音楽生成アプリケーションを構築する場合
- メロディー条件付きの音楽生成が必要な場合
- ステレオオーディオを出力したい場合
- スタイル転送による制御可能な音楽生成が必要な場合
主な機能:
- MusicGen:メロディー条件付けに対応したテキストから音楽への生成
- AudioGen:テキストから効果音への生成
- EnCodec:高忠実度のニューラルオーディオコーデック
- 複数のモデルサイズ:Small(300M)からLarge(3.3B)まで
- ステレオ対応:完全なステレオオーディオ生成
- スタイル条件付け:参照ベースの生成に対応したMusicGen-Style
代わりに以下を使用する場面:
- Stable Audio:より長い商用音楽を生成する場合
- Bark:音楽・効果音を含むテキスト読み上げの場合
- Riffusion:スペクトログラムベースの音楽生成の場合
- OpenAI Jukebox:歌詞付きの生オーディオ生成の場合
クイックスタート
インストール
# From PyPI
pip install audiocraft
# From GitHub (latest)
pip install git+https://github.com/facebookresearch/audiocraft.git
# Or use HuggingFace Transformers
pip install transformers torch torchaudio
基本的なテキストから音楽への生成(AudioCraft)
import torchaudio
from audiocraft.models import MusicGen
# Load model
model = MusicGen.get_pretrained('facebook/musicgen-small')
# Set generation parameters
model.set_generation_params(
duration=8, # seconds
top_k=250,
temperature=1.0
)
# Generate from text
descriptions = ["happy upbeat electronic dance music with synths"]
wav = model.generate(descriptions)
# Save audio
torchaudio.save("output.wav", wav[0].cpu(), sample_rate=32000)
HuggingFace Transformersの使用
from transformers import AutoProcessor, MusicgenForConditionalGeneration
import scipy
# Load model and processor
processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
model.to("cuda")
# Generate music
inputs = processor(
text=["80s pop track with bassy drums and synth"],
padding=True,
return_tensors="pt"
).to("cuda")
audio_values = model.generate(
**inputs,
do_sample=True,
guidance_scale=3,
max_new_tokens=256
)
# Save
sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("output.wav", rate=sampling_rate, data=audio_values[0, 0].cpu().numpy())
AudioGenによるテキストからサウンドへの生成
from audiocraft.models import AudioGen
# Load AudioGen
model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=5)
# Generate sound effects
descriptions = ["dog barking in a park with birds chirping"]
wav = model.generate(descriptions)
torchaudio.save("sound.wav", wav[0].cpu(), sample_rate=16000)
基本概念
アーキテクチャの概要
AudioCraft Architecture:
┌──────────────────────────────────────────────────────────────┐
│ Text Encoder (T5) │
│ │ │
│ Text Embeddings │
└────────────────────────┬─────────────────────────────────────┘
│
┌────────────────────────▼─────────────────────────────────────┐
│ Transformer Decoder (LM) │
│ Auto-regressively generates audio tokens │
│ Using efficient token interleaving patterns │
└────────────────────────┬─────────────────────────────────────┘
│
┌────────────────────────▼─────────────────────────────────────┐
│ EnCodec Audio Decoder │
│ Converts tokens back to audio waveform │
└──────────────────────────────────────────────────────────────┘
モデルのバリエーション
| モデル | サイズ | 説明 | 用途 |
|---|---|---|---|
musicgen-small | 300M | テキストから音楽 | 高速な生成 |
musicgen-medium | 1.5B | テキストから音楽 | バランス型 |
musicgen-large | 3.3B | テキストから音楽 | 最高品質 |
musicgen-melody | 1.5B | テキスト+メロディー | メロディー条件付け |
musicgen-melody-large | 3.3B | テキスト+メロディー | 最高のメロディー生成 |
musicgen-stereo-* | さまざま | ステレオ出力 | ステレオ生成 |
musicgen-style | 1.5B | スタイル転送 | 参照ベース |
audiogen-medium | 1.5B | テキストからサウンド | 効果音 |
生成パラメーター
| パラメーター | デフォルト | 説明 |
|---|---|---|
duration | 8.0 | 長さ(秒)(1~120) |
top_k | 250 | Top-kサンプリング |
top_p | 0.0 | Nucleusサンプリング(0 = 無効) |
temperature | 1.0 | サンプリング温度 |
cfg_coef | 3.0 | 分類器フリーガイダンス |
MusicGenの使用方法
詳細、コード例、パラメーター表については、references/musicgen-usage.mdを参照してください。この手順が該当する場合に読み進めてください。
MusicGen-Styleの使用方法
詳細、コード例、パラメーター表については、references/musicgen-style-usage.mdを参照してください。この手順が該当する場合に読み進めてください。
AudioGenの使用方法
効果音の生成
from audiocraft.models import AudioGen
import torchaudio
model = AudioGen.get_pretrained('facebook/audiogen-medium')
model.set_generation_params(duration=10)
# Generate various sounds
descriptions = [
"thunderstorm with heavy rain and lightning",
"busy city traffic with car horns",
"ocean waves crashing on rocks",
"crackling campfire in forest"
]
wav = model.generate(descriptions)
for i, audio in enumerate(wav):
torchaudio.save(f"sound_{i}.wav", audio.cpu(), sample_rate=16000)
EnCodecの使用方法
オーディオ圧縮
from audiocraft.models import CompressionModel
import torch
import torchaudio
# Load EnCodec
model = CompressionModel.get_pretrained('facebook/encodec_32khz')
# Load audio
wav, sr = torchaudio.load("audio.wav")
# Ensure correct sample rate
if sr != 32000:
resampler = torchaudio.transforms.Resample(sr, 32000)
wav = resampler(wav)
# Encode to tokens
with torch.no_grad():
encoded = model.encode(wav.unsqueeze(0))
codes = encoded[0] # Audio codes
# Decode back to audio
with torch.no_grad():
decoded = model.decode(codes)
torchaudio.save("reconstructed.wav", decoded[0].cpu(), sample_rate=32000)
一般的なワークフロー
ワークフロー1:音楽生成パイプライン
import torch
import torchaudio
from audiocraft.models import MusicGen
class MusicGenerator:
def __init__(self, model_name="facebook/musicgen-medium"):
self.model = MusicGen.get_pretrained(model_name)
self.sample_rate = 32000
def generate(self, prompt, duration=30, temperature=1.0, cfg=3.0):
self.model.set_generation_params(
duration=duration,
top_k=250,
temperature=temperature,
cfg_coef=cfg
)
with torch.no_grad():
wav = self.model.generate([prompt])
return wav[0].cpu()
def generate_batch(self, prompts, duration=30):
self.model.set_generation_params(duration=duration)
with torch.no_grad():
wav = self.model.generate(prompts)
return wav.cpu()
def save(self, audio, path):
torchaudio.save(path, audio, sample_rate=self.sample_rate)
# Usage
generator = MusicGenerator()
audio = generator.generate(
"epic cinematic orchestral music",
duration=30,
temperature=1.0
)
generator.save(audio, "epic_music.wav")
ワークフロー2:サウンドデザインのバッチ処理
import json
from pathlib import Path
from audiocraft.models import AudioGen
import torchaudio
def batch_generate_sounds(sound_specs, output_dir):
"""
Generate multiple sounds from specifications.
Args:
sound_specs: list of {"name": str, "description": str, "duration": float}
output_dir: output directory path
"""
model = AudioGen.get_pretrained('facebook/audiogen-medium')
output_dir = Path(output_dir)
output_dir.mkdir(exist_ok=True)
results = []
for spec in sound_specs:
model.set_generation_params(duration=spec.get("duration", 5))
wav = model.generate([spec["description"]])
output_path = output_dir / f"{spec['name']}.wav"
torchaudio.save(str(output_path), wav[0].cpu(), sample_rate=16000)
results.append({
"name": spec["name"],
"path": str(output_path),
"description": spec["description"]
})
return results
# Usage
sounds = [
{"name": "explosion", "description": "massive explosion with debris", "duration": 3},
{"name": "footsteps", "description": "footsteps on wooden floor", "duration": 5},
{"name": "door", "description": "wooden door creaking and closing", "duration": 2}
]
results = batch_generate_sounds(sounds, "sound_effects/")
ワークフロー3:Gradioデモ
import gradio as gr
import torch
import torchaudio
from audiocraft.models import MusicGen
model = MusicGen.get_pretrained('facebook/musicgen-small')
def generate_music(prompt, duration, temperature, cfg_coef):
model.set_generation_params(
duration=duration,
temperature=temperature,
cfg_coef=cfg_coef
)
with torch.no_grad():
wav = model.generate([prompt])
# Save to temp file
path = "temp_output.wav"
torchaudio.save(path, wav[0].cpu(), sample_rate=32000)
return path
demo = gr.Interface(
fn=generate_music,
inputs=[
gr.Textbox(label="Music Description", placeholder="upbeat electronic dance music"),
gr.Slider(1, 30, value=8, label="Duration (seconds)"),
gr.Slider(0.5, 2.0, value=1.0, label="Temperature"),
gr.Slider(1.0, 10.0, value=3.0, label="CFG Coefficient")
],
outputs=gr.Audio(label="Generated Music"),
title="MusicGen Demo"
)
demo.launch()
パフォーマンスの最適化
メモリーの最適化
# Use smaller model
model = MusicGen.get_pretrained('facebook/musicgen-small')
# Clear cache between generations
torch.cuda.empty_cache()
# Generate shorter durations
model.set_generation_params(duration=10) # Instead of 30
# Use half precision
model = model.half()
バッチ処理の効率化
# Process multiple prompts at once (more efficient)
descriptions = ["prompt1", "prompt2", "prompt3", "prompt4"]
wav = model.generate(descriptions) # Single batch
# Instead of
for desc in descriptions:
wav = model.generate([desc]) # Multiple batches (slower)
GPUメモリー要件
| モデル | FP32 VRAM | FP16 VRAM |
|---|---|---|
| musicgen-small | ~4GB | ~2GB |
| musicgen-medium | ~8GB | ~4GB |
| musicgen-large | ~16GB | ~8GB |
よくある問題
| 問題 | 解決策 |
|---|---|
| CUDA OOM | 小さいモデルを使用するか、再生時間を短くしてください |
| 品質が低い | cfg_coefを大きくし、より良いプロンプトを使用してください |
| 生成時間が短すぎる | 最大再生時間の設定を確認してください |
| オーディオにアーティファクトがある | temperatureを変えてみてください |
| ステレオが機能しない | ステレオモデルのバリエーションを使用してください |
参考資料
- 高度な使用方法 - トレーニング、ファインチューニング、デプロイ
- トラブルシューティング - よくある問題と解決策
リソース
- GitHub: https://github.com/facebookresearch/audiocraft
- 論文(MusicGen): https://arxiv.org/abs/2306.05284
- 論文(AudioGen): https://arxiv.org/abs/2209.15352
- HuggingFace: https://huggingface.co/facebook/musicgen-small
- デモ: https://huggingface.co/spaces/facebook/MusicGen
エージェントの作業手順
- 環境を確認します。 GPU メモリ、モデルのチェックポイントとライセンス、フレームワークのバージョン、入力形式を確認します。
- 入力を明確にします。 データまたはユーザーから形式、識別子、パラメーターを確認します。結果に影響する値は推測せず、質問します。
- まず小規模に実行します。 最初は単一のサンプルを低解像度または短い長さで推論します。
- 上記の手順と参考資料を使用して、タスク全体を実行します。
- 結果を検証します。 出力を定性的に、またタスクの指標を使って確認し、生成コンテンツに関するライセンス上の制限も確認します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、まだ不明な点を伝えます。
| 問題 | 対応 |
|---|---|
| 大きな入力でメモリ不足が発生する | 解像度またはシーケンス長を小さくする、半精度を使う、または入力を分割します。 |
| この手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンに存在しない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して調整し、その旨をユーザーに伝えます。API を決してでっち上げないでください。 |
| 必須の入力、識別子、パラメーターが曖昧である | ユーザーに質問するか、実行前に仮定を明示します。 |
誠実性に関するルール
- 結果、パラメーター、識別子、引用、統計情報を決して捏造しないでください。実行または検証できない場合は、その旨を明確に伝えてください。
- 商用利用または公開利用の前に、モデルとデータセットのライセンスを確認してください。
- ここに記載されているバージョン固有の情報は古くなっている可能性があるものとして扱い、インストール済みバージョンの公式ドキュメントで確認してください。
- 費用が発生する操作、共有 GPU またはクラウドのクォータを消費する操作、個人データまたは患者データを扱う操作、取り消せない操作を行う前に確認してください。
関連スキル
transformers:Hugging Face Transformers を使用して、Hub モデルの読み込み、パイプライン推論の実行、テキスト生成、NLP、ビジョン、オーディオ向けの Trainer によるファインチューニングを行います…
コメント
Markdown 対応