AI音楽検出API — 開発者向け完全ガイド2026

2026年5月22日 · AI Song Checker チーム

DSP、ディストリビューター、A&Rサブミッションプラットフォーム、その他AI生成音楽をプログラム的にフラグ付けする必要があるツールを構築しているなら、APIが必要です。このガイドはすべてを解説します: 認証、エンドポイント、Python/Node/Javaのコードサンプル、レート制限、レスポンス形式、エラー処理、そして本番運用のヒント。

コード例にはAI Song Checker REST APIを使用します。無料で始められ(クレジットカード不要)、主要なAI音楽エンジン(Suno、Udio、Riffusion、ElevenLabs Music、MusicGen、Stable Audio)をすべてサポートし、信頼度スコアやプラットフォーム帰属を含む豊富なJSONを返します。

UIではなくAPIで統合する理由

クイックスタート — 60秒

  1. aisongchecker.proで無料登録(メールアドレスのみ)
  2. Proプラン(€4.99/月)にアップグレードしてAPIアクセスを有効化
  3. ダッシュボード → APIに移動し、ASC_API_KEYをコピー
  4. 最初のコールを実行(下記のPythonサンプルを参照)

認証

すべてのAPIリクエストは、AuthorizationヘッダーでHTTP Basic認証またはBearerトークンを使用します。Bearerを推奨します:

Authorization: Bearer ASC_LIVE_xxxxxxxxxxxxxxxx

APIキーはアカウントへのフルアクセス権を持ちます。必ずサーバーサイドで保管し、クライアントのJSやモバイルアプリのバンドルには絶対に含めないでください。

エンドポイント概要

エンドポイントメソッド機能
/api/v1/analyze/filePOST音声ファイルをアップロードしてAI検出結果を取得
/api/v1/analyze/urlPOSTYouTube/Spotify/SoundCloudのURLを分析
/api/v1/analyze/batchPOST最大100トラックを1コールで送信
/api/v1/result/{id}GET非同期バッチジョブの結果を取得
/api/v1/certificate/{id}GET真正性証明書を取得(PDF、署名付き)
/api/v1/usageGET現在のクォータ使用量 + レート制限ステータス

単一ファイルの分析 — Python

import requests

API_KEY = "ASC_LIVE_your_key_here"
URL = "https://api.aisongchecker.pro/v1/analyze/file"

with open("track.mp3", "rb") as f:
    response = requests.post(
        URL,
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"audio": f},
        data={"return_features": "true", "return_certificate": "true"},
    )

result = response.json()
print(f"AI probability: {result['ai_probability']:.1%}")
print(f"Verdict: {result['verdict']}")  # "ai" | "human" | "uncertain"
print(f"Most likely platform: {result['platform_attribution']['top']}")
print(f"Confidence: {result['confidence']:.2f}")

レスポンス例

{
  "id": "asc_anl_2k3jX9pQmR8t",
  "ai_probability": 0.967,
  "verdict": "ai",
  "confidence": 0.94,
  "platform_attribution": {
    "top": "suno",
    "scores": {
      "suno": 0.91,
      "udio": 0.04,
      "riffusion": 0.02,
      "elevenlabs_music": 0.01,
      "musicgen": 0.01,
      "stable_audio": 0.01
    },
    "version_hint": "v5"
  },
  "watermarks": {
    "c2pa_detected": true,
    "synthid_detected": false,
    "c2pa_signer": "suno.ai"
  },
  "features": {
    "spectral_flatness_mean": 0.0182,
    "phase_coherence_entropy": 2.41,
    "mfcc_distance_baseline": 8.93,
    "frame_similarity": 0.78
  },
  "engine_version": "ASC-v8.3",
  "analyzed_at": "2026-05-22T18:42:11Z",
  "certificate_url": "https://aisongchecker.pro/cert/asc_anl_2k3jX9pQmR8t.pdf"
}

URLの分析 — Node.js

const fetch = require('node-fetch');

const result = await fetch('https://api.aisongchecker.pro/v1/analyze/url', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.ASC_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
    return_features: false
  })
}).then(r => r.json());

console.log(`AI: ${(result.ai_probability * 100).toFixed(1)}%`);
if (result.verdict === 'ai') {
  console.log(`Platform: ${result.platform_attribution.top}`);
}

バッチ分析 — Java

import java.net.http.*;
import java.net.URI;

HttpClient client = HttpClient.newHttpClient();

String json = """
{
  "tracks": [
    {"id": "t1", "url": "https://soundcloud.com/artist/track-1"},
    {"id": "t2", "url": "https://open.spotify.com/track/abc123"},
    {"id": "t3", "url": "https://youtu.be/xyz789"}
  ],
  "webhook_url": "https://your-app.com/asc-webhook"
}""";

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://api.aisongchecker.pro/v1/analyze/batch"))
    .header("Authorization", "Bearer " + System.getenv("ASC_API_KEY"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> res = client.send(req, HttpResponse.BodyHandlers.ofString());
// Returns: {"job_id": "asc_job_xyz", "status": "queued", "estimated_completion": "..." }

レート制限

プランリクエスト/分リクエスト/日バッチサイズ
Free10501
Pro605,000100
Business30050,000500
Enterpriseカスタム無制限カスタム

すべてのレスポンスに含まれるレート制限ヘッダー:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1716422400

エラー処理

HTTPコード意味対処法
400不正なリクエスト(無効なファイル形式、非対応URL)入力を確認し、有効なデータで再試行
401無効なAPIキーダッシュボードでキーを確認、漏洩時はローテーション
402クォータ超過(無料枠)プランをアップグレードするかリセットを待つ
413ファイルが大きすぎる(最大50 MB)音声を圧縮(MP3 320 kbpsでも可)
429レート制限に到達指数バックオフを実装(下記参照)
500/503サーバーエラーバックオフして再試行。SLA 99.9%を保証。

指数バックオフのパターン

import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

session = requests.Session()
retries = Retry(
    total=5, backoff_factor=2,
    status_forcelist=[429, 500, 502, 503, 504],
    allowed_methods=["POST"]
)
session.mount("https://", HTTPAdapter(max_retries=retries))

# Then use session.post(...) — auto retries with 2s, 4s, 8s, 16s, 32s

非同期バッチジョブ用のWebhook

10トラックを超えるバッチでは、結果はWebhook経由で届きます(ポーリングより高速)。バッチリクエストでwebhook_urlを設定してください。Webhookのペイロード:

POST https://your-app.com/asc-webhook
Content-Type: application/json
X-ASC-Signature: t=1716422400,v1=abc123...

{
  "event": "batch.completed",
  "job_id": "asc_job_xyz",
  "results": [
    { "id": "t1", "ai_probability": 0.97, "verdict": "ai", "platform": "suno" },
    { "id": "t2", "ai_probability": 0.04, "verdict": "human" },
    { "id": "t3", "ai_probability": 0.81, "verdict": "ai", "platform": "udio" }
  ],
  "stats": { "processed": 3, "errors": 0, "duration_ms": 12450 }
}

Webhookシークレットを使ったHMAC-SHA256(Stripe Webhookと同じ方式)で、サーバーサイドでX-ASC-Signatureヘッダーを検証してください。

ユースケース — 実例

1. ストリーミングプラットフォーム — アップロードの自動フラグ付け

トラックのアップロード時に/analyze/fileを非同期でコールします。ai_probability > 0.85の場合、EU AI法の要件に従って「AI生成」ラベルを自動的に付与します。透明性のためにメタデータでplatform_attribution.topをタグ付けします。

2. A&Rサブミッションのフィルタリング

SubmitHub型のプラットフォームは、各デモのアップロードごとにAPIをコールします。ai_probability > 0.7のトラックは人手によるレビューを優先します。キュレーターの時間を大幅に節約できます。

3. 音楽スーパーバイザー — ライセンスのデューデリジェンス

映画/テレビ向けにトラックをライセンスする前に、/analyze/fileで分析し、署名付き証明書(HMAC-SHA256)をリクエストします。人間による著作を証明するものとして、証明書をライセンス契約書に添付します。

4. レーベル向けカタログ監査

バックカタログ(1万〜100万トラック)を/analyze/batchで送信します。人手によるレビュー用に、疑わしいトラックのCSVレポートを取得できます。価格: Businessプランで1トラックあたり約$0.01。

提供されているSDK

本番運用チェックリスト

関連する読み物

Related