Qwen-Audio-TTS/CosyVoice SDK Python
Qwen-Audio-TTS/CosyVoice Referência Python
Guia do usuário: Para obter visões gerais dos modelos e seleção de voz, consulte Modelos de conversão de texto em fala.
Limites de texto e formato
Limites de comprimento de texto
- Sem streaming e streaming unidirecional: Máximo de 20.000 caracteres por solicitação.
- Transmissão bidirecional: máximo de 20.000 caracteres por solicitação e 200.000 caracteres cumulativos em todas as solicitações.
Regras de contagem de caracteres
- Os caracteres chineses (simplificado/tradicional, Kanji japonês, Hanja coreano) contam como 2. Todos os outros caracteres (pontuação, letras, números, Kana, Hangul) contam como 1.
- As tags SSML são excluídas da contagem de caracteres.
- Exemplos:
"你好"→ 2 (caractere chinês) + 2 (caractere chinês) = 4 caracteres"中A文123"→ 2 (caractere chinês) + 1 (A) + 2 (caractere chinês) + 1 (1) + 1 (2) + 1 (3) = 8 caracteres"中文。"→ 2 (caractere chinês) + 2 (caractere chinês) + 1 (.) = 5 caracteres"中 文。"→ 2 (caractere chinês) + 1 (espaço) + 2 (caractere chinês) + 1 (.) = 6 caracteres"<speak>你好</speak>"→ 2 (caractere chinês) + 2 (caractere chinês) = 4 caracteres
Formato de codificação
Use codificação UTF-8.
Suporte a expressões matemáticas
A análise de expressões matemáticas (operações básicas, álgebra, geometria) está disponível para cosyvoice-v3-flash e cosyvoice-v3-plus. Este recurso oferece suporte a expressões de nível de ensino fundamental e médio.
Este recurso oferece suporte apenas ao chinês.
Consulte Converter fórmulas LaTeX em fala (somente idioma chinês).
SSML suporte
SSML está disponível para vozes personalizadas (design/clonagem de voz) usando cosyvoice-v3-flash e v3-plus, além de vozes do sistema marcadas como suportadas na lista de vozes.
- Requer SDK DashScope 1.23.4 ou posterior.
- Métodos suportados: Sem streaming e streaming unidirecional (
callsomente método). Transmissão bidirecional (streaming_call) não é compatível. - Passe o texto SSML para o
callmétodo como com texto normal.
Primeiros passos
O Sintetizador de Fala oferece suporte a três métodos de chamada:
- Sem streaming: Bloqueio de chamada. Envia texto completo, retorna áudio completo. Melhor para textos curtos.
- Streaming unidirecional: sem bloqueio. Envia texto completo, recebe áudio via retorno de chamada. Melhor para textos curtos com baixa latência.
- Streaming bidirecional: sem bloqueio. Envia fragmentos de texto de forma incremental, recebe áudio em tempo real via retorno de chamada. Melhor para textos longos com baixa latência.
Para obter exemplos de código completos de todos os três métodos, consulte Síntese de fala em tempo real.
Sem streaming
Envie o texto completo de uma só vez, sem retorno de chamada. Retorna o áudio completo em uma resposta.
Instancie SpeechSynthesizer com parâmetros de solicitação, então ligue call para obter áudio binário.
Máximo de 20.000 caracteres (consulte SpeechSynthesizer call método).
Reinicialize o SpeechSynthesizer instância antes de cada call.
Streaming unidirecional
Envie texto completo, transmita áudio via ResultCallback. Receba resultados em tempo real.
Instancie SpeechSynthesizer com parâmetros de solicitação e retorno de chamada (ResultCallback), então ligue call. Receba resultados através do on_data retorno de chamada.
Máximo de 20.000 caracteres (consulte SpeechSynthesizer call método).
Reinicialize o SpeechSynthesizer instância antes de cada call.
Streaming bidirecional
Envie texto em várias partes em uma única tarefa e receba resultados em tempo real por meio de retornos de chamada.
-
Ligar
streaming_callvárias vezes para enviar fragmentos de texto em ordem. O servidor se divide automaticamente em frases:- Frases completas: sintetizadas imediatamente
- Frases incompletas: armazenadas em cache até serem concluídas e depois sintetizadas
Ligar
streaming_completepara forçar a síntese de todos os fragmentos restantes. -
Intervalo de envio de fragmentos: máximo de 23 segundos (tempo limite fixo do servidor, não configurável). Exceder isso gera um erro de "tempo limite da solicitação após 23 segundos". Ligar
streaming_completeprontamente quando terminar.
Instantiate SpeechSynthesizer
Instancie [SpeechSynthesizer](#speechsynthesizer-class) com [parâmetros de solicitação](#request-parameters) e o [retorno de chamada (ResultCallback)](#callback-interface-resultcallback).
Stream text
Ligar `streaming_call` várias vezes para enviar fragmentos de texto. O servidor retorna áudio em tempo real através do `on_data` retorno de chamada.
Cada fragmento não deve exceder 20.000 caracteres e o total acumulado não deve exceder 200.000 caracteres.
Finish
Ligar `streaming_complete` para finalizar a síntese. Isso bloqueia até `on_complete` ou `on_error` gatilhos.
Sempre chame esse método. Caso contrário, o texto final poderá não ser convertido em fala.
Parâmetros de solicitação
Defina os parâmetros através do SpeechSynthesizer construtor.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| modelo | Sim | O modelo para conversão de texto em fala. Consulte Lista de vozes para todas as opções. | |
| voz | Sim | A voz para síntese. Consulte Lista de vozes para vozes do sistema disponíveis. | |
| formato | enum | Não | Formato de áudio e taxa de amostragem. Padrão: MP3 a 22,05 kHz. |
Observação: A taxa padrão é ideal para a voz selecionada. A redução e o aumento da resolução são suportados.
Todos os modelos suportam WAV, MP3 e PCM em 8/16/22,05/24/44,1/48 kHz. OPUS (OGG_OPUS) em 8/16/24/48 kHz com taxa de bits configurável (requer SDK 1.24.0+). Consulte referência de formato. | | volume | interno | Não | Volume. Padrão: 50. Faixa: [0, 100]. Escala linearmente (0 = silencioso, 50 = padrão, 100 = máximo).
Importante: SDK 1.20.10 e posterior: o nome do campo é volume. |
| fala_taxa | flutuar | Não | Taxa de fala. Padrão: 1.0. Faixa: [0,5, 2,0]. Valores abaixo de 1,0 tornam a fala mais lenta; valores acima de 1,0 aceleram. |
| pitch_taxa | flutuar | Não | Multiplicador de passo. A relação com o tom percebido não é linear; teste para encontrar um valor adequado. Padrão: 1.0. Faixa: [0,5, 2,0]. >1,0 = tom mais alto, <1.0 = lower pitch. |
| bit_rate | int | No | Audio bitrate in kbps. For MP3 or Opus format, adjust with bit_rate. Default: 32. Range: [6, 510]. Set via additional_params (Veja o exemplo abaixo).
Não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, Predefinição: Falso. Aplica-se apenas a vozes clonadas do qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flash, e cosyvoice-v3-plus modelos, e para vozes do sistema marcadas como apoiadas no Qwen-Audio-TTS voice list, CosyVoice voice list. Os horários estão disponíveis apenas através da interface de retorno. - Set via additional_params (Veja o exemplo abaixo).
Não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, Sementes diferentes produzem resultados diferentes. Com modelo, texto, voz e outros parâmetros idênticos, a mesma semente reproduz a mesma saída. Predefinição: 0. Distância: [0, 65535].
Não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, Valores válidos: zh, en, fr, de, ja, ko, ru, pt, th, id, vi, es, it, ms, fil, ar. Parâmetro de montagem, mas apenas o primeiro elemento é usado.
Não, não, não, não, não, não, não, não. Disponível apenas para vozes de sistema marcadas como Instrução de apoio na voice list. Max length: 100 characters. See instruction examples. |
Adicione um identificador AIGC invisível para o áudio gerado. Quando True, o identificador é incorporado em formatos suportados (WAV, MP3, OPUS). Predefinição: Falso. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flash, e cosyvoice-v3-plus. - Set via additional_params (see example below). |
| aigc_propagator | str | No | Set the ContentPropagator field in the AIGC identifier. Only effective when enable_aigc_tag is True. Padrão: UID. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flash, e cosyvoice-v3-plus. - Set via additional_params. |
| aigc_propagate_id | str | No | Set the PropagateID field in the AIGC identifier. Only effective when enable_aigc_tag is True. Padrão: a identificação do pedido. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flash, e cosyvoice-v3-plus. - Set via additional_params. |
Não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, não, Personalize pronúncia de palavras específicas ou substitua texto antes da síntese. Disponível apenas para cosyvoice-v3-flash. Veja. hot_fix example. |
Active o filtro Markdown. Quando ativado, símbolos Markdown são removidos do texto de entrada antes da síntese. Disponível apenas para cosyvoice-v3-flash. Predefinição: Falso. - Set via additional_params. |
| callback | ResultCallback | No | Callback interface (ResultCallback). |
additional_params examples
Setting bit_rate:
synthesizer = SpeechSynthesizer(model="cosyvoice-v3-flash",
voice="longanyang",
format=AudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS,
additional_params={"bit_rate": 32})
Setting word_timestamp_enabled:
synthesizer = SpeechSynthesizer(model="cosyvoice-v3-flash",
voice="your_voice", # A system or cloned voice that supports word-level timestamps
callback=callback, # Timestamps are available only through the callback interface
additional_params={'word_timestamp_enabled': True})
Veja o código completo de exemplo para as datas das palavras.
# coding=utf-8
import dashscope
from dashscope.audio.tts_v2 import *
import json
from datetime import datetime
def get_timestamp():
now = datetime.now()
formatted_timestamp = now.strftime("[%Y-%m-%d %H:%M:%S.%f]")
return formatted_timestamp
# If you have not configured your API key in an environment variable, replace YOUR_API_KEY with your actual key
# dashscope.api_key = "YOUR_API_KEY"
model = "cosyvoice-v3-flash"
# Voice
voice = "longanyang"
# Define callback interface
class Callback(ResultCallback):
_player = None
_stream = None
def on_open(self):
self.file = open("output.mp3", "wb")
print("Connection established: " + get_timestamp())
def on_complete(self):
print("Speech synthesis completed, all results received: " + get_timestamp())
def on_error(self, message: str):
print(f"Speech synthesis error: {message}")
def on_close(self):
print("Connection closed: " + get_timestamp())
self.file.close()
def on_event(self, message):
json_data = json.loads(message)
if json_data['payload'] and json_data['payload']['output'] and json_data['payload']['output']['sentence']:
sentence = json_data['payload']['output']['sentence']
print(f'sentence: {sentence}')
# Get sentence index
# index = sentence['index']
words = sentence['words']
if words:
for word in words:
print(f'word: {word}')
# Example: word: {'text': 'T', 'begin_index': 0, 'end_index': 1, 'begin_time': 80, 'end_time': 200}
def on_data(self, data: bytes) -> None:
print(get_timestamp() + " Binary audio length: " + str(len(data)))
self.file.write(data)
callback = Callback()
# Instantiate SpeechSynthesizer and pass request parameters such as model and voice in the constructor
synthesizer = SpeechSynthesizer(
model=model,
voice=voice,
callback=callback,
additional_params={'word_timestamp_enabled': True}
)
# Send text for synthesis and retrieve binary audio in real time through the on_data method of the callback interface
synthesizer.call("How is the weather today?")
# First request includes WebSocket connection setup time
print('[Metric] requestId: {}, first-package delay: {} ms'.format(
synthesizer.get_last_request_id(),
synthesizer.get_first_package_delay()))
Configuração enable_aigc_tag:
synthesizer = SpeechSynthesizer(model="cosyvoice-v3-flash",
voice="longanyang",
format=AudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS,
additional_params={"enable_aigc_tag": True})
Configuração aigc_propagator:
synthesizer = SpeechSynthesizer(model="cosyvoice-v3-flash",
voice="longanyang",
format=AudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS,
additional_params={"enable_aigc_tag": True, "aigc_propagator": "xxxx"})
Configuração aigc_propagate_id:
synthesizer = SpeechSynthesizer(model="cosyvoice-v3-flash",
voice="longanyang",
format=AudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS,
additional_params={"enable_aigc_tag": True, "aigc_propagate_id": "xxxx"})
Configuração enable_markdown_filter:
synthesizer = SpeechSynthesizer(
model="cosyvoice-v3-flash",
voice="your_voice", # Replace with a cosyvoice-v3-flash cloned voice
additional_params={"enable_markdown_filter": True}
)
exemplo hot_fix
synthesizer = SpeechSynthesizer(
model="cosyvoice-v3-flash",
voice="your_voice", # Replace with a cosyvoice-v3-flash cloned voice
hot_fix={
"pronunciation": [{"weather": "tian1 qi4"}],
"replace": [{"today": "jin1 tian1"}]
}
)
Exemplos de instruções
cosyvoice-v3-flash (cloned voices)
Use qualquer instrução de linguagem natural para controlar os efeitos de síntese.
```plaintext
Please speak in Cantonese. (Supported dialects: Cantonese, Northeastern, Gansu, Guizhou, Henan, Hubei, Jiangxi, Minnan, Ningxia, Shanxi, Shaanxi, Shandong, Shanghainese, Sichuan, Tianjin, Yunnan.)
Please say a sentence as loudly as possible.
Please say a sentence as slowly as possible.
Please say a sentence as quickly as possible.
Please say a sentence very softly.
Can you speak a little slower?
Can you speak very quickly?
Can you speak very slowly?
Can you speak a little faster?
Please say a sentence very angrily.
Please say a sentence very happily.
Please say a sentence very fearfully.
Please say a sentence very sadly.
Please say a sentence very surprisedly.
Please try to sound as firm as possible.
Please try to sound as angry as possible.
Please try an approachable tone.
Please speak in a cold tone.
Please speak in a majestic tone.
I want to experience a natural tone.
I want to see how you express a threat.
I want to see how you express wisdom.
I want to see how you express seduction.
I want to hear you speak in a lively way.
I want to hear you speak with passion.
I want to hear you speak in a steady manner.
I want to hear you speak with confidence.
Can you talk to me with excitement?
Can you show an arrogant emotion?
Can you show an elegant emotion?
Can you answer the question happily?
Can you give a gentle emotional demonstration?
Can you talk to me in a calm tone?
Can you answer me in a deep way?
Can you talk to me with a gruff attitude?
Tell me the answer in a sinister voice.
Tell me the answer in a resilient voice.
Narrate in a natural and friendly chat style.
Speak in the tone of a radio drama podcaster.
```
cosyvoice-v3-flash (system voices)
Use o formato fixo especificado na [lista de vozes](/developer-guides/speech/voice-list/cosyvoice).
Referência de formato
Todos os modelos suportam os seguintes formatos e taxas de amostragem:
AudioFormat.WAV_8000HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 8 kHzAudioFormat.WAV_16000HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 16 kHzAudioFormat.WAV_22050HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 22,05 kHzAudioFormat.WAV_24000HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 24 kHzAudioFormat.WAV_44100HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 44,1 kHzAudioFormat.WAV_48000HZ_MONO_16BIT: Formato WAV, taxa de amostragem de 48 kHzAudioFormat.MP3_8000HZ_MONO_128KBPS: Formato MP3, taxa de amostragem de 8 kHzAudioFormat.MP3_16000HZ_MONO_128KBPS: Formato MP3, taxa de amostragem de 16 kHzAudioFormat.MP3_22050HZ_MONO_256KBPS: Formato MP3, taxa de amostragem de 22,05 kHzAudioFormat.MP3_24000HZ_MONO_256KBPS: Formato MP3, taxa de amostragem de 24 kHzAudioFormat.MP3_44100HZ_MONO_256KBPS: Formato MP3, taxa de amostragem de 44,1 kHzAudioFormat.MP3_48000HZ_MONO_256KBPS: Formato MP3, taxa de amostragem de 48 kHzAudioFormat.PCM_8000HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 8 kHzAudioFormat.PCM_16000HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 16 kHzAudioFormat.PCM_22050HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 22,05 kHzAudioFormat.PCM_24000HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 24 kHzAudioFormat.PCM_44100HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 44,1 kHzAudioFormat.PCM_48000HZ_MONO_16BIT: Formato PCM, taxa de amostragem de 48 kHz
Para o formato OPUS, ajuste a taxa de bits com o bit_rate parâmetro. Requer DashScope SDK 1.24.0 ou posterior:
AudioFormat.OGG_OPUS_8KHZ_MONO_32KBPS: Formato OPUS, taxa de amostragem de 8 kHz, taxa de bits de 32 kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS: Formato OPUS, taxa de amostragem de 16 kHz, taxa de bits de 16 kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_32KBPS: Formato OPUS, taxa de amostragem de 16 kHz, taxa de bits de 32 kbpsAudioFormat.OGG_OPUS_16KHZ_MONO_64KBPS: Formato OPUS, taxa de amostragem de 16 kHz, taxa de bits de 64 kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_16KBPS: Formato OPUS, taxa de amostragem de 24 kHz, taxa de bits de 16 kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_32KBPS: Formato OPUS, taxa de amostragem de 24 kHz, taxa de bits de 32 kbpsAudioFormat.OGG_OPUS_24KHZ_MONO_64KBPS: Formato OPUS, taxa de amostragem de 24 kHz, taxa de bits de 64 kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_16KBPS: Formato OPUS, taxa de amostragem de 48 kHz, taxa de bits de 16 kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_32KBPS: Formato OPUS, taxa de amostragem de 48 kHz, taxa de bits de 32 kbpsAudioFormat.OGG_OPUS_48KHZ_MONO_64KBPS: Formato OPUS, taxa de amostragem de 48 kHz, taxa de bits de 64 kbps
Interfaces principais
SpeechSynthesizer aula
Importar SpeechSynthesizer com from dashscope.audio.tts_v2 import *. Esta classe fornece as principais interfaces de conversão de texto em fala.
| Método | Parâmetros | Valor de retorno | Descrição |
|---|---|---|---|
def call(self, text: str, timeout_millis=None) |
text: Texto a sintetizar. timeout_millis: Tempo limite em milissegundos. Nenhum efeito se não for definido ou 0. |
Dados de áudio binários, se não ResultCallback está definido; caso contrário, Nenhum. |
Converter texto (simples ou SSML) para a fala. |
Sem retorno de chamada: Bloqueia até ser concluído, retorna áudio binário. Consulte Sem streaming.
Com retorno de chamada: retorna None imediatamente, entrega resultados via on_data. Consulte Streaming unidirecional.
Importante: Reinicializar SpeechSynthesizer antes de cada chamada. |
| def streaming_call(self, text: str) | text: Fragmento de texto a sintetizar | Nenhum | Transmita fragmentos de texto para síntese (SSML não suportado). Ligue várias vezes para enviar fragmentos. Os resultados chegam via on_data em ResultCallback. Consulte Streaming bidirecional. |
| def streaming_complete(self, complete_timeout_millis=600000) | complete_timeout_millis: Tempo de espera em milissegundos | Nenhum | Fim da síntese de streaming. Blocos para complete_timeout_millis ms até que a tarefa termine. 0 = espere indefinidamente. Padrão: 10 minutos. Consulte Streaming bidirecional.
Importante: Sempre chame isso em streaming bidirecional para evitar perda de fala. |
| def streaming_cancel(self, complete_timeout_millis=10000) | complete_timeout_millis: Tempo limite em milissegundos para aguardar o servidor retornar o evento de tarefa concluída. Padrão: 10.000. | Nenhum | Cancele o turno de síntese de streaming atual. O SDK encerra imediatamente a tarefa atual e você pode iniciar uma nova tarefa de síntese na mesma conexão sem reinicializar SpeechSynthesizer. Requer Python SDK 1.26.4 ou posterior. Suportado para Qwen-Audio-TTS modelos; CosyVoice modelos não suportam este método. |
| def get_last_request_id(self) | Nenhum | ID da solicitação | Obtenha o ID da solicitação da tarefa anterior. |
| def get_first_package_delay(self) | Nenhum | Atraso do primeiro pacote em ms | Obtenha a latência do primeiro pacote (tempo desde o envio do texto até o recebimento do primeiro pacote de áudio). Ligue após a conclusão da tarefa.
Fatores: configuração de conexão WebSocket (primeira chamada), carga de voz, carga de serviço, latência de rede.
Intervalo típico: ~500 ms (reutilização de conexão/voz), 1.500-2.000 ms (primeira conexão ou troca de voz).
Se consistentemente >2.000 ms: 1. Use o pool de conexões para alta simultaneidade. 2. Verifique a qualidade da rede. 3. Evite horários de pico. |
| def get_response(self) | Nenhum | Última mensagem (JSON) | Obtenha a última mensagem, útil para detectar erros de falha na tarefa. |
Interface de retorno de chamada (ResultCallback)
Em transmissão unidirecional ou streaming bidirecional, o servidor retorna informações e dados do processo por meio de retornos de chamada. Implemente esses métodos para lidar com as respostas do servidor.
Importar usando from dashscope.audio.tts_v2 import *.
Veja o exemplo.
class Callback(ResultCallback):
def on_open(self) -> None:
print('Connection successful')
def on_data(self, data: bytes) -> None:
# Implement logic to handle binary audio data
pass
def on_complete(self) -> None:
print('Synthesis complete')
def on_error(self, message) -> None:
print('Error: ', message)
def on_close(self) -> None:
print('Connection closed')
callback = Callback()
| Método | Parâmetros | Valor de retorno | Descrição |
|---|---|---|---|
def on_open(self) -> None |
Nenhum | Nenhum | Chamado quando o cliente se conecta ao servidor. |
def on_event(self, message: str) -> None |
message: mensagem do servidor (string JSON) |
Nenhum | Chamado quando o servidor envia uma mensagem. Analisar message para obter o ID da tarefa (task_id) e contagem de caracteres cobrados (characters). |
def on_complete(self) -> None |
Nenhum | Nenhum | Chamado quando todos os dados de áudio foram retornados. |
def on_error(self, message) -> None |
message: Mensagem de erro |
Nenhum | Chamado quando ocorre um erro. |
def on_data(self, data: bytes) -> None |
data: Dados de áudio binários |
Nenhum | Chamado quando o áudio sintetizado chega. Combine dados binários em um arquivo completo ou reproduza-os com um reprodutor de streaming. Importante: Para formatos compactados (MP3, Opus), use um reprodutor de streaming (FFmpeg, PyAudio, AudioFormat, MediaSource). Não reproduza quadro a quadro, pois isso causa falhas de decodificação. Ao gravar em um arquivo, use o modo anexar. Para WAV e MP3, apenas o primeiro quadro contém informações de cabeçalho. |
def on_close(self) -> None |
Nenhum | Nenhum | Chamado quando o servidor fecha a conexão. |
Resposta
O servidor retorna dados de áudio binários:
- Sem streaming: manipula os dados binários retornados por
callem Sintetizador de Fala. - Transmissão unidirecional ou streaming bidirecional: Manuseie o
dataparâmetro (bytes) emon_datade ResultCallback.
campo de saída em mensagens on_event
A mensagem JSON recebida pelo on_event retorno de chamada contém um payload.output campo com informações de eventos de síntese. Use este campo para acompanhar o progresso da síntese e recuperar detalhes por frase. O output a estrutura do campo é a seguinte:
| Campo | Tipo | Descrição |
|---|---|---|
type |
Tipo de evento. Valores: sentence-begin (síntese de frase iniciada), sentence-synthesis (síntese de frases em andamento), ou sentence-end (síntese da frase finalizada). |
|
original_text |
O texto original da frase atual. Devolvido em sentence-begin e sentence-end eventos. |
|
sentence |
ditado | Informações da frase. Contém index (número de sequência da frase) e words (lista de palavras com informações de carimbo de data/hora quando word_timestamp_enabled está ativado). |
Exemplo de mensagem:
{
"header": {
"task_id": "xxx",
"event": "result-generated",
"attributes": {}
},
"payload": {
"output": {
"type": "sentence-begin",
"original_text": "How is the weather today?",
"sentence": {
"index": 0,
"words": []
}
}
}
}
Exemplo de análise:
import json
def on_event(self, message):
data = json.loads(message)
output = data.get('payload', {}).get('output', {})
event_type = output.get('type', '')
original_text = output.get('original_text', '')
if event_type:
print(f'Event type: {event_type}, Original text: {original_text}')
Mais exemplos
Para mais exemplos, consulte GitHub.