SGSoundGuard

Quickstart

Llama al endpoint en menos de un minuto desde curl, JavaScript y Python.

La API es pública, sin auth, durante el MVP. Solo necesitas un clip de audio en formato wav, mp3 u ogg, ≤ 5 MB, ≤ 30 segundos.

Endpoint

POST https://poi8bb5go9.execute-api.us-east-1.amazonaws.com/classify
GET  https://poi8bb5go9.execute-api.us-east-1.amazonaws.com/health

curl

AUDIO_B64=$(base64 -w0 sample.wav)

curl -X POST "https://poi8bb5go9.execute-api.us-east-1.amazonaws.com/classify" \
  -H "content-type: application/json" \
  -d "{\"audio_base64\":\"$AUDIO_B64\",\"format\":\"wav\",\"filename\":\"sample.wav\"}"

fetch (browser / Node)

async function classify(audioBlob) {
  const audioBase64 = await blobToBase64(audioBlob);
  const format = audioBlob.type.includes('wav') ? 'wav'
               : audioBlob.type.includes('mpeg') ? 'mp3'
               : 'ogg';

  const res = await fetch(
    'https://poi8bb5go9.execute-api.us-east-1.amazonaws.com/classify',
    {
      method: 'POST',
      headers: { 'content-type': 'application/json' },
      body: JSON.stringify({ audio_base64: audioBase64, format }),
    },
  );

  if (!res.ok) throw new Error(JSON.stringify(await res.json()));
  return res.json();
}

function blobToBase64(blob) {
  return new Promise((resolve, reject) => {
    const fr = new FileReader();
    fr.onload = () => resolve(fr.result.split(',')[1]);
    fr.onerror = reject;
    fr.readAsDataURL(blob);
  });
}

Python

import base64, json, requests

with open("sample.wav", "rb") as f:
    audio_b64 = base64.b64encode(f.read()).decode()

resp = requests.post(
    "https://poi8bb5go9.execute-api.us-east-1.amazonaws.com/classify",
    json={"audio_base64": audio_b64, "format": "wav", "filename": "sample.wav"},
    timeout=15,
)
resp.raise_for_status()
print(json.dumps(resp.json(), indent=2))

Respuesta esperada

{
  "request_id": "8e7c2a14-9f1b-4d2e-bc11-8a0e5d4f7c9e",
  "timestamp": "2026-05-05T14:32:11.482Z",
  "latency_ms": 612,
  "prediction": {
    "category": "siren",
    "category_label": "Sirena",
    "confidence": 0.8,
    "is_critical": true,
    "urgency": "high"
  },
  "neighbors": [
    { "category": "siren", "category_label": "Sirena", "distance": 0.121, "filename": "1-100032-A-7.wav", "fold": 1 }
  ]
}

El campo confidence es votos_clase / k. Con k=5, los valores posibles son 0.2, 0.4, 0.6, 0.8, 1.0. No es una probabilidad calibrada.

Probar sin escribir código

¿Solo quieres ver qué hace? Abre el demo en vivo — soporta drag & drop y grabación con micrófono.

On this page