მარტივი ინტეგრაცია. მკაფიო საზღვრები.
ეს არის მომხმარებლის ბრაუზერში გაშვებული გამოთვლა, არა სერვერული TTS API.
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.
- ნამდვილი, მაგრამ შეზღუდული სწავლება: გაყინული 18 000-ნაბიჯიანი მოდელი + აუდიო-თავის rank-8 LoRA, 73 792 პარამეტრი.
- არ არის სრული მოდელის fine-tuning, ფედერაციული სწავლება, GPU ფერმა ან ფონური გამოთვლა დახურულ ტაბში.
- მომხმარებლების ადაპტერები ავტომატურად არ ერთიანდება და საერთო მოდელი არ იცვლება.
- არ არის გარანტია, რომ შემცირებული სასწავლო loss უკეთეს ქართულ გამოთქმას ნიშნავს. საჭიროა ცალკე მოსმენა და უცნობ ტექსტებზე შეფასება.
- საუბარი, CSV, აუდიო და ადაპტერი ავტომატურად არ იგზავნება სერვერზე. სერვერს ეგზავნება მხოლოდ job-ის ტიპი, ნაბიჯების რაოდენობა, დრო და რიცხვითი loss.
შესაძლებლობები და მდგომარეობა
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 მდგომარეობას.
საიტის მოთხოვნები
- HTTPS; WebGPU და
shader-f16; მინიმუმ 128 MiB ერთ GPU ბუფერზე შემცირებული პაკეტისთვის. რეალური თავისუფალი RAM/VRAM საჭიროება ბევრად მეტია — მხოლოდ ეს ლიმიტი საკმარისი არ არის. - პირველ ჩატვირთვაზე დაახლოებით 0.75 GB მოდელი. შემდგომ შესაძლებელია checksum-შემოწმებული ბრაუზერული cache. ქსელის სიჩქარე პირველი ჩატვირთვის დროს ცვლის.
- რეკომენდებული headers:
Cross-Origin-Opener-Policy: same-origin,Cross-Origin-Embedder-Policy: require-corp. ეს შეიძლება სხვა third-party iframe-ებზე იმოქმედოს; მთელ შენს საიტზე ბრმად არ ჩართო. - CSP-ში დაუშვი API-ის script/connect/worker რესურსები და WASM. გვერდზე master key არასოდეს დაამატო.
- ჩაშენებული ტესტი ამოწმებს ფაქტობრივად არჩეულ GPU-ს. ბრაუზერს შეუძლია ინტეგრირებული GPU აირჩიოს მაშინაც, როცა კომპიუტერს ცალკე ვიდეოკარტაც აქვს.
ვადა, შეწყვეტა, უსაფრთხოება
ბრაუზერის token მოქმედებს მაქსიმუმ 2 საათი. ავტორიზაციის ამოწურვაზე ავტომატური უსასრულო retry არ ხდება: backend ქმნის ახალ სესიას, მომხმარებელი შემოიტანს შენახულ ადაპტერს. ძირითადი ფაილები უცვლელია. CPU preprocessing (ტექსტი, აუდიოს resampling, sampling) დაშვებულია, მაგრამ მოდელის ნეირონული გამოთვლა და LoRA განახლება WebGPU-ზე უნდა ჩატარდეს; სერვერული ჩანაცვლება არ არის.