Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Nov 09, 2026

Connexion AOQ à Qwen-LiveTranslate-Realtime

AOQ transmet les médias et les événements du modèle sur des pistes distinctes. Le SDK gère la capture, l’encodage et le décodage, la transmission et la lecture des médias ; 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-LiveTranslate-Realtime.

Périmètre d’application

Ce document concerne la série Qwen-LiveTranslate-Realtime ; consultez Traduction audio et vidéo en temps réel pour la liste des modèles. Les exemples de cette page utilisent qwen3.8-livetranslate-flash-realtime. La configuration et les champs d’événements diffèrent pour qwen3.5-livetranslate-flash-realtime ; consultez Événements client.

  • 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.

  • Lors de la capture audio avec un microphone, demandez l’autorisation d’accès au microphone conformément aux 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-livetranslate-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

  • Les médias sont gérés par AOQ SDK, qui assure leur capture, leur traitement, leur envoi, leur réception et leur lecture ; les données Data doivent être envoyées et reçues par l’appelant selon les définitions d’événements du modèle cible.

  • Une connexion réussie indique que le canal de transmission avec le modèle est établi. Le client ne doit activer les médias en amont nécessaires qu’une fois l’initialisation du modèle terminée. Pour le modèle d’exemple qwen3.8-livetranslate-flash-realtime de cette page, envoyez session.update et attendez session.updated avant d’activer 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

Configurer la direction 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
Envoi audio : Publiez une piste Audio, définissez l’encodeur audio et configurez la capture intégrée ou externe Traduction vocale
Réception audio : Abonnez-vous à la piste Audio, définissez le décodeur audio et configurez un lecteur ou une lecture externe Traduire et lire l’audio
Envoi vidéo : Configurez la piste Video, la caméra ou l’entrée vidéo externe selon la version sélectionnée et les scénarios pris en charge Envoyez la vidéo aux modèles prenant en charge les entrées visuelles
Réception vidéo : Ce modèle ne prend pas en charge la sortie vidéo Ne configurez pas d’abonnement vidéo

La piste Data est indépendante des pistes de médias : publiez-la pour envoyer les événements du modèle, abonnez-vous à cette piste pour recevoir les réponses, et renvoyez les traductions textuelles sur cette piste.

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 ; les autres méthodes d’intégration sont décrites dans Qwen-LiveTranslate-Realtime.

Modèle ou applicationEnvoyer de l’audioRecevoir de l’audioEnvoyer de la vidéoRecevoir de la vidéo
Qwen-LiveTranslate-Realtime Activez lorsque l’entrée vocale est utilisée Activez lorsque la traduction vocale est nécessaire Configurez selon la version et le scénario sélectionnés Activation non prise en charge

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 ou startAudioPlayer selon la direction. Les entrées et sorties personnalisées sont décrites dans la section des 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
Traduction vocale Audio, Data Audio, 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)

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)

L’audio est transmis sur la piste Audio ; les événements du modèle et le texte sont transmis sur la piste Data. N’utilisez pas input_audio_buffer.append pour envoyer une deuxième fois les données audio. L’audio en aval est traité par le lecteur configuré ou par la logique de lecture externe.

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

La séquence de fin suivante s’applique à la traduction vocale AOQ de qwen3.8-livetranslate-flash-realtime :

  1. Arrêtez la capture et désactivez l’audio en amont ; cessez d’envoyer les entrées et envoyez un seul message session.finish sur la piste Data.
  2. Maintenez la connexion AOQ, l’abonnement Data et la lecture audio, continuez à recevoir le texte original, la traduction et l’audio traduit de la dernière phrase, puis attendez session.finished.
  3. Si la lecture complète de l’audio traduit est nécessaire, ne déconnectez la connexion et ne libérez les ressources qu’après avoir terminé la lecture audio locale et son nettoyage.

Pour la description de session.finish et session.finished, consultez respectivement Événements client et Événements serveur. Pour le code complet, consultez Traduction vocale en temps réel en pratique.

Après les étapes de nettoyage ci-dessus, la couche métier du client appelle les interfaces de déconnexion et de libération des ressources d’AOQ et du SDK :

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-LiveTranslate-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 médias sont transmis 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 la méthode de connexion décrite ici ; n’appliquez pas directement la méthode WebSocket d’envoi des médias.

Fonctionnalités avancées

FonctionnalitéCas d’utilisationDocumentation
Contrôler la transmission audioattendre que le modèle soit prêt, suspendre l’audio en amontGestion de la transmission des flux de médias
Périphériques et traitement audioencodage/décodage, haut-parleurs, mixage de fichiers, callbacks de trames audioFonctions audio courantes
entrée audio externeutiliser une source audio côté clientcapture audio personnalisée
sortie audio externetraité ou lu côté clientlecture audio personnalisée

Pour les interfaces vidéo générales d’AOQ et du SDK, consultez Fonctions vidéo courantes et 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

RemarqueLes exemples suivants s’appliquent à qwen3.8-livetranslate-flash-realtime. L’audio est transmis sur les pistes de médias et n’utilise pas les événements WebSocket d’envoi des médias.

L’exemple suivant traduit la parole vers l’anglais avec la voix par défaut, sans activer le clonage vocal. Pour le code complet, consultez Traduction vocale en temps réel en pratique.

{
  "type": "session.update",
  "session": {
    "output_modalities": [
      "text",
      "audio"
    ],
    "audio": {
      "input": {
        "turn_detection": {
          "type": "speaker_detection",
          "threshold": 0.5
        }
      }
    },
    "translation": {
      "language": "en"
    }
  }
}

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