Todos los productos
Search
Centro de documentos

Alibaba Cloud Model Studio:SDK de Java de Qwen-ASR-Realtime - Referencia de API

Última actualización: Oct 12, 2026

Utilice el SDK de Java de DashScope para llamar a Qwen-ASR-Realtime.

Requisitos previos

ImportanteAlibaba Cloud Model Studio ha lanzado dominios específicos de espacio de trabajo para las regiones de China (Beijing) y Singapur. Los nuevos dominios dedicados ofrecen un rendimiento superior y una mayor estabilidad para las solicitudes de inferencia. Recomendamos migrar a los nuevos dominios:

  • China (Pekín): de dashscope.aliyuncs.com a {WorkspaceId}.cn-beijing.maas.aliyuncs.com
  • Singapur: de dashscope-intl.aliyuncs.com a {WorkspaceId}.ap-southeast-1.maas.aliyuncs.com

Reemplace {WorkspaceId} con su ID de espacio de trabajo real. Los dominios existentes permanecen totalmente funcionales.

Modos de interacción

Qwen-ASR-Realtime admite dos modos para decidir cuándo procesar el audio:

Modo

enableTurnDetection

Cómo funciona

Modo VAD (predeterminado)

true

El servidor detecta los límites del habla mediante la detección de actividad de voz (VAD) y decide cuándo confirmar el búfer de audio para su reconocimiento.

Modo manual

false

El cliente controla cuándo confirmar el audio llamando a commit(). Esto le otorga control total sobre la segmentación.

Para obtener detalles sobre cada modo, consulte Modo VAD y Modo manual.

Ejemplo completo

NotaEl código de ejemplo lee your_audio_file.pcm (PCM16, 16 kHz, mono). Si solo tiene un MP3, WAV o un formato similar, conviértalo con ffmpeg:

ffmpeg -i your_audio.mp3 -ar 16000 -ac 1 -f s16le your_audio_file.pcm
import com.alibaba.dashscope.audio.omni.*;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.google.gson.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sound.sampled.LineUnavailableException;
import java.io.File;
import java.io.FileInputStream;
import java.util.Base64;
import java.util.Collections;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;

public class Qwen3AsrRealtimeUsage {
    private static final Logger log = LoggerFactory.getLogger(Qwen3AsrRealtimeUsage.class);
    private static final int AUDIO_CHUNK_SIZE = 1024; // Audio chunk size in bytes
    private static final int SLEEP_INTERVAL_MS = 30;  // Sleep interval in milliseconds

    public static void main(String[] args) throws InterruptedException, LineUnavailableException {
        CountDownLatch finishLatch = new CountDownLatch(1);

        OmniRealtimeParam param = OmniRealtimeParam.builder()
                .model("qwen3-asr-flash-realtime")
                // The following is the configuration for the Singapore region. When calling, replace "{WorkspaceId}" with your actual workspace ID. Configurations differ by region.
                .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
                // The API Key differs between the Singapore and Beijing regions. Get your API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
                // If you have not configured the environment variable, replace the following line with your Alibaba Cloud Model Studio API Key: .apikey("sk-xxx")
                .apikey(System.getenv("DASHSCOPE_API_KEY"))
                .build();

        OmniRealtimeConversation conversation = null;
        final AtomicReference<OmniRealtimeConversation> conversationRef = new AtomicReference<>(null);
        conversation = new OmniRealtimeConversation(param, new OmniRealtimeCallback() {
            @Override
            public void onOpen() {
                System.out.println("connection opened");
            }
            @Override
            public void onEvent(JsonObject message) {
                String type = message.get("type").getAsString();
                switch(type) {
                    case "session.created":
                        System.out.println("start session: " + message.get("session").getAsJsonObject().get("id").getAsString());
                        break;
                    case "conversation.item.input_audio_transcription.completed":
                        System.out.println("transcription: " + message.get("transcript").getAsString());
                        finishLatch.countDown();
                        break;
                    case "input_audio_buffer.speech_started":
                        System.out.println("======VAD Speech Start======");
                        break;
                    case "input_audio_buffer.speech_stopped":
                        System.out.println("======VAD Speech Stop======");
                        break;
                    case "conversation.item.input_audio_transcription.text":
                        System.out.println("transcription: " + message.get("text").getAsString() + message.get("stash").getAsString());
                        break;
                    default:
                        break;
                }
            }
            @Override
            public void onClose(int code, String reason) {
                System.out.println("connection closed code: " + code + ", reason: " + reason);
            }
        });
        conversationRef.set(conversation);
        try {
            conversation.connect();
        } catch (NoApiKeyException e) {
            throw new RuntimeException(e);
        }

        OmniRealtimeTranscriptionParam transcriptionParam = new OmniRealtimeTranscriptionParam();
        transcriptionParam.setLanguage("zh");
        transcriptionParam.setInputAudioFormat("pcm");
        transcriptionParam.setInputSampleRate(16000);

        OmniRealtimeConfig config = OmniRealtimeConfig.builder()
                .modalities(Collections.singletonList(OmniRealtimeModality.TEXT))
                .transcriptionConfig(transcriptionParam)
                .build();
        conversation.updateSession(config);

        String filePath = "your_audio_file.pcm";
        File audioFile = new File(filePath);
        if (!audioFile.exists()) {
            log.error("Audio file not found: {}", filePath);
            return;
        }

        try (FileInputStream audioInputStream = new FileInputStream(audioFile)) {
            byte[] audioBuffer = new byte[AUDIO_CHUNK_SIZE];
            int bytesRead;
            int totalBytesRead = 0;

            log.info("Starting to send audio data from: {}", filePath);

            // Read and send audio data in chunks
            while ((bytesRead = audioInputStream.read(audioBuffer)) != -1) {
                totalBytesRead += bytesRead;
                String audioB64 = Base64.getEncoder().encodeToString(audioBuffer);
                // Send audio chunk to conversation
                conversation.appendAudio(audioB64);

                // Add small delay to simulate real-time audio streaming
                Thread.sleep(SLEEP_INTERVAL_MS);
            }

            log.info("Finished sending audio data. Total bytes sent: {}", totalBytesRead);

        } catch (Exception e) {
            log.error("Error sending audio from file: {}", filePath, e);
        }

        //send session.finish and wait for finish and close
        conversation.endSession();
        log.info("task finished");

        System.exit(0);
    }
}
        Constants.baseHttpApiUrl = "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1";

Parámetros de solicitud

Parámetros de conexión (OmniRealtimeParam)

Establezca estos parámetros con los métodos encadenados de la clase OmniRealtimeParam.

Haga clic para ver código de ejemplo

OmniRealtimeParam param = OmniRealtimeParam.builder()
        .model("qwen3-asr-flash-realtime")
        // Endpoint for the Singapore region.
        // The following configuration is for the Singapore region. Replace "{WorkspaceId}" with your actual workspace ID. The configuration varies by region.
        .url("wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime")
        // The API keys for the Singapore and Beijing regions are different.
        // To obtain an API key, see https://www.alibabacloud.com/help/model-studio/get-api-key
        // If you have not configured an environment variable, replace the following line with .apikey("sk-xxx").
        .apikey(System.getenv("DASHSCOPE_API_KEY"))
        .build();

Parámetro

Tipo

Obligatorio

Descripción

model

String

Sí

El modelo a utilizar. Ejemplo: qwen3-asr-flash-realtime.

url

String

Sí

El endpoint del servicio. China (Beijing): wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime. Singapur: wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime. Reemplace {WorkspaceId} con su ID de espacio de trabajo real. Reemplace {WorkspaceId} con su ID de espacio de trabajo real.

apikey

String

No

La clave API.

Configuración de la sesión (OmniRealtimeConfig)

Establezca estos parámetros con los métodos encadenados de la clase OmniRealtimeConfig.

Haga clic para ver código de ejemplo

OmniRealtimeTranscriptionParam transcriptionParam = new OmniRealtimeTranscriptionParam();
transcriptionParam.setLanguage("zh");
transcriptionParam.setInputSampleRate(16000);
transcriptionParam.setInputAudioFormat("pcm");

OmniRealtimeConfig config = OmniRealtimeConfig.builder()
        .modalities(Collections.singletonList(OmniRealtimeModality.TEXT))
        .enableTurnDetection(true)
        .turnDetectionType("server_vad")
        .turnDetectionThreshold(0.0f)
        .turnDetectionSilenceDurationMs(400)
        .transcriptionConfig(transcriptionParam)
        .build();

Parámetro

Tipo

Obligatorio

Descripción

modalities

List<OmniRealtimeModality>

Sí

Modalidad de salida. Fija en [OmniRealtimeModality.TEXT].

enableTurnDetection

boolean

No

Habilita la VAD del lado del servidor. Cuando está deshabilitada, llame a commit() para activar el reconocimiento manualmente. Valor predeterminado: true.

turnDetectionType

String

No

Tipo de VAD. Fijo en server_vad.

turnDetectionThreshold

float

No

Umbral de sensibilidad de VAD. Valor recomendado: 0.0.

Valor predeterminado: 0.2. Rango válido: [-1, 1].

Los valores más bajos aumentan la sensibilidad (puede activarse con ruido de fondo). Los valores más altos reducen la sensibilidad y ayudan a evitar activaciones false en entornos ruidosos.

turnDetectionSilenceDurationMs

int

No

Duración del silencio en milisegundos que marca el final de una expresión. Valor recomendado: 400.

Valor predeterminado: 800. Rango válido: [200, 6000].

Las duraciones más cortas (por ejemplo, 300 ms) aceleran las respuestas pero pueden dividir las pausas naturales. Las duraciones más largas (por ejemplo, 1200 ms) manejan mejor las pausas pero aumentan la latencia.

transcriptionConfig

OmniRealtimeTranscriptionParam

No

Configuración de reconocimiento de voz. Consulte Parámetros de transcripción.

Parámetros de transcripción (OmniRealtimeTranscriptionParam)

Establezca estos parámetros con los métodos setter de la clase OmniRealtimeTranscriptionParam.

Haga clic para ver código de ejemplo

OmniRealtimeTranscriptionParam transcriptionParam = new OmniRealtimeTranscriptionParam();
transcriptionParam.setLanguage("zh");
transcriptionParam.setInputSampleRate(16000);
transcriptionParam.setInputAudioFormat("pcm");

Parámetro

Tipo

Obligatorio

Descripción

language

String

No

Idioma de la fuente de audio. Para ver los idiomas admitidos, consulte Idiomas admitidos.

inputSampleRate

int

No

Tasa de muestreo de audio en Hz. Valores válidos: 16000, 8000.

Predeterminado: 16000.

Establecer 8000 provoca un sobremuestreo del lado del servidor a 16,000 Hz, lo que puede introducir una ligera latencia. Úselo solo para audio nativo de 8,000 Hz (por ejemplo, telefonía).

inputAudioFormat

String

No

Formato de codificación de audio. Valores válidos: pcm, opus. Valor predeterminado: pcm.

corpusText

String

No

Texto de contexto para el sesgo contextual. Proporcione texto de fondo, vocabularios de entidades o material de referencia para mejorar la precisión del reconocimiento. Máximo: 10,000 tokens.

Interfaces clave

OmniRealtimeConversation

Importación: com.alibaba.dashscope.audio.omni.OmniRealtimeConversation

Esta clase gestiona el ciclo de vida de WebSocket: conexión al servidor, envío de audio y finalización de la sesión.

Crear una conversación

OmniRealtimeConversation conversation =
        new OmniRealtimeConversation(param, callback);

Crea una nueva instancia de conversación con los parámetros de conexión y el controlador de devoluciones de llamada especificados.

Conectar al servidor

conversation.connect();

Abre una conexión WebSocket. El servidor responde con eventos session.created y session.updated.

Lanza: NoApiKeyException, InterruptedException.

Configurar la sesión

conversation.updateSession(config);

Actualiza la configuración de la sesión después de establecer la conexión. El servidor responde con un evento session.updated. Si no se llama, el servidor utiliza la configuración predeterminada.

Enviar datos de audio

conversation.appendAudio(audioBase64);

Agrega un segmento de audio codificado en Base64 al búfer de audio del servidor.

  • Modo VAD (enableTurnDetection=true): El servidor detecta los límites del habla y decide cuándo procesar el búfer.
  • Modo manual (enableTurnDetection=false): El audio se acumula en el búfer hasta que llama a commit() para activar el reconocimiento. Cada evento puede contener hasta 15 MiB de datos de audio.

Confirmar el búfer de audio

conversation.commit();

Envía el audio almacenado en el búfer para su reconocimiento. El servidor responde con un evento input_audio_buffer.committed.

Este método solo está disponible en modo manual (enableTurnDetection=false). Se produce un error si el búfer de audio está vacío.

Finalizar la sesión

conversation.endSession();  // synchronous
// or
conversation.endSessionAsync();  // asynchronous

Notifica al servidor que termine de procesar cualquier audio restante y finalice la sesión. El servidor responde con un evento session.finished.

Cuándo llamar:

  • Modo VAD: Después de terminar de enviar audio.
  • Modo manual: Después de llamar a commit().

Cerrar la conexión

conversation.close();

Detiene la tarea y cierra la conexión WebSocket inmediatamente.

Obtener IDs de sesión y respuesta

String sessionId = conversation.getSessionId();
String responseId = conversation.getResponseId();
  • getSessionId() devuelve el ID de sesión de la tarea actual.
  • getResponseId() devuelve el ID de respuesta de la respuesta más reciente del servidor.

OmniRealtimeCallback

Importación: com.alibaba.dashscope.audio.omni.OmniRealtimeCallback

Herede esta clase e implemente los métodos de devolución de llamada para gestionar los eventos del servidor.

Método

Parámetros

Se activa cuando

onOpen()

None

La conexión WebSocket está establecida.

onEvent(JsonObject message)

message: Un evento del servidor en formato JSON. Tipos de eventos comunes: session.created, session.updated, input_audio_buffer.committed, conversation.item.input_audio_transcription.completed, session.finished.

Se recibe un evento del servidor. Analice el campo type para determinar el tipo de evento.

onClose(int code, String reason)

code: Código de estado. reason: Motivo del cierre.

La conexión WebSocket está cerrada.