Skip to main content

Qwen-Audio-TTS Conexión mediante AOQ

Esta sección describe la autenticación, la configuración de medios, el establecimiento de la conexión y el procesamiento de eventos de tareas para acceder a Qwen-Audio-TTS mediante AOQ.

Al acceder a Qwen-Audio-TTS mediante AOQ, el cliente envía texto y eventos de tareas mediante la pista Data y recibe la voz sintetizada mediante la pista Audio.

Requisitos previos

  • Seleccione un modelo compatible con AOQ. La compatibilidad de protocolos de qwen-audio-3.1-tts-plus, qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus y qwen-audio-3.0-tts-flash se describe en Ámbito de compatibilidad de modelos y protocolos.
  • Configure y use la API Key en el AppServer de negocio, de acuerdo con la región y el espacio de trabajo.
  • Importe el SDK de AOQ de su plataforma desde Descarga del SDK. Los siguientes ejemplos usan Android Java y transmisión Opus; importe también el complemento de Opus. La síntesis de texto a voz no requiere permisos de micrófono ni cámara.

1. Obtener las credenciales de conexión

Para obtener un token por adelantado o consultar el flujo completo de autenticación, vea los detalles de autenticación de conexión.
Establezca la variable de entorno DASHSCOPE_API_KEY en AppServer y sustituya {endpoint} por el dominio de acceso de la región y el espacio de trabajo seleccionados. Qwen-Audio-TTS usa la ruta de conexión Inference; el siguiente ejemplo usa qwen-audio-3.0-tts-flash.
curl -X POST \
  "https://{endpoint}/api/v1/webrtc/inference?model=qwen-audio-3.0-tts-flash" \
  -H "Authorization: Bearer ${DASHSCOPE_API_KEY}" \
  -H "Content-Type: application/json" \
  -H "x-dashscope-rtc-transport: moq" \
  -d '{}'
Si usa Token Plan, el valor de WorkspaceId en el dominio de acceso es token-plan. clientIp en el cuerpo de la solicitud es opcional; introduzca la IP pública real del cliente para que el gateway seleccione un punto de acceso de Relay. Si se deja vacío, el gateway usa la IP de origen de la solicitud. La API Key se almacena únicamente en AppServer. AppServer devuelve al cliente los parámetros de conexión de la siguiente tabla; sidExpiresInSecs en la respuesta indica el periodo de validez de la sesión en segundos.
Campos de respuesta del gatewayCampo de AoqConnectConfig
aoqTokenForClienttoken
sidsid
clientRelayCertFingerprintcertFingerprint
clientRelayEndpointsrelayEndpoints, convierta endpoint, port y route_index uno por uno
extraInfo.workspaceIdHashworkspaceIdHash

2. Inicializar el SDK y conectarse

Use AoqCreateConfig para establecer el directorio de trabajo del SDK y llame a AoqClientEngine.createEngine para crear el motor y registrar las funciones de callback. Maneje el estado de la conexión en onConnectionStatusChange, analice los eventos del modelo en onDataMsg y maneje los errores del SDK en onError. SDK de Android proporciona la documentación completa de la inicialización del motor y los campos de conexión. Después de introducir en connectConfig las credenciales que devuelve AppServer, publique la pista Data y suscríbase a las pistas Audio y Data. El ejemplo configura decodificación Opus mono de 24 kHz e inicia el reproductor. El evento de tarea especifica el formato de salida del modelo, y la configuración de decodificación del SDK se usa para la transmisión por las pistas de medios.
AoqClientEngine.AoqAudioCodecConfig codec = new AoqClientEngine.AoqAudioCodecConfig();
codec.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
codec.codecType = AoqClientEngine.AoqEncoderType.AoqEncoderTypeAudioOpus;
codec.sampleRate = 24000;
codec.channel = 1;
engine.setAudioDecoderConfig(codec);

AoqClientEngine.AoqTrackParam audio = new AoqClientEngine.AoqTrackParam();
audio.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
connectConfig.subscribeTracks.add(audio);
AoqClientEngine.AoqTrackParam publishData = new AoqClientEngine.AoqTrackParam();
publishData.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeData;
connectConfig.publishTracks.add(publishData);
AoqClientEngine.AoqTrackParam subscribeData = new AoqClientEngine.AoqTrackParam();
subscribeData.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeData;
connectConfig.subscribeTracks.add(subscribeData);

AoqClientEngine.AoqAudioPlaybackConfig playback = new AoqClientEngine.AoqAudioPlaybackConfig();
playback.channel = 1;
playback.isDefaultSpeaker = true;
engine.startAudioPlayer(playback);
engine.connect(connectConfig);
Espere a que onConnectionStatusChange devuelva AoqConnectionStatusConnected antes de iniciar la tarea. Si hay errores de conexión, borre el estado local de la tarea; para restablecer la conexión es necesario obtener credenciales nuevas.

3. Iniciar la tarea de síntesis y procesar los eventos

Serialice el siguiente JSON en UTF-8, escríbalo en AoqDataMsg.data y después envíelo mediante la pista Data con sendDataMsg. Cada tarea genera un task_id nuevo; todos los eventos de este turno comparten el mismo valor. Use la voz correspondiente al modelo seleccionado.
{
  "header": {
    "action": "run-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "task_group": "audio",
    "task": "tts",
    "function": "SpeechSynthesizer",
    "model": "qwen-audio-3.0-tts-flash",
    "parameters": {
      "text_type": "PlainText",
      "voice": "longanlingxi",
      "format": "pcm",
      "sample_rate": 24000
    },
    "input": {}
  }
}
Lea header.event en onDataMsg. Al recibir task-started, envíe uno o varios eventos continue-task para enviar el texto.
{
  "header": {
    "action": "continue-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {
      "text": "欢迎使用阿里云百炼。"
    }
  }
}
El SDK recibe y reproduce la voz desde la pista Audio. result-generated representa el evento de tarea en la pista Data, mientras que el audio se transmite por la pista Audio. Al recibir task-failed, lea header.error_code y header.error_message, y finalice la tarea actual. Los parámetros de tareas y los campos de eventos se detallan en Eventos del cliente y Eventos del servidor.

4. Finalizar la tarea y liberar los recursos

Después de enviar todo el texto, envíe finish-task. Mantenga la conexión abierta y espere a que el servidor sintetice el texto restante y devuelva task-finished.
{
  "header": {
    "action": "finish-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {}
  }
}
Cuando ya no use la conexión, espere a que termine la reproducción del audio recibido y después llame a stopAudioPlayer, disconnect y AoqClientEngine.destroy, en ese orden, para liberar los recursos.

Documentación relacionada