QwenCloudBRASIL
Tradução de apoio para consulta. Código e identificadores técnicos preservados. Consultar referência original ↗

Qwen-Audio-TTS/CosyVoice SDK Java

Qwen-Audio-TTS/CosyVoice Referência Java

Para visões gerais do modelo e seleção de voz, consulte Síntese de fala.

Limites de texto e formato

Limites de comprimento de texto

Regras de contagem de caracteres

Formato de codificação

Use codificação UTF-8.

Expressões matemáticas

A análise de expressões matemáticas está disponível para cosyvoice-v3-flash e cosyvoice-v3-plus. Ele oferece suporte à matemática comum do ensino fundamental e médio, incluindo operações básicas, álgebra e geometria.

Este recurso oferece suporte apenas ao chinês.

Consulte Converter fórmulas LaTeX em fala (somente idioma chinês).

Suporte SSML

SSML está disponível para vozes personalizadas (design de voz ou clonagem) em cosyvoice-v3-flash e cosyvoice-v3-pluse para vozes do sistema marcadas como compatíveis com SSML na lista de vozes.

Requisitos:

Primeiros passos

A classe SpeechSynthesizer oferece suporte aos seguintes métodos de chamada:

Para obter exemplos de código completos de todos os três métodos, consulte Síntese de fala em tempo real.

Chamada sem streaming

Envia texto de forma síncrona e retorna o resultado de áudio completo.

imagem

Instancie SpeechSynthesizer, vincule os parâmetros de solicitação e ligue para o call método para obter dados de áudio binários. Comprimento máximo do texto: 20.000 caracteres.

Reinicialize o SpeechSynthesizer instância antes de cada call invocação.

Chamada de streaming unidirecional

Envie texto de forma assíncrona e receba dados de áudio de forma incremental por meio de um ResultCallback.

imagem

Instancie SpeechSynthesizer, vincule os parâmetros de solicitação e o ResultCallback e ligue para o call método. Obtenha áudio em tempo real através onEvent. Comprimento máximo do texto: 20.000 caracteres.

Reinicialize o SpeechSynthesizer instância antes de cada call invocação.

Chamada de streaming bidirecional

Envie texto em vários pedaços e receba áudio de forma incremental por meio de um ResultCallback.

imagem

Instantiate SpeechSynthesizer

Instancie [SpeechSynthesizer](#speechsynthesizer-class) e vincule os [parâmetros de solicitação](#request-parameters) e [ResultCallback](#resultcallback-interface).

Stream text

Ligar `streamingCall` várias vezes para enviar texto em pedaços. O servidor retorna áudio em tempo real através `onEvent`.

Cada `streamingCall` fragmento de texto: máximo de 20.000 caracteres. Total em todos os fragmentos: máximo de 200.000 caracteres.

Complete synthesis

Ligar `streamingComplete` para terminar. Isso bloqueia até `onComplete` ou `onError` incêndios.

Sempre chame esse método. Caso contrário, o texto final poderá não ser sintetizado.

Chamada usando Flowable

Flowable é um tipo RxJava que representa um fluxo reativo que suporta contrapressão. Para obter detalhes, consulte a documentação da API Flowable. Integre a biblioteca RxJava e entenda os fundamentos da programação reativa antes de usar o Flowable.

Unidirectional streaming call

Usar `blockingForEach` em um objeto Flowable para bloquear e obter cada `SpeechSynthesisResult`. O resultado completo também está disponível em `getAudioData` depois que todos os dados de streaming retornarem.

Clique para ver o exemplo completo.

  ```java
  import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
  import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
  import com.alibaba.dashscope.exception.NoApiKeyException;
  import com.alibaba.dashscope.utils.Constants;

  import java.time.LocalDateTime;
  import java.time.format.DateTimeFormatter;

  class TimeUtils {
    private static final DateTimeFormatter formatter =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
      return LocalDateTime.now().format(formatter);
    }
  }

  public class Main {
    private static String model = "cosyvoice-v3-flash";
    private static String voice = "longanyang";

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
      SpeechSynthesisParam param =
          SpeechSynthesisParam.builder()
              // If you have not configured environment variables, replace the following line with your API key: .apiKey("sk-xxx")
              .apiKey(System.getenv("DASHSCOPE_API_KEY"))
              .model(model)
              .voice(voice)
              .build();
      SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
      synthesizer.callAsFlowable("What's the weather like today?").blockingForEach(result -> {
        // System.out.println("Message received: " + result);
        if (result.getAudioFrame() != null) {
          // Add your audio processing logic here.
          System.out.println(TimeUtils.getTimestamp() + " Audio received");
        }
      });
      // Close the WebSocket connection after the task completes.
      synthesizer.getDuplexApi().close(1000, "bye");
      // The first call includes WebSocket connection time in the first-packet latency.
      System.out.println(
          "[Metric] Request ID: "
              + synthesizer.getLastRequestId()
              + ", First-packet latency (ms): "
              + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
      Constants.baseWebsocketApiUrl = "wss://maas.qwencloudapi.com/api-ws/v1/inference";
      streamAudioDataToSpeaker();
      System.exit(0);
    }
  }
  ```

Bidirectional streaming call

Use um objeto Flowable como entrada para o fluxo de texto e use `blockingForEach` no Flowable retornado para obter cada `SpeechSynthesisResult`. O resultado completo também está disponível em `getAudioData` depois que todos os dados de streaming retornarem.

Clique para ver o exemplo completo.

  ```java
  import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam;
  import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;
  import com.alibaba.dashscope.exception.NoApiKeyException;
  import com.alibaba.dashscope.utils.Constants;
  import io.reactivex.BackpressureStrategy;
  import io.reactivex.Flowable;

  import java.time.LocalDateTime;
  import java.time.format.DateTimeFormatter;

  class TimeUtils {
    private static final DateTimeFormatter formatter =
        DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");

    public static String getTimestamp() {
      return LocalDateTime.now().format(formatter);
    }
  }

  public class Main {
    private static String[] textArray = {"The streaming text-to-speech SDK ",
        "can convert input text ", "into binary audio data. ", "Compared to non-streaming synthesis, ",
        "streaming offers better real-time performance. ", "You can hear the audio output almost instantly as you type, ",
        "which greatly improves the user experience ", "and reduces waiting time. ",
        "This is ideal for applications that use large ", "language models (LLMs) ",
        "to synthesize speech from a stream of text."};
    private static String model = "cosyvoice-v3-flash";
    private static String voice = "longanyang";

    public static void streamAudioDataToSpeaker() throws NoApiKeyException {
      // Simulate streaming input.
      Flowable<String> textSource = Flowable.create(emitter -> {
        new Thread(() -> {
          for (int i = 0; i < textArray.length; i++) {
            emitter.onNext(textArray[i]);
            try {
              Thread.sleep(1000);
            } catch (InterruptedException e) {
              throw new RuntimeException(e);
            }
          }
          emitter.onComplete();
        }).start();
      }, BackpressureStrategy.BUFFER);

      // Request parameters
      SpeechSynthesisParam param =
          SpeechSynthesisParam.builder()
              // If you have not configured environment variables, replace the following line with your API key: .apiKey("sk-xxx")
              .apiKey(System.getenv("DASHSCOPE_API_KEY"))
              .model(model)
              .voice(voice)
              .build();
      SpeechSynthesizer synthesizer = new SpeechSynthesizer(param, null);
      synthesizer.streamingCallAsFlowable(textSource).blockingForEach(result -> {
        if (result.getAudioFrame() != null) {
          // Add your audio playback logic here.
          System.out.println(
              TimeUtils.getTimestamp() +
                  " Binary audio size: " + result.getAudioFrame().capacity());
        }
      });
      synthesizer.getDuplexApi().close(1000, "bye");
      // The first call includes WebSocket connection time in the first-packet latency.
      System.out.println(
          "[Metric] Request ID: "
              + synthesizer.getLastRequestId()
              + ", First-packet latency (ms): "
              + synthesizer.getFirstPackageDelay());
    }

    public static void main(String[] args) throws NoApiKeyException {
      Constants.baseWebsocketApiUrl = "wss://maas.qwencloudapi.com/api-ws/v1/inference";
      streamAudioDataToSpeaker();
      System.exit(0);
    }
  }
  ```

Chamadas de alta simultaneidade

O DashScope Java SDK usa pool de conexões OkHttp3 para reduzir a sobrecarga de conexão. Consulte Gerenciamento de alta simultaneidade.

Parâmetros de solicitação

Use os métodos encadeados de SpeechSynthesisParam para configurar parâmetros como modelo e voz. Passe o objeto configurado para o SpeechSynthesizer construtor.

Clique para ver um exemplo.

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .format(SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT) // Audio format and sample rate
  .volume(50) // Volume: [0, 100]
  .speechRate(1.0f) // Speech rate: [0.5, 2]
  .pitchRate(1.0f) // Pitch: [0.5, 2]
  .build();
Parâmetro Tipo Obrigatório Descrição
modelo Corda Sim O modelo de conversão de texto em fala. Consulte Lista de vozes para todas as opções.
voz Corda 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. A taxa de amostragem padrão é ideal para a voz. A redução e o aumento da resolução são suportados.

Formatos suportados: <ul><li>Todos os modelos: <ul><li>SpeechSynthesisAudioFormat.WAV_8000HZ_MONO_16BIT: WAV, 8 kHz</li><li>SpeechSynthesisAudioFormat.WAV_16000HZ_MONO_16BIT: WAV, 16 kHz</li><li>SpeechSynthesisAudioFormat.WAV_22050HZ_MONO_16BIT: WAV, 22,05 kHz</li><li>SpeechSynthesisAudioFormat.WAV_24000HZ_MONO_16BIT: WAV, 24 kHz</li><li>SpeechSynthesisAudioFormat.WAV_44100HZ_MONO_16BIT: WAV, 44,1 kHz</li><li>SpeechSynthesisAudioFormat.WAV_48000HZ_MONO_16BIT: WAV, 48 kHz</li><li>SpeechSynthesisAudioFormat.MP3_8000HZ_MONO_128KBPS: MP3, 8 kHz</li><li>SpeechSynthesisAudioFormat.MP3_16000HZ_MONO_128KBPS: MP3, 16 kHz</li><li>SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS: MP3, 22,05 kHz</li><li>SpeechSynthesisAudioFormat.MP3_24000HZ_MONO_256KBPS: MP3, 24 kHz</li><li>SpeechSynthesisAudioFormat.MP3_44100HZ_MONO_256KBPS: MP3, 44,1 kHz</li><li>SpeechSynthesisAudioFormat.MP3_48000HZ_MONO_256KBPS: MP3, 48 kHz</li><li>SpeechSynthesisAudioFormat.PCM_8000HZ_MONO_16BIT: PCM, 8 kHz</li><li>SpeechSynthesisAudioFormat.PCM_16000HZ_MONO_16BIT: PCM, 16 kHz</li><li>SpeechSynthesisAudioFormat.PCM_22050HZ_MONO_16BIT: PCM, 22,05 kHz</li><li>SpeechSynthesisAudioFormat.PCM_24000HZ_MONO_16BIT: PCM, 24 kHz</li><li>SpeechSynthesisAudioFormat.PCM_44100HZ_MONO_16BIT: PCM, 44,1 kHz</li><li>SpeechSynthesisAudioFormat.PCM_48000HZ_MONO_16BIT: PCM, 48 kHz</li></ul></li><li>Opus (DashScope 2.21.0+). Ajuste a taxa de bits com bit_rate: <ul><li>SpeechSynthesisAudioFormat.OGG_OPUS_8KHZ_MONO_32KBPS: Opus, 8 kHz, 32 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_16KBPS: Opus, 16 kHz, 16 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_32KBPS: Opus, 16 kHz, 32 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_16KHZ_MONO_64KBPS: Opus, 16 kHz, 64 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_16KBPS: Opus, 24 kHz, 16 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_32KBPS: Opus, 24 kHz, 32 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_24KHZ_MONO_64KBPS: Opus, 24 kHz, 64 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_16KBPS: Opus, 48 kHz, 16 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_32KBPS: Opus, 48 kHz, 32 kbps</li><li>SpeechSynthesisAudioFormat.OGG_OPUS_48KHZ_MONO_64KBPS: Opus, 48 kHz, 64 kbps</li></ul></li></ul> | | volume | interno | Não | Volume. Padrão: 50. Faixa: [0, 100]. Escala linearmente. 0 é silencioso, 100 é o máximo.| | taxa de fala | 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; acima de 1,0 acelera.| | taxa de pitch | flutuar | Não | Multiplicador de passo. Padrão: 1.0. Faixa: [0,5, 2,0]. A relação com o tom percebido não é linear. Valores acima de 1,0 aumentam o pitch; abaixo de 1,0 abaixe-o. Teste para encontrar valores adequados. | | bit_taxa | interno | Não | Taxa de bits de áudio em kbps. Para formato MP3 ou Opus, use bit_rate para ajustar a taxa de bits. Padrão: 32. Faixa: [6, 510].

Defina usando o parameter ou parameters método de SpeechSynthesisParam. Veja exemplos abaixo.| | ativarWordTimestamp | booleano | Não | Habilite carimbos de data/hora em nível de palavra. Padrão: falso. Aplica-se apenas a vozes clonadas do qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus modelos e para vozes do sistema marcadas como suportadas no Qwen-Audio-TTS lista de vozes, CosyVoice lista de vozes.

Os resultados do carimbo de data/hora estão disponíveis apenas por meio da interface de retorno de chamada. | | semente | interno | Não | Semente aleatória para geração. Sementes diferentes produzem resultados diferentes. A mesma semente com parâmetros idênticos reproduz a mesma saída. Padrão: 0. Faixa: [0, 65535]. Para versões do SDK anteriores a 2.21.7, defina seed através de parâmetros adicionais. | | linguagemDicas | Lista | Não | Linguagem alvo para síntese. Use quando a pronúncia de números, abreviações ou símbolos for imprecisa ou quando idiomas menos comuns precisarem de melhorias. 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). Nota: Este é um array, mas apenas o primeiro elemento é processado. Passe apenas um valor. | | instrução | Corda | Não | Controle o dialeto, a emoção ou o estilo de falar por meio de instruções. Disponível para vozes do sistema marcadas como suportadas por Instruct na lista de vozes. Comprimento máximo: 100 caracteres. Veja exemplos de instruções abaixo.| | ativar_aigc_tag | booleano | Não | Adicione um identificador AIGC invisível ao áudio. Quando verdadeiro, um identificador invisível é incorporado nos formatos suportados (WAV, MP3, Opus). Padrão: falso. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus. | | aigc_propagador | Corda | Não | Define o ContentPropagator campo no identificador AIGC para identificar o propagador de conteúdo. Só entra em vigor quando enable_aigc_tag é verdade. Padrão: UID. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus. | | aigc_propagate_id | Corda | Não | Define o PropagateID campo no identificador AIGC para identificar exclusivamente um comportamento de propagação. Só entra em vigor quando enable_aigc_tag é verdade. Padrão: o ID da solicitação atual. Apoiado por qwen-audio-3.0-tts-plus, qwen-audio-3.0-tts-flash, cosyvoice-v3-flashe cosyvoice-v3-plus. | | hotFix | ParamHotFix | Não | Configuração de hotpatching de texto. Personalize a pronúncia de palavras específicas ou substitua o texto antes da síntese. Não suportado por qwen-audio-3.0-tts-plus ou qwen-audio-3.0-tts-flash. Veja o exemplo do hotFix abaixo.| | ativar_markdown_filtro | booleano | Não | Remova os símbolos Markdown do texto de entrada antes da síntese, evitando que sejam lidos em voz alta. Padrão: falso. Disponível apenas para cosyvoice-v3-flash. |

Definir bit_rate

Using parameter()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameter("bit_rate", 32)
  .build();
```

Usando parâmetros()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameters(Collections.singletonMap("bit_rate", 32))
  .build();
```

Definir enable_aigc_tag

Using parameter()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameter("enable_aigc_tag", true)
  .build();
```

Usando parâmetros()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameters(Collections.singletonMap("enable_aigc_tag", true))
  .build();
```

Definir aigc_propagator

Using parameter()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameter("enable_aigc_tag", true)
  .parameter("aigc_propagator", "xxxx")
  .build();
```

Usando parâmetros()

```java
Map<String, Object> map = new HashMap();
map.put("enable_aigc_tag", true);
map.put("aigc_propagator", "xxxx");

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameters(map)
  .build();
```

Definir aigc_propagate_id

Using parameter()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameter("enable_aigc_tag", true)
  .parameter("aigc_propagate_id", "xxxx")
  .build();
```

Usando parâmetros()

```java
Map<String, Object> map = new HashMap();
map.put("enable_aigc_tag", true);
map.put("aigc_propagate_id", "xxxx");

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("longanyang")
  .parameters(map)
  .build();
```

Definir enable_markdown_filter

Using parameter()

```java
SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("your_voice") // Replace with a cloned voice for cosyvoice-v3-flash
  .parameter("enable_markdown_filter", true)
  .build();
```

Usando parâmetros()

```java
Map<String, Object> map = new HashMap();
map.put("enable_markdown_filter", true);

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
  .model("cosyvoice-v3-flash")
  .voice("your_voice") // Replace with a cloned voice for cosyvoice-v3-flash
  .parameters(map)
  .build();
```

instruction exemplos

cosyvoice-v3-flash:

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.

hotFix exemplo

List<ParamHotFix.PronunciationItem> pronunciationItems = new ArrayList<>();
pronunciationItems.add(new ParamHotFix.PronunciationItem("weather", "tian1 qi4"));

List<ParamHotFix.ReplaceItem> replaceItems = new ArrayList<>();
replaceItems.add(new ParamHotFix.ReplaceItem("today", "gold day"));

ParamHotFix paramHotFix = new ParamHotFix();
paramHotFix.setPronunciation(pronunciationItems);
paramHotFix.setReplace(replaceItems);

SpeechSynthesisParam param = SpeechSynthesisParam.builder()
      .model("cosyvoice-v3-flash")
      .voice("your_voice") // Replace with a cloned voice for cosyvoice-v3-flash
      .hotFix(paramHotFix)
      .build();

Interfaces principais

SpeechSynthesizer aula

Importar com import com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer;.

Interface/Método Parâmetro Valor de retorno Descrição
public SpeechSynthesizer(SpeechSynthesisParam param, ResultCallback<SpeechSynthesisResult> callback) param: Solicitar parâmetros. callback: ResultCallback para chamadas de streaming ou null para chamadas sem streaming/fluidas. SpeechSynthesizer instância Construtor. Defina o retorno de chamada como ResultCallback para unidirecional ou bidirecional streaming. Definido como nulo para sem streaming ou Fluível chamadas.
public ByteBuffer call(String text) text: Texto a sintetizar (UTF-8). ByteBuffer ou null Converte texto (simples ou SSML) para a fala. Sem retorno de chamada: bloqueia até ser concluído. Com retorno de chamada: retorna nulo imediatamente; os resultados chegam via onEvent.
public void streamingCall(String text) text: Texto a sintetizar (UTF-8). Nenhum Envia texto para síntese de streaming. SSML não é compatível. Ligue várias vezes para enviar texto em pedaços. Os resultados chegam via onEvent. Consulte Chamada de streaming bidirecional.
public void streamingComplete() throws RuntimeException Nenhum Nenhum Termina a síntese de streaming. Bloqueia até que a síntese seja concluída, a sessão seja interrompida ou o tempo limite de 10 minutos ocorra. Consulte Chamada de streaming bidirecional.
public void streamingCancel() Nenhum Nenhum Cancela a tarefa atual de síntese de streaming bidirecional. 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 Java SDK 2.22.26 ou posterior. Suportado para Qwen-Audio-TTS modelos; CosyVoice modelos não suportam este método.
public Flowable<SpeechSynthesisResult> callAsFlowable(String text) text: Texto a sintetizar (UTF-8). Flowable<SpeechSynthesisResult> Converte texto sem streaming em saída de voz com streaming. SSML não é compatível. Consulte Chamar usando Flowable.
boolean getDuplexApi().close(int code, String reason) código: código de fechamento do WebSocket. motivo: motivo próximo. Consulte O protocolo WebSocket. verdade Feche a conexão WebSocket após cada tarefa para evitar vazamentos de conexão. Para reutilização de conexão, consulte Gerenciamento de alta simultaneidade.
public Flowable<SpeechSynthesisResult> streamingCallAsFlowable(Flowable<String> textStream) textStream: texto de quebra automática para sintetizar. Flowable<SpeechSynthesisResult> Converte streaming de entrada de texto em streaming de saída de fala. SSML não é compatível. Consulte Chamar usando Flowable.
public String getLastRequestId() Nenhum ID da solicitação da tarefa anterior. Obtém o ID da solicitação após iniciar uma nova tarefa via call, streamingCall, callAsFlowable, ou streamingCallAsFlowable.
public long getFirstPackageDelay() Nenhum Latência do primeiro pacote em milissegundos. Obtém o tempo entre o envio do texto e o recebimento do primeiro pacote de áudio. Ligue após a conclusão da tarefa.

Requisitos de uso importantes:

Fatores que afetam a latência do primeiro pacote:

Latência típica:

Se a latência exceder consistentemente 2.000 ms:

  1. Use o pool de conexões para pré-estabelecer conexões (cenários de alta simultaneidade).
  2. Verifique a qualidade da rede.
  3. Evite horários de pico.

ResultCallback interface

Obtenha resultados de síntese por meio de ResultCallback durante unidirecional ou bidirecional streaming de chamadas. Importar com import com.alibaba.dashscope.common.ResultCallback;.

Clique para ver um exemplo.

ResultCallback<SpeechSynthesisResult> callback = new ResultCallback<SpeechSynthesisResult>() {
  @Override
  public void onEvent(SpeechSynthesisResult result) {
    System.out.println("Request ID: " + result.getRequestId());
    // Process audio chunks in real time (e.g., play or write to a buffer).
  }

  @Override
  public void onComplete() {
    System.out.println("Task complete");
    // Handle synthesis completion logic (e.g., release the player).
  }

  @Override
  public void onError(Exception e) {
    System.out.println("Task failed: " + e.getMessage());
    // Handle exceptions (network errors or server-side error codes).
  }
};
Interface/Método Parâmetro Valor de retorno Descrição
public void onEvent(SpeechSynthesisResult result) result: uma instância de SpeechSynthesisResult. Nenhum Chamado quando o servidor envia dados de áudio. Usar getAudioFrame em SpeechSynthesisResult para obter áudio binário. Usar getUsage para obter a contagem de caracteres faturáveis até o momento.
public void onComplete() Nenhum Nenhum Chamado após todos os dados de síntese terem sido retornados.
public void onError(Exception e) e: Informações de exceção. Nenhum Chamado quando ocorre uma exceção. Implemente o registro de exceções e a limpeza de recursos neste método.

Resposta

O servidor retorna dados de áudio binários:

Principais interfaces de SpeechSynthesisResult:

Interface/Método Parâmetro Valor de retorno Descrição
public ByteBuffer getAudioFrame() Nenhum Dados de áudio binários Retorna áudio binário para o segmento atual. Pode estar vazio se nenhum dado novo chegar. Combine segmentos em um arquivo completo ou reproduza-os com um reprodutor de streaming.
public String getRequestId() Nenhum ID da solicitação Obtém o ID da solicitação de tarefa. Devoluções null quando getAudioFrame retorna dados.
public SpeechSynthesisUsage getUsage() Nenhum SpeechSynthesisUsage ou null Retorna a contagem de caracteres faturáveis até o momento por meio de getCharacters(). Use o último valor recebido como final.
public Sentence getTimestamp() Nenhum Sentence ou null Retorna dados de carimbo de data/hora quando enableWordTimestamp é verdade. Sentence métodos: getIndex (número da frase, de 0), getWords (retorna List<Word>). Word métodos: getText, getBeginIndex, getEndIndex, getBeginTime, getEndTime, getPhonemes (retorna List<Phoneme>).

Informações de carimbo de data/hora no nível do fonema

Phoneme encapsula informações de carimbo de data/hora em nível de fonema retornadas por Word.getPhonemes().

Método Valor de retorno Descrição
public int getBeginTime() Hora de início do fonema em milissegundos Obtém a hora de início do fonema.
public int getEndTime() Hora de término do fonema em milissegundos Obtém a hora de término do fonema.
public String getPhoneme() Texto fonema Obtém o conteúdo do fonema.

Para formatos compactados (MP3, Opus) em síntese de streaming, use um reprodutor de streaming. A reprodução quadro a quadro causa falhas de decodificação.

Os players de streaming incluem FFmpeg, PyAudio (Python), AudioFormat (Java) e MediaSource (JavaScript).

Ao combinar áudio em um arquivo completo, escreva no modo anexar. Para streaming de áudio WAV e MP3, apenas o primeiro quadro contém informações de cabeçalho.

Mais exemplos

Para mais exemplos, consulte GitHub.