Prepare audio, reutilice conexiones, gestione la concurrencia en Java y las tareas asíncronas, y controle los errores en aplicaciones de reconocimiento de voz.
Preparar el audio de entrada
Revise el formato, la frecuencia de muestreo, los canales y la duración de la entrada según las especificaciones de audio del modelo de destino.
- Priorice la calidad de captura y reduzca el ruido y el eco. Antes de activar la supresión de ruido o AEC, compare los resultados antes y después del procesamiento con el mismo conjunto representativo de audio transcrito manualmente.
- Para audio telefónico de 8 kHz, elija un modelo y una frecuencia de muestreo compatibles.
- Elija un modelo compatible con el idioma y el dialecto del audio.
- Si el reconocimiento de términos especializados es impreciso, configure palabras clave o enriquecimiento de contexto según Mejorar la precisión del reconocimiento.
Revisar y procesar el audio
Revisar y procesar el audio
- Revisar el formato de audio
- Convertir la codificación y la frecuencia de muestreo
- Recortar el audio
- Extraer el audio de un video
Utilice FFprobe para revisar el contenedor, el códec, la frecuencia de muestreo y los canales:
Elegir un método de entrada de archivo
Los métodos de entrada de archivo dependen de la API. Por ejemplo, Qwen-Audio-ASR-Flash admite URL de archivos de audio y URI de datos Base64. Codifique el audio local como una URI de datos Base64 para enviarlo directamente. Para ejemplos de codificación y llamadas, consulte API HTTP de Flash.
Al enviar un archivo mediante URL, asegúrese de que el servicio pueda descargarlo durante el procesamiento. Revise los permisos, la vigencia de la URL y el acceso desde la red pública.
En producción, aloje los archivos en almacenamiento estable, como OSS, y envíe sus URL. Reutilice los archivos cargados en los procesos por lotes para reducir cargas repetidas. Antes de usar la carga de archivos locales de un SDK, revise los límites de esa interfaz. Consulte Obtener una URL de archivo temporal para conocer el mecanismo de archivos temporales y sus condiciones.
Gestionar tareas y conexiones en tiempo real
El protocolo run-task / finish-task de Qwen-Audio-ASR-Message, Qwen-Audio-ASR-Streaming, Fun-ASR-Realtime y Paraformer permite reutilizar una conexión de manera secuencial:
- Envíe
run-taskcon untask_idúnico. Esperetask-startedantes de enviar audio. - Después de enviar el audio, envíe
finish-taskcon el mismotask_id. - Espere el evento
task-finisheddel servidor para confirmar la finalización. - Inicie la siguiente tarea en la misma conexión con un
task_idnuevo. No ejecute tareas simultáneas en una sola conexión.
Manejar conexiones inactivas o fallidas
- La conexión se cierra automáticamente si no comienza otra tarea durante unos 60 segundos después de la finalización. Establezca una conexión nueva tras un periodo prolongado de inactividad.
- Después de una falla de tarea, interrupción de red o error de protocolo, cierre la conexión anterior y cree un objeto nuevo. Invalide los objetos del pool en lugar de devolverlos como disponibles.
- Cierre el pool y sus conexiones cuando la aplicación termine o deje de ofrecer reconocimiento.
Manejar silencios prolongados durante una tarea
Si una tarea en ejecución necesita recibir audio silencioso continuo, configure heartbeat=true según su API y siga enviando silencio con la codificación requerida. Después de finalizar la tarea, gestione las conexiones inactivas según la sección anterior. Consulte las siguientes referencias para los parámetros de los modelos.
Eventos del cliente Message | Eventos del cliente Streaming | Eventos del cliente Fun-ASR | Eventos del cliente Paraformer
Configurar la concurrencia en Java
Asigne un objeto Recognition exclusivo a cada tarea en ejecución y devuélvalo solo después de que termine correctamente. El siguiente ejemplo gestiona estos objetos con Commons Pool 2. Cree el pool una vez y reutilícelo entre llamadas.
Agregar dependencias
Complete primero Obtener una clave de API e Instalar un SDK. El ejemplo completo de esta sección requiere DashScope Java SDK 2.18.0 o posterior. Estas configuraciones usan DashScope Java SDK 2.23.2 y Commons Pool 2.12.0:
- Maven
- Gradle
Distinguir la capacidad de conexiones, objetos y solicitudes
El SDK lee las siguientes tres variables de entorno DASHSCOPE_. Establézcalas antes de iniciar el proceso. El código de este ejemplo lee RECOGNITION_OBJECTPOOL_SIZE.
| Variable de entorno | Predeterminado | Función |
|---|---|---|
DASHSCOPE_CONNECTION_POOL_SIZE | 32 | Conexiones HTTP inactivas conservadas por el cliente OkHttp compartido del SDK. |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS | 32 | Capacidad de programación concurrente de solicitudes asíncronas del SDK. Las solicitudes que la exceden esperan. |
DASHSCOPE_MAXIMUM_ASYNC_REQUESTS_PER_HOST | 32 | Capacidad de programación de solicitudes asíncronas por host. |
RECOGNITION_OBJECTPOOL_SIZE | 500 | Total de objetos de reconocimiento permitido en este ejemplo, controlado por maxTotal de Commons Pool. |
La concurrencia es el número de tareas en ejecución simultánea; RPS es el número de solicitudes por segundo. Configure los hilos de trabajo y la capacidad del pool según la concurrencia de la aplicación, y controle la frecuencia de inicio de tareas conforme a los Límites de tasa del modelo.
Referencia de configuración de Paraformer
Referencia de configuración de Paraformer
Los siguientes valores son referencias de planificación de capacidad para aplicaciones Paraformer en tiempo real. La concurrencia por servidor es el número de tareas que se ejecutan al mismo tiempo. El servidor ejecuta únicamente esa aplicación de reconocimiento.
- Para conexiones HTTP inactivas, comience con una capacidad de al menos dos veces la concurrencia máxima observada y ajústela.
- Al inicio, establezca las capacidades de programación asíncrona total y por host con el mismo valor de la capacidad de conexiones. Ajuste después según las colas observadas.
- Para el pool de objetos de reconocimiento, comience con 1.5 a 2 veces la concurrencia máxima observada. El valor predeterminado de 500 pertenece a la aplicación de ejemplo.
| Servidor Alibaba Cloud | Concurrencia de referencia | Capacidad del pool | Conexiones HTTP inactivas |
|---|---|---|---|
| 4 vCPU, 8 GiB | 100 | 500 | 2000 |
| 8 vCPU, 16 GiB | 200 | 500 | 2000 |
| 16 vCPU, 32 GiB | 400 | 500 | 2000 |
Esta configuración se aplica a un servidor dedicado a la aplicación de reconocimiento en tiempo real Paraformer. Ajuste la capacidad según la tasa de envío de audio, los recursos del cliente y la carga de la aplicación. Para los límites de las API de modelos, consulte Límites de tasa.
Implementar un pool de objetos de reconocimiento
Utilice el ciclo de vida siguiente. Cuando se alcanza maxTotal y no hay objetos inactivos, el borrowObject de este ejemplo espera a que se devuelva un objeto. Los objetos se crean según se necesitan y las conexiones WebSocket se establecen al iniciar las solicitudes de reconocimiento.
- Obtenga un objeto
Recognition, inicie el reconocimiento y envíe audio. - Envíe el comando de fin y espere la confirmación. En llamadas asíncronas, revise también el callback de error.
- Después de una finalización correcta, llame a
returnObjectpara permitir la reutilización. - Si hay una falla o interrupción, llame a
invalidateObject. El métododestroyObjectde la fábrica cierra la conexión. - Cuando todas las tareas terminen, cierre el pool para liberar las conexiones de los objetos inactivos.
RecognitionPoolExample.java. Prepare asr-example.pcm con audio PCM mono de 16 kHz y 16 bits, establezca DASHSCOPE_API_KEY y sustituya el workspace y la dirección por la configuración de la región de destino (consulte Endpoints). El ejemplo usa tres hilos de trabajo para procesar nueve tareas.
Preparar las conexiones y medir la latencia
Prepare las conexiones enviando solicitudes reales de reconocimiento para establecer conexiones WebSocket reutilizables por las tareas posteriores.
- Antes de medir, envíe solicitudes con la concurrencia prevista para producción. Uno o dos minutos son una referencia inicial que debe ajustarse a la carga.
- Confirme que existen conexiones reutilizables antes de medir el estado estable. Separe las mediciones de arranque en frío de las de operación estable.
- Las conexiones pueden cerrarse durante la inactividad y requerir un nuevo establecimiento. Repita la preparación cuando sea necesario antes de nuevas mediciones.
Gestionar trabajos de transcripción asíncronos
Para la transcripción por lotes con alta concurrencia, priorice los callbacks de finalización de tareas para reducir las consultas periódicas. Para configurar callbacks, conocer la estructura de los mensajes y obtener los resultados, consulte Configurar callbacks de tareas asíncronas.
Controlar las tasas de envío, consulta y carga
- Envío de tareas: controle la frecuencia de envío conforme a los Límites de tasa del modelo de destino.
- Consultas de estado: la API de consulta tiene un límite predeterminado de 20 QPS, que puede aumentarse hasta 100 QPS (contacte a su gerente de cuenta de Alibaba Cloud para solicitar un aumento), por cuenta principal de Alibaba Cloud, incluidos sus usuarios RAM. Para las consultas periódicas, comience con un intervalo de 2 a 5 segundos y ajústelo a la cantidad de tareas para mantener la tasa total dentro del límite. Para consultas, consultas por lotes y cancelación, consulte Gestionar tareas asíncronas.
- Carga de archivos temporales: la API de credenciales de carga tiene un límite de 100 QPS por cuenta principal de Alibaba Cloud y por modelo. Este límite no puede aumentarse. Utilice almacenamiento estable, como OSS, en producción y en cargas con alta concurrencia. Para los procedimientos y límites de carga temporal, consulte Obtener una URL de archivo temporal.
Guardar los resultados oportunamente
Descargue y guarde los archivos en cuanto la tarea termine correctamente. Por ejemplo, el campo transcription_url de API HTTP de Qwen-Audio-ASR-Filetrans tiene una vigencia de 24 horas. Descargue y conserve los resultados de forma persistente antes de que venza.
- Si la respuesta contiene un arreglo
results, revise cadasubtask_statusantes de descargar el JSON de transcripción de los archivos procesados correctamente. Guarde las marcas de tiempo, la información de los hablantes y los demás campos necesarios para la aplicación. - Conserve la relación entre tareas y archivos y el estado final. Si falla una descarga, guarde el registro y reintente durante la vigencia de la URL.
Manejar errores y reintentos
Decida si corresponde reintentar según el tipo de error. Registre el ID de solicitud, el ID de tarea, el modelo, la región y la etapa fallida para distinguir problemas de entrada o permisos de fallas temporales.
| Problema | Acción |
|---|---|
| Archivo de entrada o parámetros inválidos | Revise URL, codificación, frecuencia, canales y rangos de parámetros. Corrija antes de enviar otra vez. |
| Autenticación o endpoint incorrectos | Revise la clave de API, el workspace y la región del endpoint, y corrija según el mensaje de error. |
| Limitación de tasa | Reduzca la frecuencia de solicitudes o de inicio de tareas y siga Límites de tasa. Evite ciclos de reintento inmediato. |
| Tiempo de espera de red agotado, interrupción o error temporal del servidor (5xx) | Si falla una consulta o descarga, utilice reintentos con espera progresiva y límites de intentos y de espera total. Tras un tiempo de espera agotado al enviar una tarea asíncrona, consulte la tarea si recibió un task_id. Si no lo recibió, decida si debe reenviarla según la tolerancia de la aplicación al procesamiento y los cargos duplicados. |
| Falla de tarea o archivo asíncrono | Conserve los errores de tarea y archivo, identifique la causa y decida si debe corregir la entrada o reenviar. |
Documentación relacionada
- Integración básica: Reconocimiento de voz en tiempo real y Reconocimiento de voz no en tiempo real.
- Calidad del reconocimiento: Mejorar la precisión del reconocimiento.
- Tareas asíncronas: Configurar callbacks de tareas asíncronas y Gestionar tareas asíncronas.