النماذج

qwen-audio-3.0-realtime-plus

Markdown · JSON

qwen-audio-3.0-realtime-plus

نموذج لحوار صوتي مباشر يقبل الكلام والنص ويجيب بالصوت أو النص. مصمم لوتيرة تواصل طبيعية والتفاعل مع الأدوات.

عن النموذج

يغطي هذا الوصف قدرات النموذج. وترد أدناه المدخلات والمخرجات والخيارات المتاحة في Ailoot للطريقة المحددة.

Qwen-Audio-3.0-Realtime-Plus هو نموذج من Alibaba للحوار الصوتي المباشر. يقبل الكلام والنص ويجيب بالصوت والنص ويدعم محادثة ثنائية الاتجاه مع تبادل طبيعي للأدوار. يمكن إرسال الصوت واستقباله على أجزاء، لذا يتطور التفاعل أثناء المحادثة.

متى ينتهي المتحدث من فكرته

تتوفر عدة طرق لتحديد حدود دور الكلام: النشاط الصوتي، والاكتمال الدلالي، والتحكم الصريح. لدى المصنّع يُختار الوضع قبل إرسال أول صوت؛ ويتطلب تغييره بعد بدء المحادثة اتصالًا جديدًا. يعتمد دعم هذا التحكم على الطريقة المختارة. يراعي الوضع الدلالي التوقفات وحشوات الكلام: التردد القصير لا يعني بالضرورة أن المستخدم أنهى فكرته. يمكن لكلام جديد من المستخدم أن يقاطع الإجابة الجاري تكوينها، لتستمر المحادثة مع مراعاة الدور التالي. في الوضع الدلالي يمكن توجيه التعرف إلى عينة صوتية للمتحدث المختار لتقليل التأثر بأصوات الآخرين وضوضاء الخلفية.

تحدد التعليمات دور المساعد وأسلوب التواصل. يمكن للأداء الصوتي مراعاة النبرة والسرعة والعاطفة؛ ويتوفر في الإصدار 3.0 خمسة أصوات نظامية وأصوات مبنية على عينة كلام. يدعم النموذج 11 لغة، منها الروسية، إلى جانب أنواع اللهجات الصينية التي يحددها المصنّع. لدى المصنّع يُحدد الصوت عند أول تحديث لإعدادات الجلسة؛ ويُتجاهل إرسال صوت جديد لاحقًا في المحادثة نفسها. تتطلب هذه الإعدادات دعم طريقة الاستدعاء المختارة.

الأدوات وسجل المحادثة

يُدعم استدعاء الدوال. يشكّل النموذج الفعل المطلوب، وينفذه التطبيق المتصل، ثم يعيد النتيجة إلى الحوار. يتيح ذلك بناء المحادثة على بيانات فعلية ومتابعتها بعد إتمام العملية. يمكن للمساعد الصوتي الاستناد إلى نتائج الأدوات مع الحفاظ على سياق الحديث. تشمل إمكانات المصنّع أيضًا بحثًا مدمجًا على الويب إذا كانت الطريقة المختارة توفره. لا يمكن تفعيل بحث الويب واستدعاء الدوال معًا في جلسة واحدة.

يتضمن السجل افتراضيًا 20 دورًا في المحادثة، مع نطاق من دور واحد إلى 50. يبلغ الحد للصوت المتراكم 300 ثانية؛ وتُحذف الأجزاء القديمة من السجل عند تجاوز الحدود. يختلف ذلك عن مدة الدور الواحد: فالسجل يحدد المادة السابقة التي تظل متاحة عند متابعة الحوار.

السياق النصي والصوت

يبلغ السياق الرسمي 40 960 توكنًا. الحد الأقصى للإدخال 16 384 توكنًا وللإخراج 8192؛ وتُذكر حدود الإدخال والإخراج نفسها لوضع الاستدلال، مع حد منفصل لسلسلة الاستدلال قدره 1024 توكنًا.

للصوت المتدفق يُستخدم PCM أحادي القناة بتمثيل 16 بت: تردد الإدخال 16 كيلوهرتز والإخراج 24 كيلوهرتز. تنتمي البيانات النصية والصوتية إلى محادثة واحدة. لم يُعلن عن إدخال بصري أو إخراج صور لهذا النموذج بعينه؛ فهو متخصص في الكلام والنص والتفاعل الصوتي.

Ailoot · صوت في الوقت الفعلي GET /v1/realtime?model=qwen-audio-3.0-realtime-plus qwen-audio-3.0-realtime-plus

qwen-audio-3.0-realtime-plus

Alibaba /qwen-audio-3.0-realtime-plus

البداية

نموذج لحوار صوتي مباشر يقبل الكلام والنص ويجيب بالصوت أو النص. مصمم لوتيرة تواصل طبيعية والتفاعل مع الأدوات.

المدخلات المقبولة
النص · الصوت
النتائج
النص · الصوت

متاح في Ailoot · المدخلات والطرائق

Ailoot · صوت في الوقت الفعلي GET /v1/realtime?model=qwen-audio-3.0-realtime-plus
الإدخال
text, audio
الإخراج
text, audio
صيغة الإخراج
أحداث الجلسة
الحقلالنوعالمتطلبالقيم والحدودالقيمة الافتراضية
الحقلquery.modelالنوعstringالمتطلبمطلوبالقيم والحدود
qwen-audio-3.0-realtime-plus
القيمة الافتراضية—
الحقلsession.input_audio_formatالنوعstringالمتطلباختياريالقيم والحدود
pcm16, pcm
القيمة الافتراضية—
الحقلsession.output_audio_formatالنوعstringالمتطلباختياريالقيم والحدود
pcm16, pcm
القيمة الافتراضية—
الحقلsession.instructionsالنوعstringالمتطلباختياريالقيم والحدود
نطاق تطبيق الحد: سياسة الجلسة المختارة
القيمة الافتراضية—
الحقلsession.max_history_turnsالنوعintegerالمتطلباختياريالقيم والحدود
الحد الأدنى: ⁦1⁩
نطاق تطبيق الحد: سياسة الجلسة المختارة
القيمة الافتراضية—
الحقلinput_audio_buffer.append.audioالنوعbase64_stringالمتطلبمطلوبالقيم والحدود
محتوى الإدخال: PCM16 أحادي القناة؛ إدخال بتردد 16 kHz ومخرجات بتردد 24 kHz؛ طول بالبايت غير صفري وعدد بايتات زوجي
القيمة الافتراضية—
تركيبات مواد الإدخال

realtime_text_audio

معلمات الطريقة ودورة حياتها
المعلمةالمواصفات
المعلمةmaterial_typesالمواصفاتtext, audio
المعلمةrequiredالمواصفاتnull
المعلمةoptional_controlsالمواصفاتnull
المعلمةcontent_typeالمواصفاتWebSocket

دورة الحياة: exact retained published method

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

الباقات

تعرفات طرائق Ailoot

Ailoot صوت في الوقت الفعليGET /v1/realtime?model=qwen-audio-3.0-realtime-plus
الإدخال
⁦‏0.0008 US$⁩ / 1K
الإخراج
⁦‏0.0064 US$⁩ / 1K
الإدخال
⁦‏0.0048 US$⁩ لكل دقيقة صوت
الإخراج
⁦‏0.018 US$⁩ لكل دقيقة صوت مُخرج

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. كيفية عمل حجز المبلغ وتسوية الرسوم →

أمثلة للطلبات

Ailoot · صوت في الوقت الفعلي

Python WebSocket · نصPython WebSocket · صوت
# Install the documented client once: python3 -m pip install websockets
import base64, json, os, time, wave
from pathlib import Path
from websockets.sync.client import connect

key = os.environ.get("AILOOT_API_KEY", "")
if not key.strip():
    raise SystemExit("Set your AILOOT_API_KEY before connecting")
file = Path(os.environ.get("AILOOT_TEXT_FILE", ""))
if not file.is_file(): raise SystemExit("Set AILOOT_TEXT_FILE to your actual UTF-8 material")
material = file.read_text(encoding="utf-8")
if not material.strip(): raise SystemExit("Text material must not be empty")
out = Path("realtime-results")
out.mkdir(exist_ok=True)
audio, texts, complete = {}, {}, []
current_response = None
pending = False
deadline = time.monotonic() + 570  # Local client bound; lower server/session limits still apply.

def receive(ws, log):
    global current_response, pending
    left = deadline - time.monotonic()
    if left <= 0:
        raise TimeoutError("Client session limit; preserve IDs and partial results, do not replay")
    event = json.loads(ws.recv(timeout=min(60, left)))
    log.write(json.dumps(event, ensure_ascii=False) + "\n")
    log.flush()
    kind = event.get("type")
    if kind == "error":
        raise RuntimeError(json.dumps(event, ensure_ascii=False))
    if kind == "response.created":
        current_response = event["response"]["id"]
    if kind in {"response.audio.delta", "response.output_audio.delta", "response.text.delta", "response.output_text.delta", "response.audio_transcript.delta", "response.output_audio_transcript.delta", "response.text.done", "response.audio_transcript.done"}:
        identity = (event["response_id"], event["item_id"], event["output_index"], event["content_index"])
        if kind in {"response.audio.delta", "response.output_audio.delta"}:
            raw = base64.b64decode(event["delta"], validate=True)
            if len(raw) % 2: raise ValueError("Output PCM16 chunk must have an even byte length")
            audio.setdefault(identity, bytearray()).extend(raw)
        elif kind.endswith(".done"):
            texts[identity] = event.get("text", event.get("transcript", ""))
        else:
            texts[identity] = texts.get(identity, "") + event["delta"]
            print(event["delta"], end="", flush=True)
    if kind == "response.done":
        response = event["response"]
        complete.append(response)
        if current_response is None: current_response = response["id"]
        if response["id"] == current_response: pending = False
    return event

def wait_for(ws, log, kind):
    while True:
        event = receive(ws, log)
        if event.get("type") == kind: return event

def send(ws, event):
    ws.send(json.dumps(event, ensure_ascii=False))

try:
    # One exact model query; no reconnect/retry loop and no provider credentials.
    with connect("wss://api.ailoot.ai/v1/realtime?model=qwen-audio-3.0-realtime-plus", additional_headers={"Authorization": "Bearer " + key}) as ws:
        with (out / "events.jsonl").open("w", encoding="utf-8") as log:
            wait_for(ws, log, "session.created")
            send(ws, {"type":"session.update", "session":{"modalities":["audio","text"], "input_audio_format":"pcm", "output_audio_format":"pcm", "turn_detection":None}})
            wait_for(ws, log, "session.updated")
            send(ws, {"type":"conversation.item.create", "item":{"type":"message", "role":"user", "content":[{"type":"input_text", "text":material}]}})
            send(ws, {"type":"response.create"})
            pending = True
            try:
                while pending: receive(ws, log)
            except KeyboardInterrupt:
                # Cancel the actual current inference, then preserve its returned status.
                send(ws, {"type":"response.cancel"})
                while pending: receive(ws, log)
    if not complete or complete[-1].get("status") != "completed":
        raise RuntimeError("Response did not complete normally; inspect saved events and status")
finally:
    manifest = {"responses":complete, "parts":[]}
    for number, identity in enumerate(dict.fromkeys(list(audio) + list(texts))):
        record = {"response_id":identity[0], "item_id":identity[1], "output_index":identity[2], "content_index":identity[3]}
        if identity in audio:
            raw = bytes(audio[identity])
            pcm_file = out / ("audio-" + str(number) + ".pcm")
            wav_file = out / ("audio-" + str(number) + ".wav")
            pcm_file.write_bytes(raw)
            with wave.open(str(wav_file), "wb") as wav:
                wav.setnchannels(1); wav.setsampwidth(2); wav.setframerate(24000); wav.writeframes(raw)
            record.update({"pcm":str(pcm_file), "wav":str(wav_file), "sample_rate_hz":24000})
        if identity in texts:
            text_file = out / ("text-" + str(number) + ".txt")
            text_file.write_text(texts[identity], encoding="utf-8")
            record["text"] = str(text_file)
        manifest["parts"].append(record)
    (out / "results.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8")
    print("\nSaved every received event and result in", out)
# Install the documented client once: python3 -m pip install websockets
import base64, json, os, time, wave
from pathlib import Path
from websockets.sync.client import connect

key = os.environ.get("AILOOT_API_KEY", "")
if not key.strip():
    raise SystemExit("Set your AILOOT_API_KEY before connecting")
file = Path(os.environ.get("AILOOT_AUDIO_FILE", ""))
if not file.is_file(): raise SystemExit("Set AILOOT_AUDIO_FILE to your raw PCM16 mono 16-kHz recording")
material = file.read_bytes()
if not material or len(material) % 2 or material.startswith(b"RIFF"):
    raise SystemExit("Use nonempty signed little-endian PCM16 mono 16-kHz bytes, not a WAV header")
out = Path("realtime-results")
out.mkdir(exist_ok=True)
audio, texts, complete = {}, {}, []
current_response = None
pending = False
deadline = time.monotonic() + 570  # Local client bound; lower server/session limits still apply.

def receive(ws, log):
    global current_response, pending
    left = deadline - time.monotonic()
    if left <= 0:
        raise TimeoutError("Client session limit; preserve IDs and partial results, do not replay")
    event = json.loads(ws.recv(timeout=min(60, left)))
    log.write(json.dumps(event, ensure_ascii=False) + "\n")
    log.flush()
    kind = event.get("type")
    if kind == "error":
        raise RuntimeError(json.dumps(event, ensure_ascii=False))
    if kind == "response.created":
        current_response = event["response"]["id"]
    if kind in {"response.audio.delta", "response.output_audio.delta", "response.text.delta", "response.output_text.delta", "response.audio_transcript.delta", "response.output_audio_transcript.delta", "response.text.done", "response.audio_transcript.done"}:
        identity = (event["response_id"], event["item_id"], event["output_index"], event["content_index"])
        if kind in {"response.audio.delta", "response.output_audio.delta"}:
            raw = base64.b64decode(event["delta"], validate=True)
            if len(raw) % 2: raise ValueError("Output PCM16 chunk must have an even byte length")
            audio.setdefault(identity, bytearray()).extend(raw)
        elif kind.endswith(".done"):
            texts[identity] = event.get("text", event.get("transcript", ""))
        else:
            texts[identity] = texts.get(identity, "") + event["delta"]
            print(event["delta"], end="", flush=True)
    if kind == "response.done":
        response = event["response"]
        complete.append(response)
        if current_response is None: current_response = response["id"]
        if response["id"] == current_response: pending = False
    return event

def wait_for(ws, log, kind):
    while True:
        event = receive(ws, log)
        if event.get("type") == kind: return event

def send(ws, event):
    ws.send(json.dumps(event, ensure_ascii=False))

try:
    # One exact model query; no reconnect/retry loop and no provider credentials.
    with connect("wss://api.ailoot.ai/v1/realtime?model=qwen-audio-3.0-realtime-plus", additional_headers={"Authorization": "Bearer " + key}) as ws:
        with (out / "events.jsonl").open("w", encoding="utf-8") as log:
            wait_for(ws, log, "session.created")
            send(ws, {"type":"session.update", "session":{"modalities":["audio","text"], "input_audio_format":"pcm", "output_audio_format":"pcm", "turn_detection":None}})
            wait_for(ws, log, "session.updated")
            for offset in range(0, len(material), 640):
                send(ws, {"type":"input_audio_buffer.append", "audio":base64.b64encode(material[offset:offset+640]).decode("ascii")})
                time.sleep(0.02)
            send(ws, {"type":"input_audio_buffer.commit"})
            wait_for(ws, log, "input_audio_buffer.committed")
            send(ws, {"type":"response.create"})
            pending = True
            try:
                while pending: receive(ws, log)
            except KeyboardInterrupt:
                # Cancel the actual current inference, then preserve its returned status.
                send(ws, {"type":"response.cancel"})
                while pending: receive(ws, log)
    if not complete or complete[-1].get("status") != "completed":
        raise RuntimeError("Response did not complete normally; inspect saved events and status")
finally:
    manifest = {"responses":complete, "parts":[]}
    for number, identity in enumerate(dict.fromkeys(list(audio) + list(texts))):
        record = {"response_id":identity[0], "item_id":identity[1], "output_index":identity[2], "content_index":identity[3]}
        if identity in audio:
            raw = bytes(audio[identity])
            pcm_file = out / ("audio-" + str(number) + ".pcm")
            wav_file = out / ("audio-" + str(number) + ".wav")
            pcm_file.write_bytes(raw)
            with wave.open(str(wav_file), "wb") as wav:
                wav.setnchannels(1); wav.setsampwidth(2); wav.setframerate(24000); wav.writeframes(raw)
            record.update({"pcm":str(pcm_file), "wav":str(wav_file), "sample_rate_hz":24000})
        if identity in texts:
            text_file = out / ("text-" + str(number) + ".txt")
            text_file.write_text(texts[identity], encoding="utf-8")
            record["text"] = str(text_file)
        manifest["parts"].append(record)
    (out / "results.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=2), encoding="utf-8")
    print("\nSaved every received event and result in", out)

استلام النتائج وحفظها

Ailoot · صوت في الوقت الفعلي

أحداث الجلسة

الاحتفاظ بكل النتائج المكتملة

احتفظ بكل استجابة كاملة وكل ملف وجزء محتوى تم إرجاعه.

جمّع كل جزء صوتي مُعاد وكل نتيجة نصية أو حدث لكل معرّف استجابة فعلي.

عند الحاجة إلى التحقق من الاستجابة الأصلية

احتفظ بالمعرّفات الفعلية للجلسة والاستجابة والأحداث وبسجلات الإثبات.

الأخطاء والخطوات التالية
الاستجابةالشرطالخطوة التالية
الاستجابة⁦426⁩ · invalid_request_errorالشرطلم تتم ترقية الاتصال إلى WebSocketالخطوة التاليةاستخدم عميل WebSocket مع Upgrade: websocket.

الأسماء البديلة

الأسماء البديلة للنموذج

Ailoot qwen-audio-3.0-realtime-plus

الأسماء البديلة لمسارات الطرائق

استخدم مسارات الطرائق المعروضة أعلاه.

معرّفات النماذج ذات الصلة IDs

qwen-audio-3.0-realtime-plus

FAQ · qwen-audio-3.0-realtime-plus
ما المدخلات والنتائج المتاحة؟

GET /v1/realtime?model=qwen-audio-3.0-realtime-plus · qwen-audio-3.0-realtime-plus: text, audio → text, audio

ما الحدود المطبقة؟

GET /v1/realtime?model=qwen-audio-3.0-realtime-plus · qwen-audio-3.0-realtime-plus: session.max_history_turns.minimum: 1

المزيد من التفاصيل

اربط Ailoot بخدمة Claude Code أوOpenCode أوHermes أوتطبيقك.

الشركة ومحفظة مشاريعها

الشركة ومحفظة مشاريعها: ملايين العملاء؛ مبيعات بالمليارات شهريًا.

اشتر الرموز بخصم.

خصم اشتراك للعمل المنتظم. الرموز الترويجية حتى 50% على شراء الرموز.

الاشتراك
اختر خطة بخصم لطلباتك المنتظمة.
رمز خصم حتى 50%
أدخل الرمز عند الشراء. يعاد حساب السعر وفق العرض الساري.
المصروفات في السجل
يحفظ النموذج والرموز والمبلغ لكل طلب.

اختر اشتراكا · اعرض أسعار النماذج

اربط API بالمنتج الذي تبيعه.

SaaS والتطبيقات والبوتات وفق العرض واتفاقية ترخيص Ailoot. لإعادة البيع، اطلب ترخيص موزع.

تطبيق تجاري
أضف توليد النص والصور والفيديو والصوت إلى ميزات خدمتك المدفوعة.
ترخيص إعادة البيع
أرسل وصف المشروع وطريقة توفير الوصول. اطلب شروط استخدام وإعادة بيع مكتوبة.
المستندات على الموقع
العرض واتفاقية الترخيص وسياسة معالجة البيانات متاحة قبل الربط.

اطلب ترخيص إعادة بيع · العرض واتفاقية الترخيص