Qwen-Audio-TTS/CosyVoice iOS SDK
Use o Qwen-Audio-TTS/CosyVoice iOS SDK para transformar texto em fala expressiva de alta qualidade em seus aplicativos iOS.
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.
##NeoNui
Destaques da arquitetura:
- Padrão Singleton: obtém a instância global
[StreamInputTts get_instance]. - Orientado por retorno de chamada: receba eventos e dados de áudio por meio do StreamInputTtsDelegate protocolo.
- Configuração JSON: passe parâmetros como strings JSON.
Fluxos de chamadas
Qwen-Audio-TTS/CosyVoice suporta dois modos de invocação: entrada única e entrada de streaming.
Entrada única: melhor para síntese de texto curto ou quando você precisar de SSML marcação.
- playStreamInputTts() ou asyncPlayStreamInputTts() — Envie um texto completo e inicie a síntese. O primeiro é síncrono e retorna após o término da síntese; o último é assíncrono e retorna imediatamente após iniciar a síntese.
- onStreamInputTtsDataCallback() — Recebe dados de áudio.
- TTS_EVENT_SYNTHESIS_COMPLETE — Síntese concluída.
Entrada de streaming: ideal para conversas em tempo real ou cenários longos de "fala enquanto sintetiza". Este modo não suporta SSML marcação.
- startStreamInputTts() — Inicialize o SDK e defina o delegado de retorno de chamada e os parâmetros de conexão.
- sendStreamInputTts() — Envia continuamente fragmentos de texto para serem sintetizados.
- onStreamInputTtsDataCallback() — Recebe dados de áudio.
- stopStreamInputTts() ou asyncStopStreamInputTts() — Envie a solicitação de fim de síntese. O primeiro é síncrono e retorna após o término da síntese; o último é assíncrono e retorna imediatamente após o envio da solicitação.
- TTS_EVENT_SYNTHESIS_COMPLETE — Síntese concluída.
startStreamInputTts
Inicia uma tarefa de síntese de fala de streaming e abre uma conexão com o servidor.
Assinatura do método:
- (int) startStreamInputTts:(const char *)ticket parameters:(const char *)parameters sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
ticket |
char* |
String JSON que contém configurações de autenticação, conexão e depuração. |
parameters |
char* |
String JSON que contém as configurações do efeito de síntese de fala. |
sessionId |
char* |
ID de sessão especificado pelo cliente. Se omitido, o servidor gera um. |
logLevel |
NuiSdkLogLevel |
Nível de impressão dos logs internos do SDK. |
saveLog |
BOOL |
Se os logs devem ser salvos localmente. Quando definido para YES, você deve especificar um caminho com debug_path e pode limitar o tamanho do arquivo com max_log_file_size. |
Valor de retorno:
Retorna um código de erro.
exemplo JSON de ticket: O exemplo a seguir não lista todos os campos. Adicione os outros conforme seu código exigir:
{
"url": "wss://maas.qwencloudapi.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id"
}
campos do ticket:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
url |
string |
Sim | Endereço do serviço: wss://maas.qwencloudapi.com/api-ws/v1/inference |
apikey |
string |
Sim | Chave de API. Para limitar a exposição se uma chave de longa duração vazar, use uma chave de API de curta duração em vez de. |
device_id |
string |
Sim | Identificador exclusivo do usuário final. Defina isso como o ID do usuário no aplicativo ou um identificador de dispositivo gerado pelo cliente. O ID é usado para rastreamento de log e solução de problemas. |
complete_waiting_ms |
int |
Não | Tempo limite, em milissegundos, para aguardar o evento de conclusão da síntese (TTS_EVENT_SYNTHESIS_COMPLETE) depois de chamar stopStreamInputTts. |
Padrão: 10.000. |
| debug_path | string | Não | Caminho local onde os arquivos de log são armazenados.
Este campo só entra em vigor quando saveLog está definido para YES em startStreamInputTts, playStreamInputTts ou asyncPlayStreamInputTts. Nesse caso, você deve definir esse caminho; caso contrário, um erro será retornado.
No máximo dois arquivos de log são mantidos localmente. |
| max_log_file_size | int | Não | Tamanho máximo de um arquivo de log, em bytes.
Este campo só entra em vigor quando saveLog está definido para YES em startStreamInputTts, playStreamInputTts ou asyncPlayStreamInputTts.
Padrão: 104857600 (100 × 1024 × 1024 bytes, ou seja, 100 MiB). |
| log_track_level | int | Não | Nível de filtro para logs entregues por meio do retorno de chamada de log (onStreamInputTtsLogTrackCallback).
Padrão: 2.
Valores válidos: 0 (LOG_LEVEL_VERBOSE), 1 (LOG_LEVEL_DEBUG), 2 (LOG_LEVEL_INFO), 3 (LOG_LEVEL_WARNING), 4 (LOG_LEVEL_ERROR), 5 (LOG_LEVEL_NONE, desativa o retorno de chamada).
Nota: log_track_level e logLevel (definido através de startStreamInputTts, playStreamInputTts ou asyncPlayStreamInputTts) juntos determinam quais logs alcançam o retorno de chamada. Um log dispara o retorno de chamada somente quando seu nível está igual ou acima de ambos os limites. Por exemplo, se log_track_level é 2 (INFO) e logLevel for 3 (WARNING), somente logs em WARNING ou superior (nível >= 3) serão entregues. |
exemplo JSON de parâmetros: O exemplo a seguir não lista todos os campos. Adicione os outros conforme seu código exigir:
{
"model": "qwen-audio-3.0-tts-flash",
"voice": "longanlingxi",
"format": "mp3",
"sample_rate": 24000,
"volume": 50,
"rate": 1,
"pitch": 1,
"language_hints": ["zh"],
"enable_ssml": false
}
campos de parâmetros:
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
model |
string |
Sim | O nome do modelo. |
voice |
string |
Sim | A voz usada para síntese de fala. |
<ul><li>Vozes do sistema: consulte Qwen-Audio-TTS lista de vozes, CosyVoice lista de vozes</li><li>Vozes clonadas: vozes personalizadas criadas por meio de clonagem de voz</li><li>Vozes personalizadas: vozes personalizadas criadas através do design de voz</li></ul> |
| format | string | Não | O formato de codificação de áudio.
Valores válidos:
<ul><li>PCM</li><li>wav</li><li>mp3 (padrão)</li><li>obra</li></ul> |
| enable_audio_decoder | BOOL | Não | Se o decodificador interno do SDK deve ser habilitado. Padrão: NO.
Este parâmetro só entra em vigor quando o formato de codificação de áudio é opus ou mp3. Quando ativado, o SDK decodifica dados de áudio opus ou mp3 em dados PCM antes de retorná-los. |
| volume | int | Não | O nível de volume.
Valor padrão: 50.
Valores válidos: [0, 100]. |
| sample_rate | int | Não | A taxa de amostragem de áudio em Hz.
Valores válidos: 8.000, 16.000, 22.050 (padrão), 24.000, 44100, 48.000. |
| rate | float | Não | A velocidade da fala.
Valor padrão: 1,0.
Valores válidos: [0,5, 2,0]. |
| pitch | float | Não | O campo.
Valor padrão: 1,0.
Valores válidos: [0,5, 2,0]. |
| bit_rate | int | Não | A taxa de bits de áudio em kbps. Quando o formato de áudio for mp3 ou opus, use bit_rate para ajustar a taxa de bits.
Valor padrão: 32.
Valores válidos: [6, 510]. |
| enable_ssml | boolean | Não | Se deve ativar o SSML.
Padrão: falso.
<ul><li>verdadeiro: habilitado.</li><li>falso: desativado.</li></ul>
Para as restrições de uso de SSML (modelos, vozes e APIs compatíveis), consulte Limitações. |
| word_timestamp_enabled | boolean | Não | Especifica se os carimbos de data/hora em nível de palavra devem ser ativados.
Valor padrão: falso.
Disponível apenas no modo de saída de streaming. Vozes suportadas: vozes clonadas de qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-pluse vozes do sistema marcadas como suportadas em Qwen-Audio-TTS lista de vozes, CosyVoice lista de vozes. Vozes clonadas de outros modelos não suportam esse recurso.
Nota: Os carimbos de data e hora são retornados em all_response de onStreamInputTtsEventCallback. |
| seed | int | Não | Uma semente aleatória para controlar a variação na saída da síntese. Quando a versão do modelo, o texto, a voz e outros parâmetros permanecem inalterados, o uso da mesma semente produz resultados idênticos.
Valor padrão: 0.
Valores válidos: [0, 65535]. |
| language_hints | array[string] | Não | Especifica o idioma de destino para síntese de fala para melhorar a qualidade da saída.
Nota: Este parâmetro é um array, mas a versão atual processa apenas o primeiro elemento. Passe um único valor. Este parâmetro especifica o idioma alvo para síntese de fala. Não está relacionado ao idioma da amostra de áudio usada na clonagem de voz. Para definir o idioma de origem para uma tarefa de clonagem, consulte a referência da API de clonagem de voz.
Quando a pronúncia de dígitos, a expansão de abreviações, a leitura de símbolos ou a síntese de idiomas minoritários não atenderem às expectativas, use este parâmetro. Por exemplo:
<ul><li>Pronúncia inesperada de dígitos: "olá, aqui é 110" é lida como "olá, aqui é um zero" em vez da pronúncia chinesa esperada</li><li>Pronúncia imprecisa do símbolo: "@" é lido como o equivalente chinês em vez de "at"</li><li>Baixa qualidade de síntese de linguagem secundária com resultados não naturais</li></ul>
Valores válidos: zh (chinês), en (inglês), fr (francês), de (alemão), ja (japonês), ko (coreano), ru (russo), pt (português), th (tailandês), id (indonésio), vi (vietnamita), es (espanhol), it (italiano), ms (malaio), fil (filipino), ar (árabe). |
| instruction | string | Não | Controla características de síntese, como dialeto, emoção ou estilo de fala.
Para obter detalhes de uso, consulte Controle de instruções. |
| enable_aigc_tag | boolean | Não | Especifica se uma marca d'água AIGC deve ser incorporada no áudio gerado. Quando definida como verdadeira, a marca d'água é incorporada em arquivos de áudio de formatos suportados (wav/mp3/opus).
Valor padrão: falso.
Somente qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus suporte a esse recurso. |
| aigc_propagator | string | Não | Define o ContentPropagator campo na marca d’água AIGC, identificando o propagador do conteúdo. Só entra em vigor quando enable_aigc_tag é true.
Valor padrão: UID.
Somente qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus suporte a esse recurso. |
| aigc_propagate_id | string | Não | Define o PropagateID campo na marca d'água AIGC, identificando exclusivamente uma ação de propagação específica. Só entra em vigor quando enable_aigc_tag é true.
Valor padrão: O ID da solicitação de síntese de fala atual.
Somente qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus suporte a esse recurso. |
| hot_fix | object | Não | Configuração de hot-fix de texto para personalizar a pronúncia de palavras específicas ou substituir texto antes da síntese.
Campos:
<ul><li>pronúncia: especifica anotações pinyin para palavras cuja pronúncia padrão precisa de correção.</li><li>substituir: Substitui palavras especificadas antes da síntese. O texto de substituição é usado como entrada de síntese real.</li></ul>
Exemplo: {"hot_fix": {"pronunciation": [{"天气": "tian1 qi4"}], "replace": [{"今天": "金天"}]}} |
| enable_markdown_filter | BOOL | Não | Se a marcação Markdown deve ser filtrada do texto de entrada antes da síntese, para que a marcação não seja falada em voz alta.
Nota: Apenas vozes clonadas de cosyvoice-v3-flash suporte a esse recurso.
Padrão: NO.
Valores válidos:
<ul><li>YES: habilite a filtragem Markdown.</li><li>NO: desative a filtragem Markdown.</li></ul> |
sendStreamInputTts
Envia texto para ser sintetizado. Use este método junto com startStreamInputTts.
Depois de chamar startStreamInputTts, use este método para enviar texto continuamente.
Depois que todo o texto for enviado, chame stopStreamInputTts ou asyncStopStreamInputTts para sinalizar o fim da entrada.
Assinatura do método:
- (int) sendStreamInputTts:(const char *)text;
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
text |
char* |
Texto para sintetizar. SSML não é compatível. As tags SSML na entrada são lidas como texto simples em vez de analisadas. |
Valor de retorno:
Retorna um código de erro.
stopStreamInputTts
Método síncrono. Notifica o servidor de que todo o texto foi enviado e, em seguida, bloqueia até que cada pedaço de áudio seja sintetizado e TTS_EVENT_SYNTHESIS_COMPLETE é recebido.
O tempo limite do bloco é controlado por complete_waiting_ms.
Assinatura do método:
- (int) stopStreamInputTts;
Valor de retorno:
Retorna um código de erro.
asyncStopStreamInputTts
Método assíncrono. Notifica o servidor que todo o texto foi enviado e retorna imediatamente. A síntese continua em segundo plano.
Use TTS_EVENT_SYNTHESIS_COMPLETE para detectar quando a síntese termina.
Assinatura do método:
- (int) asyncStopStreamInputTts;
Valor de retorno:
Retorna um código de erro.
cancelarStreamInputTts
Interrompe imediatamente a conexão com o servidor e encerra a tarefa de síntese atual. Depois que esse método é chamado, nenhum outro retorno de chamada de dados de áudio é acionado.
Assinatura do método:
- (int) cancelStreamInputTts;
Valor de retorno:
Retorna um código de erro.
###playStreamInputTts
Método de síntese síncrona one-shot. Envia o texto e bloqueia enquanto todos os dados de áudio são recebidos e retorna após o término da síntese. Você não precisa chamar stopStreamInputTts depois.
Este método habilita SSML por padrão. Para desabilitar SSML, defina o enable_ssml campo em parameters para false.
Assinatura do método:
- (int) playStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
Parâmetros:
O ticket, parameterse outros parâmetros compartilhados usam as mesmas definições que startStreamInputTts.
| Parâmetro | Tipo | Descrição |
|---|---|---|
text |
char* |
Texto para sintetizar. Suporta SSML. |
Valor de retorno:
Retorna um código de erro.
asyncPlayStreamInputTts
Este método envia todo o texto para síntese de forma assíncrona. Ele retorna imediatamente sem esperar pelos dados de áudio. Você não precisa chamar stopStreamInputTts depois.
Este método habilita SSML por padrão. Para desabilitar SSML, defina o enable_ssml campo em parameters para false.
Assinatura do método:
- (int) asyncPlayStreamInputTts:(const char *)ticket parameters:(const char *)parameters text:(const char *)text sessionId:(const char *)sessionId logLevel:(NuiSdkLogLevel)logLevel saveLog:(BOOL)saveLog;
Parâmetros:
O ticket, parameterse outros parâmetros compartilhados usam as mesmas definições que startStreamInputTts.
| Parâmetro | Tipo | Descrição |
|---|---|---|
text |
char* |
Texto para sintetizar. Suporta SSML. |
Valor de retorno:
Retorna um código de erro.
StreamInputTtsDelegate
Protocolo de retorno de chamada para Qwen-Audio-TTS/CosyVoice streaming de síntese de fala. Implemente este protocolo para receber eventos de síntese, dados de áudio e logs.
onStreamInputTtsEventCallback: escuta eventos
Assinatura do método:
- (void)onStreamInputTtsEventCallback:(StreamInputTtsCallbackEvent)event taskId:(char*)taskid sessionId:(char*)sessionId ret_code:(int)ret_code error_msg:(char*)error_msg timestamp:(char*)timestamp all_response:(char*)all_response;
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
event |
StreamInputTtsCallbackEvent |
Evento de retorno de chamada. |
taskid |
char* |
ID da tarefa de síntese de fala. |
sessionId |
char* |
ID da sessão. O valor fornecido pelo cliente é retornado como está. Se nenhum for fornecido, o servidor gerará um. |
ret_code |
int |
Código de erro. Válido apenas para TTS_EVENT_TASK_FAILED evento. Consulte códigos de erro. |
error_msg |
char* |
Mensagem de erro. Válido apenas para TTS_EVENT_TASK_FAILED evento. |
timestamp |
char* |
Informações de carimbo de data/hora para o resultado da síntese. |
all_response |
char* |
Resposta JSON completa. Analise esta string para extrair os campos necessários. |
onStreamInputTtsDataCallback: ouça dados de áudio
O SDK dispara esse retorno de chamada repetidamente durante a síntese. Leia os dados de áudio do retorno de chamada.
Assinatura do método:
- (void)onStreamInputTtsDataCallback:(char*)buffer len:(int)len;
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
buffer |
char* |
Dados de áudio para o segmento atual. Use esses dados para: |
<ul><li>Monte um arquivo de áudio completo e reproduza-o.</li><li>Transmita os dados para um player que suporte reprodução de streaming.</li></ul> Nota:
<ul><li>Para os formatos compactados mp3 e opus, use um reprodutor de streaming. A reprodução de segmentos quadro a quadro pode causar falhas de decodificação.</li><li>Ao montar um arquivo completo, anexe cada segmento ao mesmo arquivo.</li><li>Para os formatos wav e mp3, apenas a primeira invocação onStreamInputTtsDataCallback inclui o cabeçalho do arquivo; invocações posteriores retornam dados de áudio brutos. Concatenar tudo buffer valores em ordem. Para o formato opus, cada quadro é uma página Ogg independente que você pode concatenar diretamente.</li></ul> |
| len | int | Comprimento dos dados de áudio, em bytes. |
onStreamInputTtsLogTrackCallback: escuta logs de rastreamento
Esse retorno de chamada fornece logs internos do SDK detalhados para ajudar na solução de problemas e na depuração.
Assinatura do método:
- (void)onStreamInputTtsLogTrackCallback:(NuiSdkLogLevel)level
logMessage:(const char *)log;
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
level |
NuiSdkLogLevel |
Nível de registro. |
log |
char* |
Registrar conteúdo. |
StreamInputTtsCallbackEvent
Enum de tipo de evento para Qwen-Audio-TTS/CosyVoice streaming de síntese de fala.
| Evento | Descrição |
|---|---|
| TTS_EVENT_SYNTHESIS_STARTED | O servidor aceitou a solicitação e iniciou o processamento. onStreamInputTtsDataCallback normalmente entrega o primeiro segmento de áudio logo após esse evento. |
| TTS_EVENT_SENTENCE_SYNTHESIS | Informações de progresso emitidas durante a síntese, incluindo dados de faturamento. |
| TTS_EVENT_SYNTHESIS_COMPLETE | O servidor terminou de enviar todos os dados de áudio. onStreamInputTtsDataCallback não é chamado novamente. Este evento é o sinal definitivo de fim de fluxo. |
| TTS_EVENT_TASK_FAILED | A tarefa falhou. Leia task_id, error_codee error_message de all_response em onStreamInputTtsEventCallback para diagnosticar a falha. |
Exemplo de resposta com falha na tarefa:
{
"header": {
"task_id": "2bf83b9a-baeb-4fda-8d9a-xxxxxxxxxxxx",
"event": "task-failed",
"error_code": "InvalidParameter",
"error_message": "[tts:]Engine return error code: 418",
"attributes": {}
},
"payload": {}
}
NuiSdkLogLevel
Enum de nível de log do SDK que controla a saída do log.
| Nível | Descrição |
|---|---|
| 0: LOG_LEVEL_VERBOSE | Nível de registro mais detalhado. Inclui todas as informações de depuração. |
| 1: LOG_LEVEL_DEBUG | Logs em nível de depuração. |
| 2: LOG_LEVEL_INFO | Logs informativos gerais (padrão). |
| 3: LOG_LEVEL_WARNING | Logs de nível de aviso. |
| 4: LOG_LEVEL_ERROR | Logs de nível de erro. |
| 5: LOG_LEVEL_NONE | Desativa a saída de log. |
Código de exemplo
-
Obtenha sua chave de API: Obtenha uma chave de API.
Para aplicativos de terceiros ou usuários finais que precisam de acesso temporário ou quando você want controle rígido sobre operações confidenciais, como acesso e exclusão de dados, use uma chave de API temporária em vez disso. Uma chave de API temporária é válida por um período fixo de 60 segundos e deve ser regenerada após expirar.
-
Baixe o SDK e execute o código de exemplo:
- Baixe o pacote SDK mais recente.
- Extraia o arquivo ZIP e adicione
nuisdk.frameworkao seu projeto Xcode. - Em Fases de construção > Vincular binário a bibliotecas, adicione
nuisdk.framework. - Em Geral > Frameworks, Bibliotecas e Conteúdo Incorporado, defina
nuisdk.frameworkpara Incorporar e assinar. - Abra o projeto de amostra no Xcode. O código de exemplo está em
DashQwen-Audio-TTS/CosyVoiceStreamInputTTSViewController.m. Substitua a chave de API do espaço reservado pela sua e execute o aplicativo para testá-lo.
Modos de chamada
| Modo de chamada | Descrição |
|---|---|
| Entrada única | Etapas: |
<ol><li>Inicialize o SDK e o componente do player.</li><li>Configure os parâmetros para o seu cenário.</li><li>Ligar playStreamInputTts ou asyncPlayStreamInputTts para enviar o texto e iniciar a síntese.</li><li>Espere pelo TTS_EVENT_SYNTHESIS_COMPLETE retorno de chamada, que sinaliza que a síntese foi concluída.</li></ol>
Casos de uso:
<ul><li>Síntese de texto curto.</li><li>Cenários que exigem marcação SSML.</li></ul> | | Entrada de streaming | Etapas:
<ol><li>Inicialize o SDK e o componente do player.</li><li>Configure os parâmetros para o seu cenário.</li><li>Ligar startStreamInputTts para iniciar a síntese de streaming.</li><li>Ligar sendStreamInputTts repetidamente para enviar texto em pedaços.</li><li>Leia os dados binários de áudio de onStreamInputTtsDataCallback.</li><li>Ligar stopStreamInputTts ou asyncStopStreamInputTts para parar de enviar texto e aguardar o término da síntese.</li><li>Espere pelo TTS_EVENT_SYNTHESIS_COMPLETE retorno de chamada, que sinaliza que a síntese foi concluída.</li></ol>
Casos de uso:
<ul><li>Conversa em tempo real ou cenários longos do tipo "fale enquanto sintetiza".</li><li>Este modo não oferece suporte à marcação SSML.</li></ul> |
Recursos avançados
Marcação SSML
Objetivo: Incorpore tags XML no texto de entrada para controlar com precisão a pronúncia, a velocidade da fala, as pausas e outros detalhes da prosódia.
Limitações: SSML é compatível apenas com entrada única (o playStreamInputTts e asyncPlayStreamInputTts métodos). Não é compatível com entrada de streaming (o sendStreamInputTts método).
Como usar: Quando você chama playStreamInputTts ou asyncPlayStreamInputTts, o SDK ativa o SSML automaticamente. Passe o texto que contém tags SSML diretamente no text parâmetro.
Para obter mais detalhes, consulte SSML.
Expressões matemáticas
Objetivo: Fazer com que o modelo leia fórmulas e expressões matemáticas comuns corretamente.
Como usar: Passe o texto que contém expressões matemáticas no formato LaTeX diretamente no text parâmetro. Para obter mais detalhes, consulte Converter fórmulas LaTeX em fala (apenas idioma chinês).