Skip to main content

Fun-ASR-Realtime 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 Fun-ASR-Realtime mediante AOQ.

Al acceder a Fun-ASR-Realtime mediante AOQ, el cliente carga audio mediante la pista Audio y envía eventos de tareas mientras recibe resultados de reconocimiento mediante la pista Data.

Requisitos previos

  • Seleccione un modelo compatible con AOQ. Para obtener detalles de compatibilidad, consulte Á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 SDK. La siguiente explicación usa Android Java y transmisión Opus como ejemplo; importe también el complemento de Opus. Al usar un micrófono para capturar audio, solicite permisos de grabación del lado del cliente.

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 endpoint de la región y el espacio de trabajo seleccionados. Fun-ASR-Realtime usa la ruta de conexión Inference; el siguiente ejemplo usa fun-asr-realtime.
curl -X POST \
  "https://{endpoint}/api/v1/webrtc/inference?model=fun-asr-realtime" \
  -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 las pistas Audio y Data y suscríbase a la pista Data. El siguiente ejemplo configura codificación Opus mono de 16 kHz y captura integrada, y desactiva el envío de la pista Audio mientras se establece la conexión. El evento de tarea especifica el formato de entrada del modelo, y la configuración de codificació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 = 16000;
codec.channel = 1;
codec.bitrate = 24000;
engine.setAudioEncoderConfig(codec);

AoqClientEngine.AoqTrackParam audio = new AoqClientEngine.AoqTrackParam();
audio.trackType = AoqClientEngine.AoqTrackType.AoqTrackTypeAudio;
connectConfig.publishTracks.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.AoqAudioCaptureConfig capture = new AoqClientEngine.AoqAudioCaptureConfig();
capture.channel = 1;
capture.isExternal = false;
engine.startAudioCapture(capture);
engine.enableSendMediaStream(AoqClientEngine.AoqTrackType.AoqTrackTypeAudio, false);
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 reconocimiento y manejar 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 usan el mismo valor.
{
  "header": {
    "action": "run-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "task_group": "audio",
    "task": "asr",
    "function": "recognition",
    "model": "fun-asr-realtime",
    "parameters": {
      "format": "pcm",
      "sample_rate": 16000
    },
    "input": {}
  }
}
Lea header.event de onDataMsg. El audio ascendente solo se permite después de recibir task-started.
engine.enableSendMediaStream(AoqClientEngine.AoqTrackType.AoqTrackTypeAudio, true);
Lea el texto reconocido de payload.output.sentence en result-generated e ignore los mensajes de latido con heartbeat=true. sentence_end=false representa texto intermedio y sentence_end=true, el texto final de la oración. Actualice el texto de la misma oración según sentence_id. Al recibir task-failed, detenga el envío ascendente de este turno y lea header.error_code y header.error_message. Para consultar los parámetros de tareas y los campos de eventos, consulte Eventos del cliente y Eventos del servidor.

4. Finalizar la tarea y liberar los recursos

Cuando termine la grabación, deje de capturar audio nuevo y espere a que se envíe el audio pendiente. Llame a enableSendMediaStream para cerrar el envío ascendente de la pista Audio y después envíe finish-task mediante la pista Data. Mantenga la conexión abierta para recibir los resultados de reconocimiento restantes y espere task-finished.
{
  "header": {
    "action": "finish-task",
    "task_id": "0706c14c-dc16-4e45-8cb6-9d00686e8e19",
    "streaming": "duplex"
  },
  "payload": {
    "input": {}
  }
}
Cuando la conexión ya no sea necesaria, llame a stopAudioCapture, disconnect y AoqClientEngine.destroy, en ese orden, para liberar los recursos.

Documentación relacionada