Utilice AOQ para conectarse a qwen3.8-omni-flash-realtime y permita que el cliente controle los límites de turno para conversaciones push-to-talk y preguntas opcionales con imágenes. El código del cliente utiliza iOS Swift.
Descripción general de la solución
Qwen-Omni-Realtime admite VAD del lado del servidor y modo Manual controlado por el cliente. Este tutorial establece session.turn_detection en null. El cliente envía audio mientras el usuario mantiene presionado un botón, y confirma el audio y solicita explícitamente una respuesta cuando el usuario suelta el botón.
El modo Manual es adecuado para botones de intercomunicador de hardware, controles de mantener presionado, entornos ruidosos donde la aplicación determina los límites del turno y turnos que opcionalmente incluyen una imagen. El audio se transporta a través de la pista Audio de AOQ. No envíe input_audio_buffer.append.
Elemento | Modo VAD | Modo manual |
Límite de turno | Detectado por server_vad o semantic_vad | Controlado por un botón o estado de la aplicación |
Configuración de sesión | turn_detection contiene configuración de VAD | turn_detection es null |
Confirmación de audio | Realizado automáticamente por el servicio | El cliente envía input_audio_buffer.commit |
Activación de respuesta | Activado automáticamente por el servicio | El cliente envía response.create |
Entrada de imagen | Pista de video continua o una imagen a través de la pista de datos | Pista de video continua o una imagen a través de la pista de datos |
Requisitos previos
- Active Model Studio y siga los pasos en Obtener y configurar una clave API. Almacene la clave API únicamente en su servidor de aplicaciones. No la incluya en el código del cliente ni la confirme en un repositorio de código.
- Establezca
{endpoint}en{WorkspaceId}.cn-beijing.maas.aliyuncs.compara China (Beijing) o{WorkspaceId}.ap-southeast-1.maas.aliyuncs.compara Singapur. Reemplace{WorkspaceId}con su ID de espacio de trabajo y utilice la clave de API correspondiente a la misma región y espacio de trabajo. - Descargue la versión más reciente del SDK de cliente AOQ como se describe en Descarga del SDK.
- Configure un AppServer según los Pasos de autenticación de AOQ para Qwen-Omni-Realtime. Antes de cada conexión nueva, el cliente debe obtener credenciales de conexión nuevas de AppServer.
Importar el SDK
Importe el SDK para su plataforma de desarrollo. La implementación del cliente utiliza iOS Swift. Otras plataformas proporcionan las mismas interfaces y flujo de eventos. Este tutorial utiliza flujos de audio Opus. Importe el complemento Opus antes de continuar.
- Android
- iOS
- HarmonyOS
- Linux (Python)
- Coloque libPluginOpus.so del complemento Opus en app/src/main/jniLibs/armeabi-v7a/ y app/src/main/jniLibs/arm64-v8a/ para las ABI correspondientes. Coloque AoqClientSdk-release.aar en app/libs, y configure la dependencia y las ABI compatibles con el SDK en app/build.gradle:
- Declare los siguientes permisos en AndroidManifest.xml:
- Solicite los permisos RECORD_AUDIO y CAMERA en tiempo de ejecución antes de utilizar los dispositivos correspondientes.
Flujo de implementación
- El servidor de aplicaciones obtiene los parámetros de conexión AOQ para qwen3.8-omni-flash-realtime desde la URL del token Realtime.
- El cliente crea el motor y configura los códecs y pistas de audio. También configura la pista Video si se requiere comprensión visual continua.
- El cliente inicia la captura y reproducción locales, deshabilita el envío de la pista Audio por defecto, se conecta a AOQ y envía session.update.
- Después de recibir session.updated, la opción de video continuo habilita la pista Video. La pista Audio permanece deshabilitada hasta que el usuario presiona el botón de hablar.
- Cuando el usuario presiona el botón, el cliente habilita la pista Audio. Al soltarlo, deshabilita la pista Audio, opcionalmente envía una imagen y luego envía input_audio_buffer.commit y response.create.
- Después de recibir response.done, puede comenzar otro turno. Para finalizar, detenga los dispositivos, desconéctese y destruya el motor.
- Pista Video continua
- Enviar una imagen a través de la pista Data

Obtener un token del servidor de aplicaciones
Establezca DASHSCOPE_API_KEY en el servidor de aplicaciones y envíe la solicitud al endpoint de la región seleccionada. clientIp es la dirección IP pública real del cliente. Este campo es opcional, pero especificarlo ayuda al servicio a asignar un endpoint de retransmisión adecuado.
Campo de respuesta | Campo del SDK |
aoqTokenForClient | AoqConnectConfig.token |
sid | AoqConnectConfig.sid |
clientRelayCertFingerprint | AoqConnectConfig.certFingerprint |
clientRelayEndpoints | AoqConnectConfig.relayEndpoints |
extraInfo.workspaceIdHash | AoqConnectConfig.workspaceIdHash |
Implementar el cliente iOS
Después de que el cliente obtenga AoqConnectConfig del servidor de aplicaciones, siga estos pasos para implementar conversaciones de voz push-to-talk en iOS.
1. Crear el motor y registrar devoluciones de llamada
Cree el motor AOQ singleton y registre el objeto de la aplicación como receptor de callbacks. Gestione los estados de conexión, eventos del servidor, errores y advertencias en los callbacks.
2. Iniciar dispositivos de audio y video
Inicialice la captura y reproducción de audio. Inicie la cámara solo para la opción de video continuo. Obtenga los permisos de micrófono y cámara antes de llamar a estos métodos.
3. Configurar códecs y pistas
Configure los códecs de audio para el modelo seleccionado y el formato de audio de la aplicación, y seleccione pistas para la opción de entrada de imagen. Los siguientes valores de audio y video son ejemplos. Ajústelos según los requisitos del modelo y el escenario de la aplicación. Deshabilite el envío de la pista Audio antes de establecer la conexión.
- Pista Video continua
- Enviar una imagen a través de la pista Data
4. Configurar una sesión Manual
Después de establecer la conexión, llame a sendDataMsg para enviar un evento session.update. Establezca turn_detection en null y seleccione la voz, las instrucciones y las modalidades de salida para su aplicación. Mantenga los parámetros de audio del ejemplo consistentes con la configuración del códec del SDK. Para todos los campos, consulte Eventos del cliente.
5. Esperar la configuración de la sesión
Gestione el evento session.updated en el callback onDataMsg. No envíe medios hasta que se reciba este evento. Para la opción de video continuo, llame a enableSendMediaStream para habilitar la pista Video en este punto, pero mantenga la pista Audio deshabilitada para que el audio anterior a que el usuario presione el botón no ingrese al búfer de entrada.
6. Implementar la interacción push-to-talk
Cuando se presiona el botón, llame a enableSendMediaStream para habilitar la pista Audio. Al soltarlo, llame a enableSendMediaStream para deshabilitar la pista Audio, asegúrese de que el turno contenga audio, opcionalmente envíe una imagen y llame a sendDataMsg para enviar input_audio_buffer.commit seguido de response.create.
7. Seleccionar una opción de entrada de imagen
La comprensión visual continua y las preguntas ocasionales sobre imágenes utilizan diferentes configuraciones de pista y comportamiento de envío. Seleccione una opción según el ancho de banda, el consumo de energía y el diseño de interacción.
- Pista Video continua
- Enviar una sola imagen a través de la pista Data
8. Desconectar y destruir el motor
Cuando finalice la sesión, desconéctese y destruya el motor. disconnect o destroy cierran automáticamente los dispositivos multimedia, por lo que no necesita llamar a los métodos stop por separado. AoqClientEngine es un singleton y no se puede crear nuevamente hasta que se llame a destroy.
Ejemplo completo
La siguiente clase acepta un AoqConnectConfig que se asignó desde la respuesta de token del servidor de aplicaciones. Agregue estado de UI, permisos, recuperación de errores y compresión de imágenes en producción.
Ejecutar y verificar
Complete un turno push-to-talk solo de audio y un turno con una imagen. Resultados esperados:
- La pista Audio está deshabilitada antes de presionar el botón y envía audio continuamente mientras se mantiene presionado el botón.
- Después de soltar el botón, input_audio_buffer.committed, response.created y response.done se reciben en secuencia, y el audio del modelo se reproduce a través de la pista Audio suscrita.
- Con la opción de imagen única, el modelo responde utilizando la imagen y el audio del turno. Con video continuo, utiliza los fotogramas de video más recientes.
Consideraciones importantes
- AOQ transporta audio a través de la pista Audio. No envíe también input_audio_buffer.append.
- input_audio_buffer.commit solo confirma el turno y no desencadena una respuesta del modelo. Envíe response.create después.
- No confirme un búfer de audio vacío. El servicio devuelve un error.
- No habilite el envío de medios antes de session.updated. En modo Manual, no habilite la pista Audio antes de que el usuario presione el botón.
Información relacionada
Para todos los parámetros, campos de eventos e interfaces para otras plataformas, consulte:
- Obtención y configuración de una clave de API
- Selección de región, alcance de implementación y endpoint
- Descripción general del SDK de cliente AOQ
- Descarga del SDK
- Qwen-Omni-Realtime Conexión mediante AOQ
- Guía de usuario de Qwen-Omni-Realtime
- Crear conversaciones en tiempo real en modo VAD sobre AOQ
- Eventos del cliente
- Eventos del servidor
