Skip to main content

Síntesis de voz en tiempo real

Conozca las funciones de síntesis de voz en tiempo real, las llamadas en streaming y las formas de mejorar la calidad de la síntesis.

Funciones

La síntesis de voz en tiempo real recibe segmentos de texto y devuelve audio progresivamente. Permite convertir el texto en voz mientras un modelo de lenguaje grande lo genera.
  • Idiomas y dialectos: seleccione un modelo y una voz para el idioma de destino o indique el dialecto mediante una instrucción. Consulte Dialectos.
  • Expresividad: ajuste la interpretación mediante instrucciones en lenguaje natural o inserte etiquetas de emoción y sonidos no verbales. Consulte Control mediante instrucciones y Etiquetas de emoción y sonidos no verbales.
  • Voces personalizadas: cree una voz a partir de una muestra de audio con la clonación de voz o de una descripción con el diseño de voz.
  • Control detallado y fórmulas: utilice SSML y LaTeX para controlar las pausas y la pronunciación o convertir fórmulas en voz.
  • Control de audio: ajuste velocidad, tono, volumen y tasa de bits, con formatos de audio habituales, como PCM, WAV, MP3 y Opus, y frecuencias de muestreo de hasta 48 kHz. Consulte los parámetros de la API para conocer los valores y las condiciones de compatibilidad.
Las funciones disponibles varían según el modelo y la voz. Revise su alcance en la documentación de la función correspondiente.Para enviar el texto completo en una solicitud HTTP, consulte Síntesis de voz no en tiempo real.

Primeros pasos

Las aplicaciones móviles que requieren baja latencia y transmisión de audio estable en redes débiles pueden usar AOQ. Para conocer el acceso mediante AOQ, las diferencias entre AOQ, WebRTC y WebSocket y los modelos compatibles, consulte la Descripción general de Realtime API.
  • Qwen-Audio-TTS (recomendado)
  • CosyVoice
Este ejemplo usa qwen-audio-3.1-tts-flash y la voz del sistema longanhuan_v3.1 en Beijing. Envía texto por segmentos y guarda el audio recibido en output.mp3.
Python
import os
import dashscope

# Si no se ha configurado la variable de entorno, sustituya la siguiente línea por su API Key de Model Studio: api_key="sk-xxx"
# La siguiente configuración corresponde a la región de China (Pekín). Sustituya "{WorkspaceId}" por el ID real de su espacio de trabajo.
client = dashscope.Client(
    api_key=os.environ["DASHSCOPE_API_KEY"],
    workspace="{WorkspaceId}",
    region="cn-beijing",
)

with open("output.mp3", "wb") as audio:
    # Envíe el texto por segmentos y reciba el audio segmento a segmento
    with client.audio.tts.connect(
        model="qwen-audio-3.1-tts-flash",
        voice="longanhuan_v3.1",
        format="mp3",
        sample_rate=24000,
    ) as session:
        for text in ["你好,欢迎使用阿里云百炼。", "文本可以分段发送,音频会逐段返回。"]:
            session.send_text(text)
        session.flush()  # Activa la síntesis del texto almacenado en búfer (no finaliza la entrada)
        session.stop()   # Finaliza la entrada y espera a que se devuelva el audio restante
        for chunk in session.audio_chunks():
            audio.write(chunk)

Mejorar la calidad de la síntesis

Idiomas y pronunciación

Seleccione el método según el contenido que necesite controlar:
NecesidadMétodo
Definir el idioma de destino de la vozUtilice language_hints para definir el idioma general de síntesis, orientar la lectura de números, abreviaturas y símbolos y mejorar la síntesis en idiomas menos difundidos.
Corregir palabras específicas o reemplazar textoUtilice hot_fix para asignar pinyin a palabras específicas o reemplazar palabras antes de sintetizarlas, por ejemplo, para corregir nombres propios de manera uniforme.
Controlar pausas, lectura de números o pronunciación con precisiónMarque el texto con etiquetas SSML para controlar pausas, reglas de lectura y pronunciación.
Leer fórmulas matemáticasUtilice la función LaTeX de CosyVoice para convertir las fórmulas compatibles en voz en chino.
Para modelos y parámetros, consulte la API de Qwen-Audio-TTS o la API de CosyVoice. Para modelos, voces, interfaces y uso de SSML y LaTeX, consulte SSML y LaTeX.
Al usar SSML, envíe el texto SSML completo en una sola entrada y reciba el audio progresivamente. No se admite la entrada de texto en varios fragmentos.

Control mediante instrucciones

Use instruction para especificar el idioma de síntesis y describir la velocidad, la emoción o el estilo de habla en lenguaje natural para controlar la voz sintetizada.
Para crear una voz nueva con un género, una edad o características vocales específicas, o consultar recomendaciones y ejemplos de descripciones de voz, consulte diseño de voz.
  • Qwen-Audio-TTS
  • CosyVoice
Las voces del sistema, clonadas y diseñadas 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 admiten instrucciones en lenguaje natural mediante instruction en las solicitudes de síntesis.Recomendamos especificar el idioma de síntesis y el efecto deseado en instruction para mejorar la calidad de la síntesis. El idioma especificado en la instrucción debe coincidir con el idioma del texto que se va a sintetizar. Por ejemplo, para sintetizar texto en neerlandés, establezca:
请用荷兰话说,每个字都慢慢说

Dialectos

La síntesis de dialectos permite generar voz en dialectos chinos, como los de Henan o Sichuan. La selección del dialecto depende del modelo y del tipo de voz.
  • Qwen-Audio-TTS
  • CosyVoice
  • Voces del sistema: seleccione una voz compatible con el dialecto de destino en la lista Qwen-Audio-TTS. Las voces que admiten directamente el dialecto no requieren ajustes adicionales. Para las voces compatibles con instrucciones de dialecto, utilice el parámetro de control mediante instrucciones instruction.
  • Voces clonadas: especifique el dialecto con el parámetro de control mediante instrucciones instruction.
Para las voces compatibles con instrucciones de dialecto, pase instruction="请讲上海话。" al inicializar SpeechSynthesizer para sintetizar texto en chino con el dialecto de Shanghái.
Para Qwen3-TTS, seleccione una voz compatible con el dialecto deseado en la lista de voces de Qwen3-TTS.

Etiquetas de emoción y sonidos no verbales

Se aplica a 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.
Las etiquetas de emoción y paralingüísticas controlan la emoción y el estilo de la voz e insertan sonidos, como risas o suspiros, en posiciones específicas. Escriba las etiquetas directamente en el texto que desea sintetizar, text, sin parámetros adicionales.

Ejemplos de uso

Este texto comienza con una interpretación entusiasta, inserta una risa en la posición indicada y luego continúa la voz:
[excited]今天的天气真不错![laughing]我们一起出去玩吧!
Este texto cambia a una interpretación entusiasta en la segunda oración:
[serious]请注意安全事项。[excited]好了,现在让我们开始吧!

Etiquetas compatibles

  • Etiquetas de control
  • Etiquetas de sonidos no verbales
Una etiqueta de control establece la emoción o el estilo del texto siguiente hasta la próxima etiqueta de control. Si una oración larga se divide automáticamente, el efecto queda limitado al segmento resultante.
EtiquetaDescripción
[sad]Triste
[amazed]Asombrado
[deep and loud shouting]Grito grave y fuerte
[trembling]Tembloroso
[angry]Enojado
[excited]Entusiasmado
[sarcastic]Sarcástico
[curious]Curioso
[like dracula]Interpretación de Drácula
[bored]Aburrido
[tired]Cansado
[scornful]Desdeñoso
[shouting]Grito
[asmr]Voz suave de ASMR
[panicked]Asustado
[mischievously]Travieso
[empathetic]Empático
[whispers]Susurro
[reluctantly]Reacio
[crying]Llanto
[serious]Serio
[very slowly]Muy lento
[very fast]Muy rápido

Aplicar en producción

Cancelar tarea

Con Qwen-Audio-TTS o CosyVoice, envíe una instrucción de cancelación para interrumpir la síntesis actual. El servidor termina la tarea y devuelve task-finished.
MétodoVersión requeridaUso
SDK de Python2.0.1 o posteriorLlame a session.cancel() en el objeto de sesión devuelto por client.audio.tts.connect.
SDK de Java2.22.26 o posteriorLlame a SpeechSynthesizer.streamingCancel().
Protocolo WebSocket directoNo requiere SDKEnvíe finish-task con directive=cancel en input.

Reutilización de conexiones WebSocket

Una conexión WebSocket puede procesar varias síntesis consecutivas. Inicie la siguiente según la serie del modelo:
Serie del modeloEvento de finalizaciónIniciar la siguiente síntesis
Qwen-Audio-TTS, CosyVoicetask-finishedEnvíe run-task con un task_id nuevo para cada síntesis y después envíe el texto según el flujo de la serie. Esto también se aplica después de cancelar.
Al llamar a Qwen-Audio-TTS o CosyVoice con el SDK de Python, la sesión creada por client.audio.tts.connect cierra la conexión subyacente cuando la tarea termina o se cancela. Para reutilizar una conexión, primero cree una conexión WebSocket compartida con client.ws_connection() y pásela a client.audio.tts.connect mediante connection=. Después podrá ejecutar varias síntesis consecutivas sobre la misma conexión. Cierre la conexión con WsConnection.close cuando haya terminado.
Qwen3-TTSresponse.doneContinúe enviando input_text_buffer.append en la misma sesión. La síntesis se inicia automáticamente o con input_text_buffer.commit, según el modo. Envíe session.finish solo después de todo el texto.
Para configurar los pools del SDK y consultar ejemplos completos, vea Síntesis de voz con alta concurrencia. Para las sesiones Qwen3-TTS, vea la API de WebSocket. Para Qwen-Audio-TTS / CosyVoice, la conexión se cierra automáticamente si no inicia otra tarea dentro de los 60 segundos posteriores a la anterior. Vuelva a conectarse si la conexión se cerró o el estado de la tarea es inválido.

Límites de tasa

Controle la frecuencia de solicitudes y la concurrencia según los límites del modelo. Para límites, errores habituales y soluciones, vea Límites de tasa.

Mejores prácticas de alta concurrencia

Utilice pools para reutilizar objetos y conexiones y configure concurrencia, calentamiento y errores según su carga. Vea Síntesis de voz con alta concurrencia.

Modelos compatibles

  • Singapore
  • China (Beijing)
Utilice una clave de API y un punto de conexión de esta región para llamar a los siguientes modelos:
  • Qwen-Audio-TTS: qwen-audio-3.1-tts-plus, qwen-audio-3.1-tts-flash, qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash
  • CosyVoice: cosyvoice-v3-plus, cosyvoice-v3-flash
  • Qwen3-TTS: qwen3-tts-flash-realtime
Para consultar voces del sistema y muestras de audio, consulte las listas Qwen-Audio-TTS, CosyVoice y Qwen3-TTS. Una voz clonada o diseñada debe utilizarse con el modelo de destino indicado durante su creación.

Referencia de la API

Para la conexión mediante AOQ, consulte Conexión mediante AOQ de Qwen-Audio-TTS o Conexión mediante AOQ de CosyVoice. Para conocer el alcance exacto, consulte Compatibilidad de modelos y protocolos. Consulte las siguientes páginas para obtener ejemplos WebSocket directos completos.

FAQ

P: ¿Cómo soluciono problemas de audio silencioso al usar una voz clonada?

Compruebe que voice sea el ID de una voz creada correctamente y que su target_model coincida con el model de síntesis. Para conocer el estado, los requisitos del audio de origen y las recomendaciones de calidad, consulte Clonación de voz.

P: ¿Por qué la duración real del audio sintetizado difiere de la duración mostrada en el archivo WAV?

En WAV por streaming, el encabezado puede no reflejar la longitud final del audio. Para obtener metadatos de duración precisos, configure format como pcm, reciba todo el audio y agregue un encabezado WAV con la longitud real.

P: ¿Por qué no se reproduce el archivo de audio?

Solucione problemas según su escenario:
  1. Audio guardado como un archivo completo (como xx.mp3)
    1. Consistencia del formato de audio: El formato de audio en los parámetros de solicitud debe coincidir con la extensión del archivo (por ejemplo, si el parámetro es wav, el archivo debe ser .wav).
    2. Compatibilidad del reproductor: Confirme que el reproductor admite el formato de audio y la frecuencia de muestreo.
  2. Reproducción de audio en streaming
    1. Guarde el flujo de audio como un archivo completo e intente reproducirlo con un reproductor multimedia. Si el archivo no se reproduce, consulte el escenario 1 anterior.
    2. Si el archivo se reproduce correctamente, el problema reside en la implementación de reproducción por streaming. Confirme que el reproductor admita reproducción por streaming (como ffmpeg, pyaudio, AudioFormat o MediaSource).

P: ¿Por qué la reproducción del audio se entrecorta?

Solucione problemas siguiendo estos pasos:
  1. Verifique la tasa de envío de texto: Asegúrese de que el intervalo de envío sea razonable para evitar que el segmento de audio anterior termine antes de que llegue el siguiente texto.
  2. Verificar el rendimiento de la función de callback:
    • Confirme que no existe lógica de bloqueo en la función de callback.
    • Las funciones callback se ejecutan en el hilo de WebSocket. Las operaciones de bloqueo afectan la recepción de datos. Escriba los datos de audio en un búfer separado y procéselos en otro hilo.
  3. Verifique la estabilidad de la red: Las fluctuaciones de la red pueden causar interrupciones o retrasos en la transmisión de audio.

P: ¿Por qué tarda tanto la síntesis de voz?

Con entrada segmentada, los intervalos largos entre envíos de texto aumentan el tiempo total de síntesis. La primera llamada también incluye la creación de la conexión WebSocket. Para calentamiento y mediciones con alta concurrencia, consulte Síntesis de voz con alta concurrencia.

P: ¿Cómo restrinjo una clave API únicamente al servicio de síntesis de voz (aislamiento de permisos)?

Cree un nuevo espacio de trabajo y conceda acceso únicamente a modelos específicos. Esto limita el alcance de la clave de API. Para más detalles, consulte Gestionar espacios de trabajo.