Skip to main content

Clonación de voz

Cargue una grabación para crear una voz y después úsela en conversaciones de Qwen-Omni o Qwen-Omni-Realtime. Esta guía abarca los idiomas admitidos, los requisitos de audio, los pasos de clonación, la facturación y la administración de voces.

Para consultar los parámetros de solicitudes, las respuestas y los errores, consulte la Referencia de la API de clonación de voz.
Este documento abarca las API de clonación de voz de Qwen-Omni y Qwen-Omni-Realtime. Para modelos de síntesis de voz, consulte la Guía de clonación de voz.
Los dominios específicos de cada espacio de trabajo están disponibles en las regiones de China (Pekín) y Singapur. Mejoran el rendimiento y la estabilidad de la inferencia. Le recomendamos migrar a estos dominios:
  • China (Pekín): de https://dashscope.aliyuncs.com a https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com
  • Singapur: de https://dashscope-intl.aliyuncs.com a https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
Busque su {WorkspaceId} en la página Workspace Details de la consola de Alibaba Cloud Model Studio. El dominio anterior sigue funcionando.

Requisitos de audio

La calidad de la grabación afecta los resultados de clonación. Las voces del sistema y la clonación de voz admiten dialectos diferentes. La siguiente tabla enumera los idiomas y dialectos para la clonación de voz. Para las voces del sistema, consulte la lista de voces.

Elemento

Requisito

Formatos admitidos

WAV (16-bit), MP3, M4A

Duración

Se recomiendan de 10 a 20 segundos. Máximo: 60 segundos.

Tamaño del archivo

< 10 MB

Frecuencia de muestreo

>= 24 kHz

Canales

Mono

Contenido

El audio debe contener al menos 3 segundos de habla continua y clara, sin sonidos de fondo. El resto puede incluir pausas breves (<=2 segundos). Evite música de fondo, ruido u otras voces durante todo el audio. Use audio de habla normal como entrada. No cargue canciones ni audio de canto.

Idiomas

chino (zh), inglés (en), alemán (de), italiano (it), portugués (pt), español (es), japonés (ja), coreano (ko), francés (fr), ruso (ru), tailandés (th), indonesio (id), árabe (ar), checo (cs), danés (da), neerlandés (nl), finés (fi), hebreo (he), hindi (hi), islandés (is), malayo (ms), noruego (no), persa (fa), polaco (pl), sueco (sv), tagalo (tl), turco (tr), urdu (ur), vietnamita (vi)

Dialectos chinos: Dongbei, Shannxi, Sichuan, Henan, Changsha, Tianjin, Hangzhou, Liaoning, Shenyang, Anshan

Inicio rápido

imagen

1. Flujo de trabajo

Cree una voz y después úsela en una llamada al modelo:
  1. Crear una voz Llame a la API Crear una voz y cargue un clip de audio. El sistema analiza el audio y crea una voz clonada personalizada. Debe especificar target_model en este paso para indicar qué modelo omni usará la voz. Si ya tiene una voz, puede omitir este paso y continuar con el siguiente. Llame a la API Enumerar voces para ver las voces existentes.
  2. Usar la voz en una conversación Llame a la API Omni, en tiempo real o no en tiempo real, con la voz creada. El modelo Omni debe coincidir con target_model.

2. Configuración de modelos y requisitos previos

Seleccione los modelos y después complete los requisitos previos.

Configuración de modelos

La clonación de voz requiere dos modelos:
  • Modelo de clonación de voz: qwen-voice-enrollment
  • Modelo Omni que usa la voz:
    • qwen3.8-omni-flash-realtime
    • qwen3.5-omni-plus-realtime
    • qwen3.5-omni-flash-realtime
    • qwen3.5-omni-plus
    • qwen3.5-omni-flash

Requisitos previos

  1. Obtener una API Key: Obtener una API Key. Por seguridad, configure la API Key como variable de entorno.
  2. Instalar el SDK: Instalar el SDK más reciente de DashScope.
  3. Preparar el audio para la clonación: el audio debe cumplir los Requisitos de audio.

3. Ejemplo completo

Este ejemplo clona una voz y la usa en una conversación. Principio clave: el target_model especificado durante la clonación debe coincidir con el modelo de la llamada posterior a la API Omni. De lo contrario, la síntesis fallará. Sustituya el archivo de ejemplo voice.mp3 por su propio audio.
  • Tiempo real
  • Non-realtime
Se aplica a los modelos Qwen-Omni-Realtime. Consulte Qwen-Omni-Realtime.
Python
# Requirements: dashscope >= 1.26.5, pyaudio
import os
import requests
import base64
import pathlib
import time
import pyaudio
from dashscope.audio.qwen_omni import MultiModality, OmniRealtimeCallback, OmniRealtimeConversation
import dashscope
# China (Beijing) region. Replace {WorkspaceId} with your Bailian workspace ID. URLs vary by region.
dashscope.base_http_api_url = "https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1"

# ======= Configuration =======
DEFAULT_TARGET_MODEL = "qwen3.8-omni-flash-realtime"  # Must be the same model for cloning and conversation
DEFAULT_PREFERRED_NAME = "guanyu"
DEFAULT_AUDIO_MIME_TYPE = "audio/mpeg"
VOICE_FILE_PATH = "voice.mp3"  # Path to the local audio file for voice cloning

def create_voice(file_path: str,
                 target_model: str = DEFAULT_TARGET_MODEL,
                 preferred_name: str = DEFAULT_PREFERRED_NAME,
                 audio_mime_type: str = DEFAULT_AUDIO_MIME_TYPE) -> str:
    """
    Create a custom voice and return the voice parameter.
    """
    # API keys differ between the Singapore and Beijing regions. Get an API key: https://www.alibabacloud.com/help/model-studio/get-api-key
    # If you haven't set an environment variable, replace the following line with: api_key = "sk-xxx"
    api_key = os.getenv("DASHSCOPE_API_KEY")

    file_path_obj = pathlib.Path(file_path)
    if not file_path_obj.exists():
        raise FileNotFoundError(f"Audio file not found: {file_path}")

    base64_str = base64.b64encode(file_path_obj.read_bytes()).decode()
    data_uri = f"data:{audio_mime_type};base64,{base64_str}"

    # The following is the Singapore region URL. Replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
    url = "https://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api/v1/services/audio/tts/customization"
    payload = {
        "model": "qwen-voice-enrollment",
        "parameters": {"voice_clone_mode": "normal"},
        "input": {
            "action": "create",
            "target_model": target_model,
            "preferred_name": preferred_name,
            "audio": {"data": data_uri}
        }
    }
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }

    resp = requests.post(url, json=payload, headers=headers)
    if resp.status_code != 200:
        raise RuntimeError(f"Failed to create voice: {resp.status_code}, {resp.text}")

    try:
        return resp.json()["output"]["voice"]
    except (KeyError, ValueError) as e:
        raise RuntimeError(f"Failed to parse voice response: {e}")

class SimpleCallback(OmniRealtimeCallback):
    def __init__(self, pya):
        self.pya = pya
        self.out = None
    def on_open(self):
        self.out = self.pya.open(
            format=pyaudio.paInt16,
            channels=1,
            rate=24000,
            output=True
        )
    def on_event(self, response):
        if response['type'] == 'response.audio.delta':
            self.out.write(base64.b64decode(response['delta']))
        elif response['type'] == 'conversation.item.input_audio_transcription.completed':
            print(f"[User] {response['transcript']}")
        elif response['type'] == 'response.audio_transcript.done':
            print(f"[LLM] {response['transcript']}")

if __name__ == '__main__':
    # If you haven't set an environment variable, replace the following line with: dashscope.api_key = "sk-xxx"
    dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")
    # The following is the Singapore region URL. Replace {WorkspaceId} with your actual workspace ID. URLs vary by region.
    url = "wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime"

    # Step 1: Clone a voice
    voice = create_voice(VOICE_FILE_PATH)
    print(f"Voice cloning complete. Voice: {voice}")

    # Step 2: Start a real-time conversation with the cloned voice
    pya = pyaudio.PyAudio()
    callback = SimpleCallback(pya)
    conv = OmniRealtimeConversation(model=DEFAULT_TARGET_MODEL, callback=callback, url=url)
    conv.connect()
    conv.update_session(
        output_modalities=[MultiModality.AUDIO, MultiModality.TEXT],
        voice=voice  # Use the cloned voice
    )
    mic = pya.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True)
    print("Conversation started. Speak into your microphone (Ctrl+C to exit)...")
    try:
        while True:
            audio_data = mic.read(3200, exception_on_overflow=False)
            conv.append_audio(base64.b64encode(audio_data).decode())
            time.sleep(0.01)
    except KeyboardInterrupt:
        conv.close()
        mic.close()
        callback.out.close()
        pya.terminate()
        print("\nConversation ended")

Cuota de voces y limpieza automática

Límite total: 1,000 voces por cuenta.
Esta API no proporciona un endpoint para contar voces. Llame a la API Enumerar voces para contar sus voces.
Limpieza automática: las voces que no se usan durante un año se eliminan automáticamente.

Facturación

La clonación de voz y las llamadas al modelo se facturan por separado:
  • Clonación de voz: Crear una voz cuesta $0.01 por voz. Las solicitudes de creación fallidas no se cobran.
    Cuota gratuita, únicamente en la región de Pekín del sitio de China y la región de Singapur del sitio internacional:
    • 1,000 creaciones de voz gratuitas en los 90 días posteriores a la activación de Model Studio.
    • Las creaciones fallidas no consumen la cuota gratuita.
    • Eliminar una voz no restablece la cuota gratuita.
    • Una vez que se agota la cuota gratuita o vence el periodo de 90 días, la creación de voz se factura a $0.01/voz.
  • Las conversaciones con una voz clonada se facturan según el uso de tokens del modelo. Consulte Precios de inferencia de modelos.
Usted es responsable de la propiedad y el uso legal de la voz que proporciona. Lea el Acuerdo de servicio.

Guía de grabación

Equipo de grabación

Use un micrófono con cancelación de ruido o grabe con un teléfono a corta distancia en un entorno silencioso.

Entorno de grabación

Ubicación

  • Grabe en un espacio cerrado pequeño de 10 metros cuadrados o menos.
  • Elija una habitación con materiales absorbentes del sonido, como espuma acústica, alfombras o cortinas.
  • Evite vestíbulos grandes y abiertos, salas de conferencias o salones de clases con mucha reverberación.

Control de ruido

  • Ruido exterior: cierre puertas y ventanas para bloquear el tráfico, las obras y otros sonidos externos.
  • Ruido interior: apague los aires acondicionados, los ventiladores y los balastos de las lámparas fluorescentes.
  • Grabe el sonido ambiental con su teléfono y reprodúzcalo a volumen alto para identificar fuentes de ruido ocultas.

Control de reverberación

  • La reverberación hace que el audio suene apagado y reduce su claridad.
  • Reduzca los reflejos de superficies lisas: cierre cortinas, abra las puertas de los armarios y cubra escritorios y estantes con ropa o cobijas.
  • Use objetos irregulares, como libreros y muebles tapizados, para crear reflejos difusos.

Preparación del guion

  • Adapte el guion al caso de uso de destino. Por ejemplo, use un estilo de diálogo de atención al cliente para un escenario de atención al cliente.
  • Asegúrese de que el guion no contenga material sensible o ilegal, como contenido político, pornográfico o violento, ya que esto provoca errores de clonación.
  • Evite frases cortas, como "hello" o "yes". Use oraciones completas.
  • Mantenga la coherencia semántica y evite pausas frecuentes al leer. Se recomiendan al menos 3 segundos consecutivos sin interrupción.
  • Puede usar la emoción de destino, por ejemplo, amistosa o seria. Mantenga un tono natural y evite una interpretación exagerada.

Pasos recomendados

Use una recámara típica como ejemplo:
  1. Cierre puertas y ventanas para bloquear el ruido exterior.
  2. Apague los aires acondicionados, ventiladores y otros aparatos.
  3. Cierre las cortinas para reducir los reflejos del vidrio.
  4. Cubra la superficie del escritorio con ropa o una cobija para reducir los reflejos.
  5. Practique el guion, elija el tono del personaje y hable de forma natural.
  6. Mantenga una distancia aproximada de 10 cm del dispositivo de grabación para evitar distorsión por sonidos oclusivos o una señal débil.