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
- Sem streaming, transmissão unidirecional ou streaming unidirecional fluido: máximo de 20.000 caracteres por solicitação.
- Transmissão bidirecional ou streaming bidirecional fluido: máximo de 20.000 caracteres por solicitação, total de 200.000 caracteres.
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 do comprimento do texto.
- 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.
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:
- SDK do DashScope 2.20.3 ou posterior.
- Somente sem streaming e streaming unidirecional chama (o
callmétodo de SpeechSynthesizer) são suportados. Transmissão bidirecional chama (streamingCall) e Chamadas fluidas não são suportados. - Passe o texto contendo SSML para o
callmétodo, o mesmo que para texto normal.
Primeiros passos
A classe SpeechSynthesizer oferece suporte aos seguintes métodos de chamada:
- Sem streaming: Envia texto completo e retorna áudio completo. Bloqueia até terminar. Melhor para textos curtos.
- Streaming unidirecional: Envia texto completo e retorna áudio via retorno de chamada. Sem bloqueio. Melhor para textos curtos com necessidades de baixa latência.
- Streaming bidirecional: envia fragmentos de texto de forma incremental e retorna áudio em tempo real por meio de retorno de chamada. Sem bloqueio. Melhor para textos longos com necessidades de 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.
Chamada sem streaming
Envia texto de forma síncrona e retorna o resultado de áudio completo.
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.
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.
-
Ligar
streamingCallvárias vezes para enviar fragmentos de texto. O servidor segmenta automaticamente em sentenças: sentenças completas são sintetizadas imediatamente, as incompletas são armazenadas em buffer até serem concluídas.streamingComplete()força a síntese de todo o texto armazenado em buffer. -
Envie fragmentos de texto em intervalos de 23 segundos para evitar erros de tempo limite. Ligar
streamingComplete()quando terminar.O tempo limite do servidor de 23 segundos não pode ser alterado no cliente.
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:
-
Vozes clonadas: Use qualquer instrução de linguagem natural para controlar a síntese.
Exemplos de instruções:
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.
- Vozes do sistema: As instruções devem utilizar um formato fixo. Veja a lista de vozes para obter detalhes.
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:
- Reinicialize o
SpeechSynthesizerinstância antes de cadacallinvocação. - Ligue sempre
streamingCompletedurante streaming bidirecional para evitar a perda da fala sintetizada.
Fatores que afetam a latência do primeiro pacote:
- Estabelecimento de conexão WebSocket (primeira chamada)
- Tempo de carregamento de voz (varia de acordo com a voz)
- Carga de serviço (filas em horário de pico)
- Latência de rede
Latência típica:
- Conexão reutilizada com voz carregada: ~500 ms
- Primeira conexão ou troca de voz: 1.500-2.000 ms
Se a latência exceder consistentemente 2.000 ms:
- Use o pool de conexões para pré-estabelecer conexões (cenários de alta simultaneidade).
- Verifique a qualidade da rede.
- 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:
- Sem streaming: Processe o
ByteBufferretornado porcall. - Transmissão unidirecional ou streaming bidirecional: Processe o
SpeechSynthesisResultparâmetro emonEvent.
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.