Tous les produits
Search
Centre de documentation

Alibaba Cloud Model Studio:Connexion AOQ à Qwen-Omni-Realtime

Dernière mise à jour :Nov 09, 2026

Connexion AOQ à Qwen-Omni-Realtime

AOQ transmet les médias audio/vidéo et les événements du modèle sur des pistes distinctes. Le SDK gère la capture des médias, l’encodage et le décodage, la transmission et la lecture ; l’application envoie les événements du modèle sur la piste Data et traite les réponses. Cette page utilise les directions de transmission des médias et le protocole d’événements de Qwen-Omni-Realtime.

Périmètre d’application

Ce document concerne Qwen-Omni-Realtime. La documentation d’intégration existante couvre qwen3.8-omni-flash-realtime, qwen3.5-omni-plus-realtime et qwen3.5-omni-flash-realtime. Le modèle de l’exemple est qwen3.8-omni-flash-realtime.

  • Utilisez l’API Key et l’ID de l’espace de travail correspondant à la région et à l’espace de travail sélectionnés.

  • Domaine de Pékin : {WorkspaceId}.cn-beijing.maas.aliyuncs.com ; domaine de Singapour : {WorkspaceId}.ap-southeast-1.maas.aliyuncs.com.

  • Stockez l’API Key uniquement sur le serveur. Ne l’intégrez pas à une application mobile ou à un navigateur.

  • Pour capturer l’audio avec un microphone ou la vidéo avec une caméra, demandez les autorisations nécessaires selon les exigences de la plateforme.

  • Téléchargez le SDK de votre plateforme depuis Téléchargement du SDK.

Authentification et informations de connexion

RemarquePour obtenir un jeton à l’avance ou consulter le flux complet d’authentification, voir les détails de l’authentification de connexion.

Envoyez la requête suivante depuis votre AppServer. Commencez par configurer l’API Key comme variable d’environnement. Remplacez {WorkspaceId} dans le domaine par l’ID de votre espace de travail. Pour une autre région, utilisez le domaine correspondant indiqué ci-dessus. clientIp est facultatif. S’il est omis, la passerelle utilise l’adresse IP depuis laquelle elle reçoit la requête.

export ENDPOINT="{WorkspaceId}.cn-beijing.maas.aliyuncs.com"
curl -X POST \
  "https://${ENDPOINT}/api/v1/webrtc/realtime?model=qwen3.8-omni-flash-realtime" \
  -H "Authorization: Bearer ${DASHSCOPE_API_KEY}" \
  -H "Content-Type: application/json" \
  -H "x-dashscope-rtc-transport: moq" \
  -d '{}'

Pour préciser l’adresse IP publique du client, remplacez -d '{}' dans le corps de la requête par -d '{"clientIp":"<CLIENT_PUBLIC_IP>"}'.

Champs de la requête

Configuration

Valeur

Description

endpoint

Sélectionner le domaine du point de terminaison pour votre cas d’utilisation

Indiquez le domaine du point de terminaison. Pour plus d’informations, consultez Sélectionner une région, un périmètre de déploiement et un point de terminaison. Si vous utilisez Token Plan, définissez WorkspaceId dans le domaine du point de terminaison sur token-plan.

Content-Type

application/json

Type de média du message

Authorization

Bearer <YOUR_API_KEY>

Votre API Key

x-dashscope-rtc-transport

moq

Sélectionner le protocole AOQ

clientIp

Adresse IP publique du client

Facultatif. S’il est omis, le service utilise l’adresse IP depuis laquelle la passerelle reçoit la requête. S’il est renseigné, il utilise clientIp. Le service sélectionne le meilleur point de terminaison Relay selon l’adresse IP du client.

Exemple de réponse

{
    "sid": "1d06b55683db49bba67a407902f62d02:1782706970:69aecdc5...",
    "aoqTokenForClient": "ecc1a46015d5496ca4ff7a48281eb739",
    "clientRelayEndpoints": [{"endpoint": "121.199.XX.XX", "port": 8443, "route_index": 0}],
    "clientRelayCertFingerprint": "sha256/99843495...",
    "sidExpiresInSecs": 7200,
    "extraInfo": {"workspaceIdHash": "2021b6f98cea4cff"}
}

Champs de la réponse

Field

Description

sid

Identifiant unique de la session.

aoqTokenForClient

Jeton de connexion du client. Transmettez cette valeur au champ token du SDK.

clientRelayEndpoints

Tableau de points de terminaison Relay. Chaque élément de l’exemple de réponse contient les champs suivants :

Propriétés

endpoint

Adresse du point de terminaison Relay.

port

Port du point de terminaison Relay.

route_index

L’exemple iOS ci-dessous utilise l’indice du tableau lorsque ce champ est absent.

clientRelayCertFingerprint

Empreinte du certificat TLS Relay.

sidExpiresInSecs

Durée d’expiration de la session, en secondes.

extraInfo

Informations supplémentaires.

Propriétés

workspaceIdHash

Hachage de l’ID de l’espace de travail.

Exemple de connexion du SDK client AOQ

RemarqueclientIp est un champ facultatif du corps de la requête. S’il est omis, l’adresse IP qui envoie la requête à la passerelle Model Studio est utilisée comme adresse IP du client. S’il est renseigné, la valeur de clientIp est prioritaire. Faites récupérer l’adresse IP réelle du client par votre AppServer métier et transmettez-la pour obtenir le meilleur point d’accès Relay.

let resp = try JSONDecoder().decode(AllocateResponse.self, from: responseData)

let config = AoqConnectConfig()
config.token = resp.aoqTokenForClient
config.sid = resp.sid
config.certFingerprint = resp.clientRelayCertFingerprint
config.relayEndpoints = resp.clientRelayEndpoints.enumerated().map { index, item in
    let ep = AoqRelayEndpoint()
    // Fall back to the array index when route_index is missing
    ep.routeIndex = item.routeIndex ?? index
    ep.endpoint = item.endpoint
    ep.port = item.port
    return ep
}
config.workspaceIdHash = resp.extraInfo?.workspaceIdHash ?? ""

let audioTrack = AoqTrackParam()
audioTrack.trackType = .audio
let dataTrack = AoqTrackParam()
dataTrack.trackType = .data
config.publishTracks = [audioTrack, dataTrack]
config.subscribeTracks = [audioTrack, dataTrack]

engine.connect(config)
JSONObject obj = new JSONObject(responseText);
AoqClientEngine.AoqConnectConfig cfg = new AoqClientEngine.AoqConnectConfig();
cfg.token = obj.optString("aoqTokenForClient", "");
cfg.sid = obj.optString("sid", "");
cfg.certFingerprint = obj.optString("clientRelayCertFingerprint", "");

JSONArray arr = obj.optJSONArray("clientRelayEndpoints");
if (arr != null) {
    for (int i = 0; i < arr.length(); i++) {
        JSONObject o = arr.optJSONObject(i);
        AoqClientEngine.AoqRelayEndpoint ep = new AoqClientEngine.AoqRelayEndpoint();
        // Fall back to the array index when route_index is missing
        ep.routeIndex = o.has("route_index") ? o.optInt("route_index", i) : i;
        ep.endpoint = o.optString("endpoint", "");
        ep.port = o.optInt("port", 0);
        cfg.relayEndpoints.add(ep);
    }
}

JSONObject ext = obj.optJSONObject("extraInfo");
cfg.workspaceIdHash = ext != null ? ext.optString("workspaceIdHash", "") : "";

AoqClientEngine.AoqTrackParam audio = new AoqClientEngine.AoqTrackParam();
audio.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
AoqClientEngine.AoqTrackParam data = new AoqClientEngine.AoqTrackParam();
data.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeData;
cfg.publishTracks.add(audio);
cfg.publishTracks.add(data);
cfg.subscribeTracks.add(audio);
cfg.subscribeTracks.add(data);

engine.connect(cfg);
const obj = JSON.parse(responseText) as Record<string, Object | undefined>;
const cfg: AoqConnectConfig = {
    token: String(obj['aoqTokenForClient'] ?? ''),
    sid: String(obj['sid'] ?? ''),
    certFingerprint: String(obj['clientRelayCertFingerprint'] ?? ''),
    // Fall back to the array index when route_index is missing
    relayEndpoints: (obj['clientRelayEndpoints'] as Array<any>).map((item, index) => ({
        routeIndex: Number(item['route_index'] ?? index),
        endpoint: String(item['endpoint'] ?? ''),
        port: Number(item['port'] ?? 0)
    })),
    workspaceIdHash: String((obj['extraInfo'] as any)?.['workspaceIdHash'] ?? ''),
    publishTracks: [
        { trackType: AoqTrackType.AoqTrackTypeAudio },
        { trackType: AoqTrackType.AoqTrackTypeData }
    ],
    subscribeTracks: [
        { trackType: AoqTrackType.AoqTrackTypeAudio },
        { trackType: AoqTrackType.AoqTrackTypeData }
    ]
};
engine.connect(cfg);

Déroulement

Séquence de connexion AOQ
  1. Obtenez les informations de connexion via AppServer.
  2. Créez le moteur SDK et enregistrez les callbacks.
  3. Configurez les pistes de médias et Data, puis désactivez la transmission des médias en amont.
  4. Établissez la connexion AOQ et attendez qu’elle soit connectée.
  5. Configurez le modèle selon son protocole. Après confirmation, activez les médias en amont nécessaires.
  6. Déconnectez-vous et libérez les ressources une fois l’interaction terminée.

Remarque

  • Le SDK AOQ gère la capture, le traitement, la transmission, la réception et la lecture des médias. Votre application doit échanger les messages Data selon les définitions d’événements du modèle cible.

  • Une connexion réussie indique que le canal de transmission vers le modèle est établi ; le client ne doit activer les médias en amont nécessaires qu’après l’initialisation complète du modèle. Pour le modèle d’exemple qwen3.8-omni-flash-realtime de cette page, envoyez session.update et attendez session.updated avant de commencer la transmission des médias.

1. Obtenir les identifiants de connexion

Le client demande les informations de connexion à votre AppServer. AppServer appelle le point de terminaison de connexion Realtime de ce modèle et inclut l’API Key et x-dashscope-rtc-transport: moq dans la requête à la passerelle. Pour le point de terminaison complet, la requête et la description des champs, consultez Authentification par jeton.

Associez la réponse à AoqConnectConfig :

Réponse de la passerelleConfiguration du SDK
aoqTokenForClienttoken
sidsid
clientRelayCertFingerprintcertFingerprint
clientRelayEndpointsrelayEndpoints, convertissez chaque point d’accès selon la structure
extraInfo contient workspaceIdHashworkspaceIdHash

Obtenez de nouvelles informations de connexion à chaque nouvelle connexion. La possibilité de réutiliser une session ou de lancer une autre tâche dans la même connexion dépend du protocole du modèle cible.

2. Initialiser le SDK et enregistrer les rappels

Créez le moteur et enregistrez les callbacks pour l’état de la connexion, les messages Data et les erreurs. L’exemple suivant utilise Swift sur iOS :

let createConfig = AoqCreateConfig()
createConfig.workDir = workDir
createConfig.enableDumpAudio = false
engine = AoqClientEngine.createEngine(createConfig, delegate: self)

Implémentez AoqEngineDelegate ; gérez l’état de la connexion dans onConnectionStatusChange ; analysez les événements du modèle cible dans onDataMsg ; traitez les erreurs du SDK dans onError. Les événements d’erreur renvoyés par le modèle doivent également être traités séparément dans la logique de traitement des messages Data. Pour les interfaces du SDK et la description des erreurs, consultez SDK par plateforme et Référence des fonctionnalités.

3. Configurer le SDK

Sélectionner les directions des médias

Les directions sont définies du point de vue du client. Configurez uniquement les modalités d’entrée et de sortie nécessaires à votre application. N’ajoutez pas de pistes pour les directions inutilisées.

DirectionConfigurationUtilisation courante
envoie l’audiopublie la piste Audio, définit l’encodeur audio et configure la capture intégrée ou externeconversation vocale
reçoit l’audios’abonne à la piste Audio, définit le décodeur audio et configure le lecteur ou la lecture externeréponse vocale
envoie la vidéopublie la piste Video et configure la caméra ou l’entrée vidéo externe ainsi que les paramètres d’encodageenvoie la vidéo aux modèles prenant en charge les entrées visuelles
reçoit la vidéoce modèle ne prend pas en charge la sortie vidéone configurez pas d’abonnement vidéo

Les pistes Data sont indépendantes de ces quatre directions : publiez une piste Data pour envoyer les événements du modèle et abonnez-vous pour recevoir les réponses. Les entrées et sorties textuelles nécessitent également des pistes Data.

Directions des médias pour ce modèle

Le tableau ci-dessous présente les directions de transmission des médias pour ce modèle. Consultez le Périmètre d’application pour connaître les modèles concernés ; pour les autres méthodes d’intégration, consultez Qwen-Omni-Realtime.

Modèle ou applicationEnvoyer de l’audioRecevoir de l’audioEnvoyer de la vidéoRecevoir de la vidéo
Qwen-Omni-Realtimeactivez lorsqu’une entrée vocale est nécessaireactivez lorsqu’une réponse vocale est nécessaireactivez lorsqu’une entrée visuelle est nécessairene peut pas être activé

Configurer les paramètres et pistes média

Configurez séparément l’audio en amont et en aval : utilisez setAudioEncoderConfig pour l’audio en amont et setAudioDecoderConfig pour l’audio en aval. Ces paramètres contrôlent la transmission réseau ; la passerelle convertit l’audio au format requis par le modèle. Configurez l’encodage du transport et le format audio des événements du modèle selon les exigences du SDK et du modèle cible, respectivement.

Démarrez startAudioCapture, startAudioPlayer ou startVideoCapture selon vos besoins. Pour personnaliser les entrées et sorties, consultez les fonctionnalités avancées ci-dessous.

Les pistes publishTracks sont envoyées par le client, et les pistes subscribeTracks sont reçues par le client :

ScenariopublishTrackssubscribeTracks
conversation vocaleAudio, DataAudio, Data
conversation vocale avec entrée visuelleAudio, Video, DataAudio, Data

Désactivez les médias en amont avant la connexion pour éviter que les entrées n’atteignent le modèle avant qu’il soit prêt :

engine.enableSendMediaStream(.audio, enable: false)
engine.enableSendMediaStream(.video, enable: false)

La capture, la publication des pistes et l’autorisation d’envoi sont des opérations distinctes. La désactivation de la transmission n’arrête pas la capture locale et n’affecte pas les événements Data. L’activation de la transmission ne crée pas de pistes qui n’ont pas été ajoutées.

4. Établir la connexion

Renseignez les informations de connexion et la configuration des pistes dans AoqConnectConfig, puis appelez :

engine.connect(connectConfig)

Attendez que onConnectionStatusChange renvoie .connected, puis procédez à l’initialisation du modèle. Le retour de l’appel à connect ne signifie pas que la connexion a réussi.

5. Échanger les événements du modèle et les médias

Envoyer et analyser les événements du modèle

Le client envoie les événements sur la piste Data. Voici un extrait de code Swift pour iOS ; pour les autres interfaces, consultez Référence du SDK iOS :

// Build eventJSON according to the target model client event protocol.
let msg = AoqDataMsg()
msg.data = eventJSON.data(using: .utf8)!
engine.send(msg)

Analysez la réponse dans onDataMsg. Ce modèle identifie les types d’événements par le champ type. Les champs complets, les paramètres et les conditions de fin doivent suivre la documentation du modèle cible.

Activer les médias lorsque le modèle est prêt

Une fois les conditions de disponibilité du modèle, de la session ou de la tâche actuels remplies, activez uniquement les directions en amont configurées. Pour l’entrée vocale, appelez :

engine.enableSendMediaStream(.audio, enable: true)

Activez .video uniquement lorsqu’une entrée vidéo est nécessaire.

Transmettez l’audio et la vidéo sur leurs pistes média, et les événements et textes sur les pistes Data. Par exemple, Omni via AOQ ne nécessite pas input_audio_buffer.append ni input_image_buffer.append pour renvoyer les mêmes médias. Traitez l’audio descendant avec le lecteur configuré ou votre logique de lecture externe.

6. Terminer l’interaction et libérer les ressources

Lorsque la connexion n’est plus nécessaire, appelez les interfaces de déconnexion et de libération des ressources d’AOQ SDK depuis votre application :

engine.disconnect()
AoqClientEngine.destroy()

Après une déconnexion inattendue, effacez l’état de disponibilité de l’application et suivez Gestion de l’état de la connexion. Initialisez à nouveau le modèle après la reconnexion.

Envoyer et recevoir des événements sur le canal Data

Le client envoie et reçoit les événements du modèle sur la piste Data d’AOQ SDK. Pendant la connexion, la publication de la piste Data et l’abonnement à celle-ci sont tous deux nécessaires ; pour l’envoi, sérialisez l’événement du modèle dans AoqDataMsg et appelez l’interface d’envoi Data de la plateforme ; à la réception, analysez le message dans le callback onDataMsg. Pour le détail des interfaces, consultez SDK par plateforme.

Les noms, champs, paramètres et moments d’envoi des événements suivent les définitions des événements client du modèle cible ; l’analyse, les changements d’état, les résultats et la gestion des erreurs après réception suivent les définitions des événements serveur du modèle. Les événements d’initialisation sont envoyés selon les exigences du modèle, puis les événements textuels et de contrôle selon les besoins métier.

Modèle ou applicationÉvénements client (envoi)Événements serveur (réception)
Qwen-Omni-RealtimeÉvénements clientÉvénements serveur

Respectez également les règles suivantes :

  • Utilisez le champ type des événements pour identifier les événements du modèle et traitez les identifiants associés selon la référence des événements de ce modèle.

  • Les opérations requises par le modèle, telles que la confirmation de l’initialisation, la soumission des entrées, l’annulation des réponses et la fin des tâches, sont toutes traitées sur le canal Data selon le protocole correspondant ; elles définissent les interactions du modèle et sont distinctes de la déconnexion du transport.

  • Avant de terminer, achevez la soumission des entrées et la réception des résultats selon la documentation des événements de ce modèle ; si une lecture complète est nécessaire, ne libérez la connexion qu’après avoir traité l’audio restant dans la file locale.

  • Les données audio et vidéo sont transmises sur les pistes de médias. Lorsque vous consultez la documentation des événements du modèle, l’encapsulation des médias et les modes d’interaction disponibles restent définis par les méthodes de connexion décrites ici ; ils n’appliquent pas directement la méthode WebSocket d’envoi des médias.

Fonctionnalités avancées

FonctionnalitéCas d’utilisationDocumentation
Contrôler séparément la transmission audio et vidéoAttendre que le modèle soit prêt, suspendre les médias montants ou activer la vidéo selon les besoinsGestion de la transmission des médias
Périphériques et traitement audioEncodage, décodage, haut-parleurs, mixage de fichiers et rappels de trames audioFonctionnalités audio courantes
Entrée audio externeUtiliser une source audio fournie par l’applicationCapture audio personnalisée
Sortie audio externeTraiter ou lire l’audio de sortie dans votre applicationLecture audio personnalisée
Capture et entrée vidéoUtiliser une caméra ou des images fournies par l’applicationFonctionnalités vidéo courantes, Entrée vidéo personnalisée

Les commandes de transmission des médias affectent uniquement les médias. L’annulation des réponses du modèle et la soumission des tours nécessitent toujours les événements du modèle cible.

Exemple de configuration de session

RemarqueL’exemple suivant s’applique à qwen3.8-omni-flash-realtime. L’audio et la vidéo sont transmis sur les pistes de médias ; les événements WebSocket d’envoi des médias ne sont pas utilisés.

{
  "type": "session.update",
  "session": {
    "modalities": [
      "text",
      "audio"
    ],
    "voice": "Tina",
    "turn_detection": {
      "type": "server_vad"
    }
  }
}

Téléchargement du SDK AOQ

Les notes de version ci-dessous décrivent les fonctionnalités générales d’AOQ SDK ; les médias pris en charge par ce modèle sont détaillés dans Directions de transmission des médias pour ce modèle ci-dessus.

VersionPlateformeTéléchargementDate de publicationNotes de version

v1.4.0

Android

AoqClientSdk-release.aar

libPluginOpus.zip

2026-10-27

  1. Ajout de la prise en charge des vidéos H.264 fournies en externe.
  2. Amélioration des performances.
  3. Correction de problèmes de stabilité connus.

iOS

AoqClientSdk.framework.zip

AoqScreenShare.framework.zip

PluginOpus.framework.zip

HarmonyOS

AoqClientSdk.har

libPluginOpus.zip

Windows

AoqClientSdk-windows-x64.zip

macOS

AoqClientSdk.framework.zip

PluginOpus.framework.zip

Electron

aoq-electron-sdk-1.4.0-59463182.tgz

Vous pouvez également l’installer avec npm :

npm install aoq-electron-sdk@1.4.0-59463182

Linux

x86_64 : AoqClientSdk.zip

arm64 : AoqClientSdk.zip

v1.3.0Android2026-09-18
  1. Ajout de la prise en charge du partage d’écran.

  2. Abandon de bitcode.

  3. Ajout du chargement à distance des bibliothèques .so.

  4. Ajout de la configuration externe de la valeur maximale des images encodées.

  5. Opus devient le codec par défaut.

  6. Amélioration des performances.

  7. Correction de problèmes de stabilité connus.

iOS
HarmonyOS
WindowsAoqClientSdk-windows-x64.zip
macOS
Electron
Vous pouvez également l’installer avec npm : npm install aoq-electron-sdk@1.3.0-58586345
Linux
v1.2.2iOSAoqClientSdk.framework.zip2026-09-09
  1. Correction d’un problème empêchant la reprise d’un appel iOS après une interruption système ou la fin d’un appel vocal tiers.

  2. Amélioration de l’annulation de l’écho au début des appels iOS.

v1.2.0Android 2026-08-17
  1. Ajout de la prise en charge de macOS

  2. Ajout de la prise en charge de Windows

  3. Ajout de la prise en charge d’Electron

  4. Ajout d’API Python et C++ pour Linux

  5. Ajout de la détection du niveau sonore

  6. Amélioration des performances

  7. Correction de problèmes de stabilité connus

iOS
HarmonyOS
Windows
macOS
Electron
Vous pouvez également l’installer avec npm: npm install aoq-electron-sdk@1.2.0-57407598
Linux
v1.1.0Android 2026-07-31
  1. Prend en charge les modèles ASR

  2. Prend en charge les modèles TTS

  3. Prend en charge le kit d’interaction multimodale

  4. Ajout de la prise en charge de la plateforme Linux

  5. Amélioration des performances

  6. Correction de problèmes de stabilité connus

iOS
HarmonyOS
LinuxAoqClientSdk.zip
v1.0.1Android 2026-07-09
  1. Accès aux modèles et applications via le protocole AOQ

  2. Paramètres des codecs audio et vidéo

  3. Capture et lecture par les périphériques audio et vidéo

  4. Capture audio externe personnalisée

  5. Capture vidéo externe personnalisée

  6. Encodage vidéo externe personnalisé

  7. Contrôle de l’envoi des flux de médias

iOS
HarmonyOS

ImportantAOQ charge le codec Opus comme plug-in audio. Pour utiliser l’encodage ou le décodage Opus, téléchargez le plug-in Opus et ajoutez-le à votre projet.

Références des événements

Tutoriels par scénario