VAD على السكات و آخر الدور
الـ sessions المباشرة يخبّيو السكات قبل الـ décodeur، و يبعثو event utterance بعد قرابة 800 ms وقفة. قرابة 10 ثواني سكات متواصل توقّف الـ session وحدها، باش micro منسي ما يحكمش بلاصة. حط idle_stop=0 باش يقعد يسمع.
tokens جزئية و الجملة مازالت تتقال.
Tapra-Voice-Realtime هو التوأم متاع Tapra-Voice بالـ streaming: نفس الطريقة مع الخلطة بين اللغات، أما طريقة التوصيل مختلفة. الـ navigateur ولا الـ serveur متاعك يحلّ socket وحدة، يبعث trames PCM بـ 16 kHz، و ترجعلو events partiels كي الكلمات تتعرف، و في الآخر كتيبة final بالسوم بالضبط كي توقّف.
WSS /v1/realtime/stream
tapra-voice-v1-realtimeClient sends
open → 100 ms PCM frames → {"type":"stop"}
events الـ serveur
ready 0.01 s → first partial 1.97 s → utterance 23.64 s → final 28.06 s (reason: client_stop)
خرجة حقيقية
خرجة حقيقية
كل خرجة في الصفحة هاذي جات من tapra-voice-v1-realtime نهار 8 أكتوبر 2026، و حاطّينها كيما هي، بالغلطات. و كل réponse حقيقية فيها السوم بالضبط في x-tapra-cost-tnd.
الـ vocal المخلوط متاع 26 ثانية، مبعوث بالسرعة الحقيقية في trames PCM متاع 100 ms. كل partiel لوطة هو الـ event اللي بعثو الـ serveur، في اللحظة اللي بعثو فيها.
Client sends · pcm_s16le 16 kHz
partiels الـ serveur
نخمم نعمل une combinaison ما بين les deux modèles tomes canagent اللي هو capable يجاوب عل les clients كيما مثلا في الكنفيرما متاع les ordres والا تعمل marketing لهنا le modèle لازمو يكون قادر يعمل switch between languages ويجاوب زادا بنفس ال façon
stream كيما هو. يغلط في نفس إسم الـ produit كيما موديل الـ fichiers («tomes canagent»)، أما يكتب façon صحيحة في البلاصة اللي غلط فيها الآخر.
شنوّة يعمل
الـ sessions المباشرة يخبّيو السكات قبل الـ décodeur، و يبعثو event utterance بعد قرابة 800 ms وقفة. قرابة 10 ثواني سكات متواصل توقّف الـ session وحدها، باش micro منسي ما يحكمش بلاصة. حط idle_stop=0 باش يقعد يسمع.
الـ inférence تخدم على instances CPU عادية. أول trame تتخدم طول: ما فمّاش وقت تسخين، و ما فمّاش capacité تكريها و هي فارغة.
الـ clients في الـ navigateur يبعثو الـ sous-protocoles WebSocket tapra-realtime و tapra-auth.<API_KEY>. الـ clients serveur يستعملو Authorization: Bearer في الـ upgrade. الـ clé عمرها ما تتحط في URL.
event ready يحلّ الـ session، الـ partiels يجيو، {"type":"stop"} يسكّرها بالكتيبة final و السوم، و ping كل 15 ثانية يخلّي الـ connexion حيّة كي ما تبعثش أوديو. عشرة ثواني سكات تسكّر الـ session زادة، كان كان ما حطّيتش idle_stop=0.
ركّب
const socket = new WebSocket(
'wss://api.tapra.tn/v1/realtime/stream?language=ar-AR',
['tapra-realtime', 'tapra-auth.' + apiKey]
);
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === 'partial') render(message.text);
if (message.type === 'utterance') lockTurn(message.turn_text);
if (message.type === 'final') console.log(message.text, message.usage);
};
// Push mono 16-bit PCM frames, then close the session cleanly.
socket.onopen = () => recorder.onFrame((frame) => socket.send(frame));
stopButton.onclick = () => socket.send(JSON.stringify({ type: 'stop' }));مقارنة
مقارن بالـ APIs realtime اللي تخدم على GPU و بمحرّكات الصوت متاع الـ navigateurs.
| الخاصية | Tapra-Voice-Realtime | الحل العام |
|---|---|---|
| وقت décodage الـ partiel | médiane 4 ms، p95 119 ms على 196 partiel (session مسجّلة) | GPU يلزمو يسخن؛ الـ sessions الباردة تتعطّل ثواني |
| السوم و هو فارغ | صفر — تخلّص كان على الأوديو اللي تبعثو | capacité GPU محجوزة تخلّصها حتى في السكات |
| الخلطة وسط الـ stream | دارجة، français و anglais في socket وحدة | لغة وحدة لكل session |
| Auth في الـ navigateur | sous-protocoles WebSocket، الـ clé عمرها ما في الـ URL | tokens في الـ query string يطيحو في الـ logs و الـ referrers |
| نفس الحاجة كيما الـ fichiers | نفس العايلة متاع tapra-voice-v1، نفس طريقة الكتيبة | موديل streaming وحدو بقواعد أخرى |
| السوم | 0.300 TND / min (≈ $0.100), محسوب لكل session | minimum في الدقيقة و minimum في الـ concurrence |
الأسوام
تخلّص على اللي تبعثو بالضبط. نفس الـ solde المخلّص مسبّق يغطّي الموديلات الخمسة متاع Tapra، بالـ USD ولا بالـ TND.
السوم الأساسي
0.300 TND / min
WebSocket وحدة تصلّح الكتيبة و إنتي تحكي، و من بعد تسكّر كل دور بعد وقفة. ما فمّاش infrastructure فارغة تخلّصها.
أسئلة
إبعث الـ sous-protocoles tapra-realtime و tapra-auth.<API_KEY> كي تحلّ الـ socket. عمرك ما تحط clé في الـ query string — تطيح في الـ logs متاع الـ serveur و في الـ headers referrer.
trames PCM mono binaires بـ pcm_s16le على 16 kHz. هذا اللي تخرّجو الـ capture micro متاع Tapra أصلاً، يعني ما فمّاش rééchantillonnage.
إبعث {"type":"ping"} كل 15 ثانية كان ما تبعثش أوديو. بعد وقفة قرابة 800 ms، الـ serveur يبعث utterance و يقعد يسمع. قرابة 10 ثواني سكات توقّف الـ session وحدها (final بالسبب idle_stop) باش تفرّغ البلاصة. حط idle_stop=0 باش تطفيها. كي تكمّل، إبعث {"type":"stop"} باش تاخو الكتيبة final و السوم.
بقية العايلة
Tapra-Voice
يفرّغ الحكي التونسي لكتيبة، و يخلّي الخلطة متاع اللغات كيما هي.
إكتشف02 · محوّلTapra-Script
Arabizi ⇄ كتيبة عربية، من غير ما ياكل الأرقام متاعك.
إكتشف03 · ترجمةTapra-Translate
الدارجة تدخل، و المعنى الحقيقي يخرج — في الإتجاهين.
إكتشف04 · TTSTapra-Speak
صوت تونسي، يحكي كيف اللي كبر هوني.
إكتشفحط Tapra-Voice-Realtime في خدمة حقيقية.
2 TND solde مرحبا بيك، من غير carte، و الـ playground و الـ clés API معاهم.