音楽生成モデル、気になりませんか?
Stability AI が公開した Stable Audio Open は、オープンソースとして利用できる数少ない音楽生成モデルです。公開直後から話題になりましたが、その実力は「曲作り」にも通用するのか──それとも「素材生成ツール」に留まるのか。
今回の検証では、ミドルレンジ GPU の代表格である RTX3060(12GB) を使い、ローカル環境で Stable Audio Open を動かしてみました。結果として見えてきたのは、6秒程度のジングル量産工場としてなら十分に実用になるという意外な強みでした。
47秒・16MBという固定長の WAV が毎回出力されるという癖や、日本語プロンプトが通用しないといった制約はあります。しかし、プロンプト設計を工夫し、短尺に切り出して量産する運用を組み合わせることで、動画イントロやサイトのオープニング効果音にそのまま使えるジングルを短時間で大量に得られるのです。
本記事では、環境構築から実験、そして「6秒ジングル工場」に仕立てるまでの工夫を紹介します。
環境構築とログイン
Stable Audio Open をローカルで動かすには、Hugging Face アカウントと Python 環境が必要です。以下は Windows + RTX3060 (12GB) を前提とした手順です。
Hugging Face アカウントの準備
- Hugging Face にサインアップ。
- モデルページ(例: stable-audio-open-1.0)にアクセスし、「Access」ボタンを押して利用規約に同意する。
- small / base それぞれで同意が必要。
- Access Tokens ページで Fine-grained Token を作成。
- 権限は最低限 「Read access to all public gated repos you can access」 をオンにする。
Python 環境構築
# 仮想環境を作成
python -m venv .venv
.venv\Scripts\activate
# 必要パッケージをインストール
pip install torch torchaudio torchvision --extra-index-url https://download.pytorch.org/whl/cu121
pip install huggingface_hub stable-audio-tools
- CUDA 12.1 版 PyTorch を指定。3060 の VRAM 12GB で動作確認済み。
stable-audio-toolsには Gradio UI やスクリプト群が含まれる。
Hugging Face CLI ログイン
hf auth login
- 発行した Token を入力すればログイン完了。
- PowerShell を使う場合、改行継続は
`バックティックで行う。
この準備を済ませると、Stable Audio Open を ローカルGPUで即実行可能 になります。
課題
Stable Audio Open を初期状態のまま実行すると、すぐにいくつかの問題に直面します。特に「ジングル用途」で使いたい場合、次の制約は避けて通れません。
出力が必ず 47秒固定
- モデル内部の設計上、常に約47秒(サンプリングレート 44.1kHz の16MB WAV) が出力される。
- 実際には 6秒だけ欲しくても、残りは長大な無音。
- ファイルサイズも大きく、扱いにくい。
尻切れや途中終了
- プロンプトに「with a clean ending」と書かない限り、途中で唐突に終わることが多い。
- ジングルとして使うには、終端処理が不自然。
日本語プロンプト非対応
- プロンプトは 英語のみ。
- 「和風」「演歌風」といった日本らしい音楽は生成が難しい。
ボーカル生成は不可
- Stable Audio Open はあくまでインストゥルメント専用。
- 歌声やボイス入り音楽は生成できない。
このままでは「ジングル工場」どころか、単なる長尺無音WAV生成器になってしまいます。
そこで次章では、これらの課題を解消するために組み込んだ 自作スクリプトの工夫 を紹介します。
解決策:6秒ジングル工場スクリプト
そこで導入したのが、47秒固定の出力を6秒ジングルに仕立て直す自作スクリプトです。
単なるループ実行ではなく、「音響処理の小ワザ」を盛り込むことで、素材としてそのまま使えるレベルに整えています。
生成AIは”数撃ちゃ当たる“精神でたくさん生成しないと気に入るフレーズには出会えません。
秒数トリム
- モデルの出力は常に47秒分の“器”。
- これを先頭6秒だけ切り出し、残りの無音部分は削除。
- ファイルサイズが毎回16MB → 1MB未満に軽量化。
フェードアウト処理
- 出力の終端はぶつ切りになりやすい。
- 12msのフェードアウトをかけることで、クリックノイズを防止し、自然に終わる。
- ジングルらしい“スパッとした締め”が得られる。
音量正規化
- 生成される音量はまちまち。
- ピークを揃えて**-1.0〜1.0の範囲に正規化**。
- 複数のジングルを並べても音量差が気にならない。
シード管理と量産
--seed -1を指定すると毎回ランダムシードが割り当てられる。- 同じプロンプトでも違うパターンが次々生成されるため、「数うちゃ当たる」方式で“当たりジングル”を引きやすい。
- 1本 ≈ 8秒で生成できるため、100本回しても十数分。
保存とログ
- 出力 WAV は「秒数」「ステップ数」「シード」を含んだファイル名で保存。
- さらに CSVログを残すようにしておけば、後から“どのプロンプト+シードで当たりが出たか”を再現できる。
使用コード
# batch_jingles.py
# Stable Audio Open で “6秒ジングル” を量産するスクリプト
# 依存: torch, torchaudio, einops, tqdm, stable-audio-tools, huggingface_hub(事前にHFログイン/同意)
# 例:
# python batch_jingles.py --model stabilityai/stable-audio-open-1.0 \
# --prompt "Format: Solo Synth | Genre: Electronic | Subgenre: Jingle, Bright, Uplifting, with a clean ending" \
# --count 20 --out out_jingles
import os
import csv
import time
import argparse
import numpy as np
import torch
import torchaudio
from einops import rearrange
from tqdm import trange
from stable_audio_tools import get_pretrained_model
from stable_audio_tools.inference.generation import generate_diffusion_cond
def fade_out(wav: torch.Tensor, sample_rate: int, ms: float = 12.0) -> torch.Tensor:
"""終端クリック防止の短いフェード。wav: [ch, n] (float32, -1..1)"""
if ms <= 0:
return wav
n = wav.shape[-1]
fade = int(sample_rate * (ms / 1000.0))
if fade <= 0 or fade >= n:
return wav
ramp = torch.linspace(1.0, 0.0, fade, dtype=wav.dtype, device=wav.device)
wav[:, -fade:] *= ramp
return wav
def save_wav_int16(path: str, wav: torch.Tensor, sample_rate: int):
"""float32 [-1,1] → int16 でコンパクトに保存。"""
wav = wav.clamp(-1, 1)
wav_i16 = (wav * 32767.0).to(torch.int16).cpu()
torchaudio.save(path, wav_i16, sample_rate, format="WAV", encoding="PCM_S", bits_per_sample=16)
def too_quiet(wav: torch.Tensor, thresh_db: float = -36.0) -> bool:
"""静かすぎるテイクをスキップ(任意)。"""
rms = torch.sqrt(torch.mean(wav**2) + 1e-12)
db = 20 * torch.log10(rms + 1e-12)
return db.item() < thresh_db
def main():
ap = argparse.ArgumentParser(description="Stable Audio Open: 6秒ジングル量産")
ap.add_argument("--model", type=str, required=True,
help="HF repo名(例: stabilityai/stable-audio-open-1.0 または ...-small)")
ap.add_argument("--prompt", type=str, required=True,
help="英語プロンプト。例: 'Format: Solo Synth | Genre: Electronic | Subgenre: Jingle, Bright, Uplifting, with a clean ending'")
ap.add_argument("--seconds", type=float, default=6.0, help="出力秒数(smallは<=9推奨)")
ap.add_argument("--steps", type=int, default=28, help="拡散ステップ数(品質/時間のトレードオフ)")
ap.add_argument("--count", type=int, default=20, help="生成本数")
ap.add_argument("--seed", type=int, default=-1, help="-1なら毎回ランダム。固定したいときは任意の整数")
ap.add_argument("--out", type=str, default="out", help="出力フォルダ")
ap.add_argument("--fade_ms", type=float, default=12.0, help="終端フェード(ms)")
ap.add_argument("--min_db", type=float, default=-36.0, help="静音スキップの閾値(dB)。無効化は極端な負の値に")
args = ap.parse_args()
os.makedirs(args.out, exist_ok=True)
csv_path = os.path.join(args.out, "manifest.csv")
write_header = not os.path.exists(csv_path)
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"[INFO] device={device}")
# モデル読み込み(半精度でVRAM節約)
model, model_config = get_pretrained_model(args.model)
sample_rate = int(model_config["sample_rate"])
sample_size = int(model_config["sample_size"]) # 内部は約47秒の“器”
model = model.to(device).half().eval()
if "open-small" in args.model and args.seconds > 9.0:
print("[WARN] small は ~9秒程度が上限目安。--seconds を9以下に下げることを推奨。")
with open(csv_path, "a", newline="", encoding="utf-8") as fcsv:
w = csv.writer(fcsv)
if write_header:
w.writerow(["path","seconds","steps","seed","prompt","duration_samples","elapsed_sec"])
for i in trange(args.count, desc="Generating"):
# シード
seed_i = (args.seed + i) if args.seed >= 0 else int(np.random.randint(0, 2**31 - 1))
conditioning = [{
"prompt": args.prompt,
"seconds_start": 0.0,
"seconds_total": float(args.seconds),
}]
t0 = time.time()
audio = generate_diffusion_cond(
model,
conditioning=conditioning,
sample_size=sample_size, # 47秒の器に生成
device=device,
steps=int(args.steps),
seed=seed_i,
)
# [b, ch, n] → [ch, n]
audio = rearrange(audio, "b d n -> d (b n)").to(torch.float32)
# 正規化
peak = torch.max(torch.abs(audio))
if peak > 0:
audio = audio / peak
# 必要秒数でトリム(47秒の無音を除去)
n_samples = int(sample_rate * args.seconds)
audio = audio[:, :n_samples]
# 終端フェード
audio = fade_out(audio, sample_rate, ms=args.fade_ms)
# 静かすぎるものはスキップ(任意)
if too_quiet(audio, thresh_db=args.min_db):
print("[SKIP] too quiet (RMS below threshold)")
continue
# 保存
name = f"{int(time.time())}_{i:03d}_s{args.seconds}_st{args.steps}_seed{seed_i}.wav"
path = os.path.join(args.out, name)
save_wav_int16(path, audio, sample_rate)
dt = time.time() - t0
print(f"[OK] {path} ({dt:.2f}s)")
# ログ
w.writerow([path, args.seconds, args.steps, seed_i, args.prompt, audio.shape[-1], round(dt, 2)])
if __name__ == "__main__":
main()
実行例(PowerShell)
※ PowerShell で改行する時はバックティック ` を使います。
python batch_jingles.py `
--model stabilityai/stable-audio-open-1.0 `
--prompt "Format: Solo Synth | Genre: Electronic | Subgenre: Jingle, Bright, Uplifting, with a clean ending" `
--seconds 6 --steps 28 --count 20 --out out_jingles
この仕組みによって、Stable Audio Open が単なる「47秒の無音付きWAV生成器」から、6秒ジングル素材工場へと変貌しました。
実験結果
RTX3060(12GB)環境で「6秒ジングル工場スクリプト」を実行した結果をまとめます。
生成速度
- 1本 ≈ 8秒 で完了。
- 20本バッチで ≈ 3分弱、100本回しても十数分。
- 実用的な速度で「数うちゃ当たる」戦法が可能。
出力サイズ
- 元は 47秒・16MB の固定長 WAV。
- トリム済みの 6秒ジングルでは 1MB。
- ストレージ負担も少なく、試行錯誤がしやすい。
プロンプト例
プロンプトは 英語必須。終端を自然にするには with a clean ending を加えるのが効果的。
"Format: Solo Synth | Genre: Electronic | Subgenre: Jingle, Bright, Uplifting, with a clean ending""Format: Band | Genre: Pop | Subgenre: Energizing Music, with a clean ending""Format: Keys | Genre: Electronic | Subgenre: Arpeggio, Cheerful, with a clean ending"
これらをランダムシードで量産すると、シンセのフレーズや短いリフがバリエーション豊かに得られる。
生成サンプル
バッチ生成した中から、いくつかサンプルをピックアップしました。
すべてMP3です。※音量注意
音質と実用性
- 音質は高品位で、プロのシンセ音源に匹敵。
- 音楽性はシンプルでループ感が強いが、イントロ・効果音・短尺BGMとしては十分。
- 6秒なら尻切れも気にならず、映像やWebの短い演出に自然に収まる。
制約と注意点
時間長の固定
Stable Audio Open の仕様上、生成される音声は 約47秒固定。
- ジングルとしては長すぎる。
- そのままでは16MB超の無駄に大きなファイルになる。
→ 今回のようにトリムして短縮する処理が必須。
曲の構造性は弱い
- イントロ → 展開 → エンディング のような人間的な曲構成は生まれない。
- 基本的に 短いループのバリエーション。
- with a clean ending を付けても「終わった感」を出すだけで、作曲的な起承転結は望めない。
プロンプトの限界
- 「Jingle」「Short Intro」などの表現は理解されにくい。
- 英語でのジャンル指定(Pop, Electronic, Ambient など)が中心。
- 欲しい雰囲気に近づけるには 大量試行 が前提。
GPUリソースの実際
- RTX3060クラスでも十分動作するが、大規模な曲作りには不向き。
- 長尺音楽やリアルタイム性は求められない。
- あくまで「短い素材をサクッと作る」用途向け。
利用上の注意
- 生成物のライセンスはオープンソースモデル準拠。商用利用可だが、著作権・クレジットの扱いは要確認。
- 音楽性はシンプルなため、そのまま配信サービスに流すような用途には不適。
- あくまで BGMの断片・ジングル・効果音代替と割り切ることが大切。
結論 ─ Stable Audio Openは“ジングル専用工場”
Stable Audio Openを実際に回してみると、以下の特徴が浮かび上がった。
- 音質は十分に高い:アナログシンセ風、アンビエント風、ブラス風など、質感そのものは即戦力。
- 構成力は弱い:起承転結のある曲は作れず、ジングルや短尺ループが限界。
- 秒数制御ができない:47秒固定の制約は大きいが、スクリプトでトリムすれば解決可能。
- GPU要件は低め:RTX3060クラスでも生成可能。ただし大量生成が前提になる。
総合すると、Stable Audio Openは 本格的な作曲ツールではない。
しかし「数を撃って当たりを拾う」スタイルなら、短いジングルや効果音を量産できる便利な素材工場になる。
動画の冒頭・終了、ポッドキャストの区切り、配信のジングルなど──
“ちょっと音が欲しい”場面で即戦力になるのが、このモデルの真価だ。
補足:ライセンスについて
Stable Audio Openは、Stability AIが公開している音楽生成モデルである。
兄弟分のStable Diffusionがクリエイティブ用途で広く商用利用可能になっているのと同様、このモデルも オープンライセンスで配布されている。
ただし、次の点には注意が必要だ:
- 学習データ由来の制約:生成物そのものは自由利用できるが、著名アーティストや特定楽曲を模倣するような使い方は権利侵害のリスクがある。
- 「音楽作品」としての利用:Stable Diffusionと同じく、生成結果に対して著作権は原則ユーザーに帰属する。ただし、配布プラットフォームや商用案件では各サービスの規約に従う必要がある。
- 音楽性の保証はなし:ライセンス的には自由でも、生成物はまだ“ジングル素材レベル”にとどまる点を理解して使うのが現実的。
つまり、Stable Audio Openは「安心して遊べるが、既存楽曲の代替にはならない」という立ち位置だ。
Stable Diffusionが“画像のネタ工場”として定着したように、Stable Audio Openも“短尺ジングル工場”として活用するのが健全な使い道といえる。

