dadudeveloper← ლაბორატორია
BROWSER GPU API · V1

მარტივი ინტეგრაცია. მკაფიო საზღვრები.

ეს არის მომხმარებლის ბრაუზერში გაშვებული გამოთვლა, არა სერვერული TTS API.

საჭიროა ღია ბრაუზერი, მოწყობილობის მფლობელის თანხმობა და თავსებადი GPU. HTTP მოთხოვნა თავისით ვერ გამოიყენებს დისტანციური მომხმარებლის GPU-ს. მოდელი არის CC-BY-NC — პირადი, არაკომერციული შეფასებისთვის.
ბრაუზერული პაკეტი: დაახლოებით 0.75 GB. გამოიყენება ჩვენი 18 000-ნაბიჯიანი checkpoint-ის INT4/block-32 წარმოებული ვერსია. აუდიო-embedding და output head რჩება FP16; კოდეკის შენახვა FP16-ია, არითმეტიკა — FP32. ორიგინალი Windows მოდელი არ შეცვლილა. კვანტიზაციამ შეიძლება შეცვალოს ხმა; ხარისხის თანასწორობა ორიგინალთან გარანტირებული არ არის.

1 · შენი backend ქმნის დროებით სესიას

მთავარი გასაღები დარჩეს მხოლოდ backend-ის საიდუმლო საცავში. არ მოათავსო HTML-ში, JavaScript-ში ან URL-ში.

POST /v1/sessions
Authorization: Bearer <SERVER_SECRET>
Content-Type: application/json

{
  "subject": "opaque-user-id",
  "origin": "https://dadu.ge",
  "ttl_seconds": 3600,
  "experimental": false
}

პასუხი შეიცავს დროებით token-ს, session_id-ს და expires_at-ს. ეს დროებითი token მიეცი მხოლოდ შესაბამის მომხმარებელს HTTPS-ით. სესიას ერთ origin-ზე აქვს უფლება.

2 · შენი frontend უშვებს გამოთვლას

import { DaduGPU, wavBlob } from 'https://api.dadu.ge/sdk.js';

// connection comes from YOUR authenticated backend. No master key here.
const client = new DaduGPU({
  api: connection.api,
  token: connection.token,
  onEvent: event => updateProgress(event),
});
await client.connect();
// Run ONLY after the device owner explicitly agrees.
await client.init({ consent: true });
const result = await client.generate({
  text: 'გამარჯობა! როგორ ხარ?',
  language: 'ka',
  steps: 32,
  consent: true,
});
audio.src = URL.createObjectURL(wavBlob(result.pcm));

refPCM: mono Float32Array, 24 kHz, 0.4–12 წამი. მიაწოდე მასთან ერთად ზუსტი refText. საკუთარი აუდიოს ადგილობრივად მოსამზადებლად SDK-ს აქვს readAudio(file). ავტომატური ASR არ გამოიყენება.

3 · შეზღუდული ადგილობრივი სწავლება

const controller = new AbortController();
const result = await client.train({
  samples: [{ text: 'აუდიოში ნათქვამი ზუსტი ტექსტი.', file: audioFile }],
  steps: 20,
  learningRate: 0.001,
  consent: true,
  signal: controller.signal,
});
// result.adapter is a local binary checkpoint. Save it on the user's device.
// It contains adapter weights + Adam state, not the user's training audio.
await client.importAdapter(await savedAdapterFile.arrayBuffer());
// Subsequent generate() and train() calls use this adapter.
controller.abort(); // Cancellation takes effect between submitted GPU operations.

შესაძლებლობები და მდგომარეობა

GET /v1/capabilities განასხვავებს not_verified-სა და verified_experimental-ს. GET /healthz მხოლოდ API პროცესის ჯანმრთელობაა — არ ამტკიცებს GPU-ზე მოდელის მუშაობას.

GET   /healthz
GET   /v1/capabilities
POST  /v1/sessions                     # backend master key
POST  /v1/sessions/:id/revoke           # backend master key
GET   /v1/session                      # browser session
GET   /v1/model/manifest               # browser session
GET   /v1/model/files/:name            # SHA-256 + single byte Range
POST  /v1/jobs                         # consent + one active job/session
GET   /v1/jobs/:id                     # only own session's jobs
PATCH /v1/jobs/:id                     # bounded numeric telemetry
POST  /v1/jobs/:id/cancel               # stop request

Job-ის ანგარიშები მოდის კლიენტიდან და არ არის კრიპტოგრაფიულად დამოწმებული. სხვა მომხმარებლის job-ის წაკითხვა სესიის token-ით შეუძლებელია. 2 წუთით დაკარგული heartbeat იწვევს interrupted მდგომარეობას.

საიტის მოთხოვნები

ვადა, შეწყვეტა, უსაფრთხოება

ბრაუზერის token მოქმედებს მაქსიმუმ 2 საათი. ავტორიზაციის ამოწურვაზე ავტომატური უსასრულო retry არ ხდება: backend ქმნის ახალ სესიას, მომხმარებელი შემოიტანს შენახულ ადაპტერს. ძირითადი ფაილები უცვლელია. CPU preprocessing (ტექსტი, აუდიოს resampling, sampling) დაშვებულია, მაგრამ მოდელის ნეირონული გამოთვლა და LoRA განახლება WebGPU-ზე უნდა ჩატარდეს; სერვერული ჩანაცვლება არ არის.

OpenAPI JSON · ლაბორატორიაში დაბრუნება