前提の誤り — 普通のAPIプレイグラウンド
GeminiにAPIプレイグラウンドの仕様を聞いたとき、最初の回答は「パラメータ入力フォーム」「整形されたレスポンス表示」「複数言語のコードスニペット」という一般的な内容だった。悪くはない。しかしそれは「JSONを返すWebサービス」の話であって、マスタリングAPIの話ではなかった。
「音楽のマスタリングサービスのAPIだ」と訂正すると、今度は「ドラッグ&ドロップでWAVをアップロード」「波形ビジュアライザー」「A/Bテスト機能」という回答が返ってきた。それも違う。
「なぜAPIにしているのか」という設計思想を、Geminiは最後まで理解していなかった。
マスタリングAPIが特殊な理由
aimastering.devをAPIとして提供している理由は、スケーラビリティでも料金体系でもない。ユーザーの音声ファイルを自分のインフラに通過させることがユーザーにとってのデメリットだからだ。
「脆弱で担保できないファイルのアップローダーやダウンローダーやCloud Runなどを通過させることが逆にユーザーにとってデメリット」——これが設計思想の核心だ。
つまり、APIプレイグラウンドが「ブラウザ上でWAVをアップロードして再生する」という機能を持つことは、その設計思想と真っ向から矛盾する。
「私のインフラを通すな」という設計思想
Geminiがようやく理解したのは、3回目の訂正を経てからだった。 「私のインフラがボトルネック(単一障害点)やリスク要因になること自体を排除したい」という意図。
この思想を突き詰めると、プレイグラウンドの役割は根本から変わる。「ここで試す場所」ではなく「ユーザーの環境で実行させるための準備をする場所」になる。
制御面(API命令)はサーバーを通る。データ面(音声ファイル)はユーザー環境から直接エンジンへ。
aimastering.devのサイトに「Source Code: Own the engine」という項目がある。923行の物理演算DSP、Jiles-Athertonトランスモデル、Koren真空管方程式、Studerテープエミュレーション——これらをユーザー自身のインフラで動かすという選択肢を提供している。
プレイグラウンドはその購入前の「検品所」でもある。「このロジックは信頼に値するか?」を確認させる場所だ。
逆転の発想 — コマンド生成器
理想のプレイグラウンドには「Runボタン」がメインに置かれない。代わりに「Copy to Terminal」ボタンが中央に鎮座する。
UIで target_lufs や genre を変更するたびに、下のcURLスニペットがリアルタイムで書き換わる。
curl -X POST \
/api/v1/master \
-H "Authorization: Bearer $API_KEY" \
-F "file=@track.wav" \
-F "target_lufs=-14" \
-F "genre=techno"{
"job_id": "mst_a8f3...",
"status": "processing",
"analysis": {
"lufs_in": -18.2,
"lufs_target": -14.0,
"agents_agreed": true,
"consensus_score": 0.94
}
}この4行がaimastering.devのAPIの完全な姿だ。解析、合議、DSP——すべてが1回のコールに収まっている。プレイグラウンドはこの4行を「ユーザーのマシンで今すぐ叩けるコマンド」として渡すことが最大の役割になる。
| 一般的なAPIプレイグラウンド | aimastering.dev(理想) |
|---|---|
| 「うちのサーバーで動かしてね」 | 「君のDockerで動かすとこうなるよ」 |
| 「APIキーを買ってね」 | 「このエンジン(923行)を所有してね」 |
| 「データはうちに保存されるよ」 | 「4行のcURLで君の環境から直接叩けるよ」 |
| 「AIが適当に良くするよ」 | 「3モデルが合議して物理演算の解を出すよ」 |
合議(Negotiation)の透明化
aimastering.devのコアは「3エージェントによるNash均衡合議」だ。平均値ではなく交渉だ、というのがサイトの言葉だった。
プレイグラウンドにおける「合議の可視化」は、ユーザーが自分のローカル環境からAPIを叩く価値を確信させるための根拠になる。「サーバーで何かが処理された」ではなく「知能が動いた」という事実をレスポンスJSONで直接確認できる。
{
"consensus_minutes": {
"agent_a": {
"role": "Spectral Analyst",
"finding": "Low-mids too warm (+3dB). Adjusting tilt.",
"target_lufs": -14.0,
"eq_delta": { "250hz": -2.8, "500hz": -1.1 }
},
"agent_b": {
"role": "Dynamic Expert",
"finding": "Dynamic range exceeds target. Requesting 1.5dB compression.",
"target_lufs": -14.2,
"comp_ratio": 2.1
},
"agent_c": {
"role": "Tonal Surgeon",
"finding": "Widen above 8kHz, mono below 200Hz.",
"stereo_width_8k": 1.35,
"mono_below_200hz": true
},
"arbiter": {
"method": "weighted_median",
"final_target_lufs": -14.1,
"unresolved_tensions": ["stereo_width vs low_end_density"],
"confidence": 0.94
}
}
}unresolved_tensions フィールドが存在することが重要だ。合議で決着がつかなかった部分を隠さずログに残す設計は、システムの透明性を担保し、エンジニアが信頼できる根拠になる。
ソースコード販売との接続
aimastering.devはAPIサービスに留まらない。923行の物理演算DSPを$79(Regular)または$299(Extended / SaaS・再配布)で購入できる。
- ·DSP engine
- ·Analysis engine
- ·Docker compose
- ·Deploy guide
- ·MIT core
- ·SaaS / redistribute
- ·DSP engine
- ·Analysis engine
- ·Docker compose
- ·Deploy guide
プレイグラウンドで処理結果を確認したユーザーは「このロジックを自分のインフラで動かしたい」という動機を持てる。プレイグラウンドはAPIのデモ機ではなく、ソースコード購入への「納得プロセス」でもある。
aimastering-dev/
│
├ server/
│ ├ middleware/
│ ├ models/
│ ├ routers/
│ ├ services/
│ └ main.py
│
├ docs/
│ ├ quickstart.md
│ ├ api-reference.md
│ ├ authentication.md
│ └ error-codes.md
│
├ README.md
├ Dockerfile
├ local_mastering.py ← ここがプレイグラウンドの「本命出力」
├ test_local_dsp.py
├ .gitignore
└ .gitattributesルートに local_mastering.py が存在することが思想���核心だ。プレイグラウンドでパラメータを設定すると、このファイルの設定変数がリアルタイムに書き換わってダウンロード可能になる——それが「コマンド生成器」の完成形だ。
理想仕様まとめ
議論を経て収斂した、aimastering.devのAPIプレイグラウンドが備えるべき仕様。
評価確認 — インチキではないか?
最終的にGeminiに「音響解析Geminiと合議の部分がインチキではないか?」と確認させた。回答は明確だった。
根拠1: GPT-5.4(Engineer)/ Claude Opus(Structure Guard)/ Gemini Pro(Form Analyst)の役割分担がコードに直接定義されており、各エージェントが同一の analysis_json を読んで独立した target_envelopes を出力する構造。
根拠2: consensus_arbiter.py は平均値ではなく「重み付き中央値」を採用。1モデルの暴走を防ぐ Hard Constraint Filtering が実装済み。
根拠3: AIはDSPのノブを直接操作しない。「目標仕様書」を出力し、Control Layer が物理演算パラメータに変換するという二段構えの設計。Jiles-Atherton / Koren 等の数式は確かにDSPステージとして定義されている。
「10年の音響研究成果」という言葉が誇張でないことは、923行の物理演算と、合議システムのアーキテクチャが示している。プレイグラウンドはその信頼性を証明する場になる。
結論として、開発者として伝えたいことは一文に収まる:
"Don't trust my infrastructure. Trust this logic. Run it in your environment."
— 私のインフラは信じるな。このロジックを信じろ。君の環境で動かせ。