Skip to main content

SDK de Python de Qwen-ASR-Realtime - Referencia de API

Transmita audio a Qwen-ASR-Realtime mediante WebSocket y reciba resultados de transcripción en tiempo real a través del SDK de Python de DashScope.

Requisitos previos

Antes de comenzar, asegúrese de tener:
Alibaba 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.

Ejemplo completo

El 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
Python
import logging
import os
import signal
import sys
import time
import dashscope
from concurrent.futures import ThreadPoolExecutor

# Las API Key de las regiones de Singapur y Pekín son diferentes. Obtenga su API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Si no se ha configurado la variable de entorno, sustituya la siguiente línea por su API Key de Model Studio de Alibaba Cloud: api_key="sk-xxx"
client = dashscope.Client(
    api_key=os.environ.get('DASHSCOPE_API_KEY'),
    # La siguiente es la configuración de la región de Singapur (ap-southeast-1). Al realizar la llamada, sustituya "{WorkspaceId}" por el ID real de su espacio de trabajo. La configuración varía según la región.
    workspace="{WorkspaceId}",
    region="ap-southeast-1",
)

def setup_logging():
    """Configure log output"""
    logger = logging.getLogger('dashscope')
    logger.setLevel(logging.DEBUG)
    handler = logging.StreamHandler(sys.stdout)
    handler.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    logger.propagate = False
    return logger

def handle_event(event):
    """Handle a server-side event"""
    kind = event.get('type')
    if kind == 'session.created':
        print(f"Start session: {event['session']['id']}")
    elif kind == 'conversation.item.input_audio_transcription.completed':
        print(f"Final recognized text: {event['transcript']}")
    elif kind == 'conversation.item.input_audio_transcription.text':
        print(f"Got transcription result: {event['text'] + event['stash']}")
    elif kind == 'input_audio_buffer.speech_started':
        print('======Speech Start======')
    elif kind == 'input_audio_buffer.speech_stopped':
        print('======Speech Stop======')

def receive_events(session):
    """Receive and process server-side events"""
    for event in session.events():
        handle_event(event)

def read_audio_chunks(file_path, chunk_size=3200):
    """Read the audio file in chunks"""
    with open(file_path, 'rb') as f:
        while chunk := f.read(chunk_size):
            yield chunk

def send_audio(session, file_path, delay=0.1):
    """Send audio data"""
    if not os.path.exists(file_path):
        raise FileNotFoundError(f"Audio file {file_path} does not exist.")

    print("Processing audio file... Press 'Ctrl+C' to stop.")
    for chunk in read_audio_chunks(file_path):
        session.append_audio(chunk)  # los bytes se codifican automáticamente en Base64 antes de enviarse
        time.sleep(delay)

def main():
    setup_logging()

    audio_file_path = "./your_audio_file.pcm"

    # Al entrar en el contexto with se establece la conexión automáticamente
    with client.audio.realtime.connect(
        model='qwen3-asr-flash-realtime',
    ) as session:
        def handle_exit(sig, frame):
            print('Ctrl+C pressed, exiting...')
            session.close()
            sys.exit(0)

        signal.signal(signal.SIGINT, handle_exit)

        # Actualice la configuración de la sesión: solo salida de texto, con la transcripción del audio de entrada habilitada
        session.update_session(
            output_modalities=['text'],
            enable_input_audio_transcription=True,
            transcription_params={
                'language': 'zh',
                'sample_rate': 16000,
                'input_audio_format': 'pcm',
            },
        )
        # Lea hasta session.updated para confirmar que la configuración se ha aplicado
        for event in session.events():
            if event.get('type') == 'session.updated':
                break

        with ThreadPoolExecutor(max_workers=1) as pool:
            receiver = pool.submit(receive_events, session)
            try:
                send_audio(session, audio_file_path)
                # enviar session.finish y esperar el evento finished y el cierre
                session.end_session()
                receiver.result()
            finally:
                # close debe ejecutarse dentro del contexto del pool para desbloquear el receptor
                session.close()
        print("Audio processing completed.")

if __name__ == '__main__':
    main()

Parámetros de solicitud

client.audio.realtime.connect

Los siguientes parámetros se configuran con client.audio.realtime.connect.
# Las API Key de las regiones de Singapur y Pekín son diferentes. Obtenga su API Key: https://www.alibabacloud.com/help/model-studio/get-api-key
# Si no se ha configurado la variable de entorno, sustituya la siguiente línea por su API Key de Model Studio de Alibaba Cloud: api_key="sk-xxx"
client = dashscope.Client(
    api_key=os.environ.get('DASHSCOPE_API_KEY'),
    # La siguiente es la configuración de la región de Singapur (ap-southeast-1). Al realizar la llamada, sustituya "{WorkspaceId}" por el ID real de su espacio de trabajo. La configuración varía según la región.
    workspace="{WorkspaceId}",
    region="ap-southeast-1",
)

# Cree una sesión de reconocimiento en tiempo real: al entrar en el contexto with se establece la conexión automáticamente
session = client.audio.realtime.connect(
    model='qwen3-asr-flash-realtime',
)
ParámetroTipoObligatorioDescripción
modelstrSíModelo a utilizar.
ws_urlstrNoEndpoint WebSocket completo. Si no se especifica, el endpoint se selecciona automáticamente según el workspace y la region del Client:
China (Pekín): 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.






















Configuración de sesión

Después de conectarse, llame a update_session para configurar los parámetros de la sesión.
session.update_session(
    output_modalities=['text'],
    enable_turn_detection=True,
    turn_detection_type="server_vad",
    turn_detection_threshold=0.0,
    turn_detection_silence_duration_ms=400,
    enable_input_audio_transcription=True,
    transcription_params={
        'language': 'zh',
        'sample_rate': 16000,
        'input_audio_format': 'pcm',
    },
)
ParámetroTipoObligatorioDescripción
output_modalitiesList[str]SíModalidad de salida. Fija en ["text"].
enable_turn_detectionboolNoHabilita la Detección de Actividad de Voz (VAD) del lado del servidor. Predeterminado: True. Cuando es False, llame a commit() manualmente para activar el reconocimiento.
turn_detection_typestrNoTipo de VAD del lado del servidor. Fijo en server_vad.
turn_detection_thresholdfloatNoUmbral de sensibilidad de VAD. Predeterminado: 0.5. Recomendado: 0.0. Rango válido: [-1, 1].
Valores más bajos = mayor sensibilidad (puede activarse con ruido de fondo). Valores más altos = menos activaciones falsas en entornos ruidosos.







turn_detection_silence_duration_msintNoDuración del silencio (ms) que marca el final de una declaración. Predeterminado: 800. Recomendado: 400. Rango válido: [200, 6000].
Valores más bajos (por ejemplo, 300 ms) = respuesta más rápida pero puede dividir pausas naturales. Valores más altos (por ejemplo, 1200 ms) = mejor manejo de pausas en oraciones largas pero mayor latencia.







transcription_paramsdictNoConfiguraciones de reconocimiento de voz. Consulte transcription_params.

transcription_params

Configure los ajustes de reconocimiento de voz con el diccionario transcription_params de update_session.
session.update_session(
    output_modalities=['text'],
    enable_input_audio_transcription=True,
    transcription_params={
        'language': 'zh',
        'sample_rate': 16000,
        'input_audio_format': 'pcm',
    },
)
ParámetroTipoObligatorioDescripción
languagestrNoIdioma de origen del audio. Valores admitidos:
zh (chino: mandarín, sichuanés, minnan, wu), yue (cantonés), en (inglés), ja (japonés), ko (coreano), de (alemán), fr (francés), es (español), pt (portugués), it (italiano), ru (ruso), ar (árabe), hi (hindi), id (indonesio), th (tailandés), tr (turco), uk (ucraniano), vi (vietnamita), cs (checo), da (danés), fi (finlandés), fil (filipino), is (islandés), ms (malayo), no (noruego), pl (polaco), sv (sueco)







sample_rateintNoTasa de muestreo de audio en Hz. Predeterminado: 16000. Admitidos: 16000, 8000. Con 8000, el servidor realiza un sobremuestreo a 16,000 Hz antes del reconocimiento, lo que puede añadir una ligera latencia. Utilice 8000 solo para audio fuente de 8 kHz, como grabaciones telefónicas.
input_audio_formatstrNoFormato de audio. Predeterminado: pcm. Admitidos: pcm, opus.
corpus_textstrNoTexto de fondo, vocabularios de entidades u otra información de referencia para el sesgo contextual. Máx.: 10,000 tokens. Para más detalles, consulte Sesgo contextual.

Interfaces clave

Clase RealtimeSession

Se crea una sesión de reconocimiento en tiempo real con client.audio.realtime.connect(model=...): la conexión se establece al entrar en el contexto with (o al llamar al método connect() de la sesión).
MétodoEvento de respuesta del servidor (entregado mediante events())Descripción
connect()session.created, session.updatedAbre una conexión WebSocket con el servidor. Se llama automáticamente al entrar en el contexto with; no llame a connect() y luego entre en el contexto with de la misma sesión.
update_session(...)session.updatedConfigura la sesión. Llame después de connect(). Si se omite, se aplican los valores predeterminados. Consulte Configuración de la sesión para ver los parámetros.
append_audio(audio: Union[str, bytes])NoneAñade un fragmento de audio al búfer de entrada del servidor. Un valor str se considera ya codificado en Base64; los bytes se codifican automáticamente en Base64. Con enable_turn_detection=True, el servidor detecta los límites del habla y confirma automáticamente. Con enable_turn_detection=False, el cliente controla el momento de la confirmación (máx. 15 MiB por evento). Los fragmentos más pequeños mejoran la capacidad de respuesta de la VAD.
commit()input_audio_buffer.committedConfirma el audio almacenado en el búfer para su reconocimiento. Devuelve un error si el búfer está vacío. Deshabilitado cuando enable_turn_detection=True.
end_session()session.finishedFinaliza la sesión después de que el servidor completa el reconocimiento final. En el modo VAD (predeterminado), llame después de enviar todo el audio. En el modo Manual, llame después de commit().
close()NoneFinaliza la tarea y cierra la conexión (idempotente, no envía session.finish).
events()Eventos del servidor (el tipo de evento está en event["type"])Lee continuamente los eventos del servidor. La iteración termina después de que se devuelve session.finished; consuma los eventos desde un único hilo receptor y no cree varios lectores concurrentes.
session.session_id, session.last_response_idNoneEl ID de sesión de la tarea actual y el ID de respuesta más reciente (atributos).

Iteración de eventos (events())

El servidor devuelve eventos de respuesta y datos al cliente en forma de eventos. Itere events() de la sesión en un hilo receptor y distribuya según event["type"] (consulte la lista completa de eventos en Eventos del servidor).
def receive_events(session):
    for event in session.events():
        kind = event.get('type')
        if kind == 'session.created':
            print(f"Start session: {event['session']['id']}")
        elif kind == 'conversation.item.input_audio_transcription.completed':
            print(f"Final recognized text: {event['transcript']}")
        elif kind == 'conversation.item.input_audio_transcription.text':
            print(f"Got transcription result: {event['text'] + event['stash']}")
MétodoParámetrosDescripción
events()event: un evento del servidorLee y devuelve continuamente eventos del servidor (dict). La iteración termina cuando se cierra la conexión o se recibe session.finished.
recv_event()NoneBloquea la lectura de un único evento del servidor sin iterar; devuelve None cuando no hay eventos (la conexión está cerrada).