⚡
SignalLab
Audio Dataset Platform · Sound Trainer ULTRA v5
⚙ Подключение Supabase
Введи данные Supabase — они сохранятся в браузере.
—
Всего сигналов
—
Классов
—
Сегодня
—
МБ аудио
🎙 Запись с микрофона
REC
00:00
📁 Загрузить аудиофайл
🎵
Перетащи .wav / .mp3 / .ogg / .m4a
или нажми для выбора
📭
Загрузка...
🏷 Управление классами
⚡ API Доступ
Базовый URL
BASE URL:
https://your-project.supabase.co
API Ключи
Твои ключи доступа
💡 API ключ — это твой Supabase anon key. Передавай его в заголовке X-API-Key каждого запроса.
📡 Эндпоинты
GET
/rest/v1/signals
Получить список сигналов
▶
Query параметры
class_name=eq.X
string
Фильтр по классу звука
limit
integer
Макс кол-во записей
order
string
Сортировка, напр: created_at.desc
// Получить все сигналы класса "Звонок в дверь"
const res = await fetch(`${SIGNALLAB_URL}/rest/v1/signals?class_name=eq.door_bell&order=created_at.desc`, {
headers: { 'apikey': SIGNALLAB_API_KEY, 'Authorization': `Bearer ${SIGNALLAB_API_KEY}` }
});
const signals = await res.json();
import requests
r = requests.get(
f"{SIGNALLAB_URL}/rest/v1/signals",
params={"class_name":"eq.door_bell","order":"created_at.desc"},
headers={"apikey": SIGNALLAB_API_KEY}
)
curl -X GET \
"${SIGNALLAB_URL}/rest/v1/signals?class_name=eq.door_bell" \
-H "apikey: ${SIGNALLAB_API_KEY}"
POST
/rest/v1/signals
Добавить запись о сигнале
▶
Body (JSON)
class_name
string
Класс звука
обяз.
file_path
string
Путь в Storage
обяз.
confidence
float
Уверенность модели 0.0–1.0
source
string
Источник (напр: "android-app")
async function uploadSignal(audioBlob, className, confidence) {
const filePath = `${className}/${Date.now()}.webm`;
// 1. Upload audio to Storage
await fetch(`${SIGNALLAB_URL}/storage/v1/object/signals/${filePath}`, {
method:'POST', headers:{'apikey':SIGNALLAB_API_KEY,'Content-Type':'audio/webm'}, body:audioBlob
});
// 2. Save metadata
await fetch(`${SIGNALLAB_URL}/rest/v1/signals`, {
method:'POST', headers:{'apikey':SIGNALLAB_API_KEY,'Content-Type':'application/json'},
body:JSON.stringify({class_name:className, file_path:filePath, confidence, source:'my-app'})
});
}
DELETE
/rest/v1/signals?id=eq.{id}
Удалить сигнал
▶
await fetch(`${SIGNALLAB_URL}/rest/v1/signals?id=eq.${signalId}`, {
method: 'DELETE',
headers: { 'apikey': SIGNALLAB_API_KEY, 'Authorization': `Bearer ${SIGNALLAB_API_KEY}` }
});
🧪 Живой тестировщик
← Нажми "Отправить" чтобы увидеть ответ
📦 SignalLab JS SDK
Минимальный SDK для быстрого подключения. Скопируй в свой проект.
getSignals(filter)
uploadSignal(blob, meta)
deleteSignal(id)
getStats()
class SignalLabClient {
constructor(url, apiKey) { this.url=url.replace(/\/$/,''); this.key=apiKey; }
_h(x={}){ return {'apikey':this.key,'Authorization':`Bearer ${this.key}`,'Content-Type':'application/json',...x}; }
async getSignals({className,limit=100,order='created_at.desc'}={}){
let qs=`order=${order}&limit=${limit}`;
if(className) qs+=`&class_name=eq.${encodeURIComponent(className)}`;
return (await fetch(`${this.url}/rest/v1/signals?${qs}`,{headers:this._h()})).json();
}
async uploadSignal(blob,{className,confidence=0,source='sdk',note=''}){
const ext=blob.type.includes('wav')?'wav':'webm';
const path=`${className}/${Date.now()}_${source}.${ext}`;
await fetch(`${this.url}/storage/v1/object/signals/${path}`,
{method:'POST',headers:{'apikey':this.key,'Content-Type':blob.type},body:blob});
return fetch(`${this.url}/rest/v1/signals`,
{method:'POST',headers:this._h({'Prefer':'return=minimal'}),
body:JSON.stringify({class_name:className,file_path:path,confidence,source,note,
download_url:`${this.url}/storage/v1/object/public/signals/${path}`})});
}
async deleteSignal(id){ return fetch(`${this.url}/rest/v1/signals?id=eq.${id}`,{method:'DELETE',headers:this._h()}); }
}
// Использование:
const sl = new SignalLabClient('YOUR_SUPABASE_URL', 'YOUR_API_KEY');
const signals = await sl.getSignals({ className: 'door_bell' });