من الصوت للكتيبة بالـ streaming

Tapra-Voice-Realtime

tokens جزئية و الجملة مازالت تتقال.

Tapra-Voice-Realtime هو التوأم متاع Tapra-Voice بالـ streaming: نفس الطريقة مع الخلطة بين اللغات، أما طريقة التوصيل مختلفة. الـ navigateur ولا الـ serveur متاعك يحلّ socket وحدة، يبعث trames PCM بـ 16 kHz، و ترجعلو events partiels كي الكلمات تتعرف، و في الآخر كتيبة final بالسوم بالضبط كي توقّف.

  • 0.300 TND / min
  • PCM 16 kHz
  • VAD + آخر الدور

WSS /v1/realtime/stream

Client 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، في اللحظة اللي بعثو فيها.

0:00 / 0:00

Client sends · pcm_s16le 16 kHz

partiels الـ serveur

final

نخمم نعمل 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 صحيحة في البلاصة اللي غلط فيها الآخر.

شنوّة يعمل

حاجات تنجم تبني عليها من اليوم.

01

VAD على السكات و آخر الدور

الـ sessions المباشرة يخبّيو السكات قبل الـ décodeur، و يبعثو event utterance بعد قرابة 800 ms وقفة. قرابة 10 ثواني سكات متواصل توقّف الـ session وحدها، باش micro منسي ما يحكمش بلاصة. حط idle_stop=0 باش يقعد يسمع.

02

ما فمّاش GPU يبدا بارد

الـ inférence تخدم على instances CPU عادية. أول trame تتخدم طول: ما فمّاش وقت تسخين، و ما فمّاش capacité تكريها و هي فارغة.

03

Auth من غير ما الـ clé تطيح

الـ clients في الـ navigateur يبعثو الـ sous-protocoles WebSocket tapra-realtime و tapra-auth.<API_KEY>. الـ clients serveur يستعملو Authorization: Bearer في الـ upgrade. الـ clé عمرها ما تتحط في URL.

04

دورة حياة واضحة

event ready يحلّ الـ session، الـ partiels يجيو، {"type":"stop"} يسكّرها بالكتيبة final و السوم، و ping كل 15 ثانية يخلّي الـ connexion حيّة كي ما تبعثش أوديو. عشرة ثواني سكات تسكّر الـ session زادة، كان كان ما حطّيتش idle_stop=0.

ركّب

الـ contrat الكل في بلاصة وحدة.

Model id
tapra-voice-v1-realtime
Endpoint
WSS /v1/realtime/stream?language=ar-AR
من الـ client للـ serveur
trames PCM mono binaires، pcm_s16le، 16 kHz
من الـ serveur للـ client
events ready، partial، utterance، final، error
Protocoles
tapra-realtime, tapra-auth.<API_KEY>
VAD / آخر الدور
خدّام بالـ défaut؛ ~800 ms سكات تبعث utterance
وقفة وحدها
خدّامة بالـ défaut؛ ~10 s سكات تبعث final و تسكّر الـ socket
Keep-alive
{"type":"ping"} كل 15 ثانية كي ما تبعثش أوديو
التسكير
{"type":"stop"} ولا الوقفة وحدها يرجّعو الكتيبة final و الـ usage
الخلاص
الـ millisecondes متاع الأوديو اللي تبعثها، بـ 0.300 TND / min
حلّ stream realtimets
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' }));

مقارنة

شنوّة يفرق Tapra-Voice-Realtime.

مقارن بالـ APIs realtime اللي تخدم على GPU و بمحرّكات الصوت متاع الـ navigateurs.

Tapra-Voice-Realtime مقارن بحل عام
الخاصيةTapra-Voice-Realtimeالحل العام
وقت décodage الـ partielmédiane 4 ms، p95 119 ms على 196 partiel (session مسجّلة)GPU يلزمو يسخن؛ الـ sessions الباردة تتعطّل ثواني
السوم و هو فارغصفر — تخلّص كان على الأوديو اللي تبعثوcapacité GPU محجوزة تخلّصها حتى في السكات
الخلطة وسط الـ streamدارجة، français و anglais في socket وحدةلغة وحدة لكل session
Auth في الـ navigateursous-protocoles WebSocket، الـ clé عمرها ما في الـ URLtokens في الـ query string يطيحو في الـ logs و الـ referrers
نفس الحاجة كيما الـ fichiersنفس العايلة متاع tapra-voice-v1، نفس طريقة الكتيبةموديل streaming وحدو بقواعد أخرى
السوم0.300 TND / min (≈ $0.100), محسوب لكل sessionminimum في الدقيقة و minimum في الـ concurrence

الأسوام

بالكونتور، موش بالـ abonnement.

تخلّص على اللي تبعثو بالضبط. نفس الـ solde المخلّص مسبّق يغطّي الموديلات الخمسة متاع Tapra، بالـ USD ولا بالـ TND.

السوم الأساسي

0.300 TND / min

WebSocket وحدة تصلّح الكتيبة و إنتي تحكي، و من بعد تسكّر كل دور بعد وقفة. ما فمّاش infrastructure فارغة تخلّصها.

السوم
$0.100 للدقيقة أوديو
بالدينار
0.300 TND للدقيقة أوديو
قدّاش في الساعة
$6.00 للساعة
وحدة الحساب
audio_ms (مدّة الأوديو بالضبط)
أقل خلاص
ما فمّاش — ما تخلّصش على session فارغة

أسئلة

شنوّة يسألو اللي يبنيو قبل كل شي.

كيفاش نعمل auth من الـ navigateur؟

إبعث الـ sous-protocoles tapra-realtime و tapra-auth.<API_KEY> كي تحلّ الـ socket. عمرك ما تحط clé في الـ query string — تطيح في الـ logs متاع الـ serveur و في الـ headers referrer.

شنوّة الفورما متاع الأوديو اللي تستنّاها الـ socket؟

trames PCM mono binaires بـ pcm_s16le على 16 kHz. هذا اللي تخرّجو الـ capture micro متاع Tapra أصلاً، يعني ما فمّاش rééchantillonnage.

شنوّة يصير كي الـ connexion تقعد فارغة؟

إبعث {"type":"ping"} كل 15 ثانية كان ما تبعثش أوديو. بعد وقفة قرابة 800 ms، الـ serveur يبعث utterance و يقعد يسمع. قرابة 10 ثواني سكات توقّف الـ session وحدها (final بالسبب idle_stop) باش تفرّغ البلاصة. حط idle_stop=0 باش تطفيها. كي تكمّل، إبعث {"type":"stop"} باش تاخو الكتيبة final و السوم.