Sintetice voz con CosyVoice utilizando el SDK de Java de DashScope.
Endpoints de servicio
De forma predeterminada, el SDK se conecta al endpoint de la región de Pekín. Para usar una región diferente, configure Constants.baseWebsocketApiUrl antes de inicializar el SDK.
- Singapore
- China (Beijing)
wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/inferenceReemplace {WorkspaceId} con su ID de espacio de trabajo real.SpeechSynthesizer
Paquete: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesizer
Constructor
param: Parámetros de síntesis de voz, construidos conSpeechSynthesisParam.builder()callback: Devolución de llamada para llamadas por streaming. Pase null para llamadas sin streaming.
call() - Síntesis sin streaming/streaming unidireccional
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
text | String | Sí | Texto a sintetizar. Longitud máxima: 20,000 caracteres. |
ByteBuffer o null. Para llamadas sin streaming, devuelve los datos de audio completos. Para llamadas de streaming unidireccional, este método devuelve null; el audio se entrega a través de la devolución de llamada.
streamingCall() - Síntesis por streaming bidireccional
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
text | String | Sí | Texto a sintetizar. Longitud máxima: 20,000 caracteres. Puede llamar a este método varias veces para agregar texto. |
streamingComplete() - Finalizar streaming bidireccional
Firma del método:
streamingCancel() - Cancelar streaming bidireccional
Firma del método:
SpeechSynthesizer.
callAsFlowable() - Síntesis por streaming unidireccional (reactiva)
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
text | String | Sí | Texto a sintetizar. |
streamingCallAsFlowable() - Síntesis por streaming bidireccional (reactiva)
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
textStream | Flowable<String> | Sí | Flujo reactivo de texto. |
SpeechSynthesisResult>.
getDuplexApi().close() - Cerrar conexión WebSocket
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
code | int | Sí | Código de cierre. |
reason | String | Sí | Motivo de cierre. |
boolean. Devuelve true si la conexión se cerró correctamente, false en caso contrario.
getLastRequestId() - Obtener ID de solicitud
Firma del método:
String, el ID de solicitud.
getFirstPackageDelay() - Obtener latencia del primer paquete
Firma del método:
long. La latencia del primer paquete en milisegundos, medida desde el envío del primer segmento de texto hasta la recepción del primer paquete de audio.
SpeechSynthesisParam
Paquete: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisParam
Ejemplo:
Métodos del builder
| Método | Tipo de parámetro | Obligatorio | Descripción |
|---|---|---|---|
model(String) | String | Sí | El nombre del modelo. |
voice(String) | String | Sí | La voz utilizada para la síntesis de habla.
|
format(SpeechSynthesisAudioFormat) | enum | No | Formato de codificación de audio y tasa de muestreo.Predeterminado: SpeechSynthesisAudioFormat.MP3_22050HZ_MONO_256KBPS.Paquete SpeechSynthesisAudioFormat: com.alibaba.dashscope.audio.ttsv2.SpeechSynthesisAudioFormat. |
volume(int) | int | No | El nivel de volumen.Valor predeterminado: 50.Valores válidos: [0, 100]. |
speechRate(float) | float | No | La velocidad del habla.Valor predeterminado: 1.0.Valores válidos: [0.5, 2.0]. |
pitchRate(float) | float | No | El tono.Valor predeterminado: 1.0.Valores válidos: [0.5, 2.0]. |
enableWordTimestamp(boolean) | boolean | No | Especifica si se deben habilitar las marcas de tiempo a nivel de palabra.Valor predeterminado: false.Disponible solo en modo de salida por streaming. Voces compatibles: voces clonadas de cosyvoice-v3.5-plus, cosyvoice-v3.5-flash, cosyvoice-v3-flash, cosyvoice-v3-plus, cosyvoice-v2 y voces del sistema marcadas como compatibles en la CosyVoice lista de voces. Las voces clonadas de otros modelos no admiten esta función. |
seed(int) | int | No | Una semilla aleatoria para controlar la variación en la salida de la síntesis. Cuando la versión del modelo, el texto, la voz y otros parámetros no cambian, usar la misma semilla produce resultados idénticos.Valor predeterminado: 0.Valores válidos: [0, 65535].Para versiones del SDK anteriores a 2.21.7, establezca seed mediante parámetros adicionales. |
languageHints(List<String>) | List<String> | No | Especifica el idioma objetivo para la síntesis de voz con el fin de mejorar la calidad de salida.Cuando la pronunciación de dígitos, la expansión de abreviaturas, la lectura de símbolos o la síntesis en idiomas minoritarios no cumpla con las expectativas, utilice este parámetro. Por ejemplo:
Valores válidos
|
instruction(String) | String | No | Controla las características de la síntesis, como el dialecto, la emoción o el estilo de habla.Para detalles de uso, consulte Control de instrucciones. |
hotFix(ParamHotFix) | ParamHotFix | No | Configura correcciones de pronunciación y reemplazos de texto aplicados antes de la síntesis. Esta función no es compatible con cosyvoice-v2.
|
parameter(String key, Object value) | String, Object | No | Establece parámetros adicionales. |
parameters(Map<String, Object>) | Map | No | Establece parámetros adicionales. |
Parámetros adicionales
Se establece mediante parameter() o parameters().
Ejemplo:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
bit_rate | integer | No | La tasa de bits de audio en kbps. Cuando el formato de audio es mp3 u opus, utilice bit_rate para ajustar la tasa de bits.Valor predeterminado: 32.Valores válidos: [6, 510]. |
enable_aigc_tag | boolean | No | Especifica si se debe incrustar una marca de agua AIGC en el audio generado. Cuando se establece en true, la marca de agua se incrusta en archivos de audio de formatos compatibles (wav/mp3/opus).Valor predeterminado: false. Solo cosyvoice-v3-flash, cosyvoice-v3-plus y cosyvoice-v2 admiten esta función. |
aigc_propagator | String | No | Establece el campo ContentPropagator en la marca de agua AIGC, identificando al propagador del contenido. Surte efecto solo cuando enable_aigc_tag es true.Valor predeterminado: UID de Alibaba Cloud.Solo cosyvoice-v3-flash, cosyvoice-v3-plus y cosyvoice-v2 admiten esta función. |
aigc_propagate_id | String | No | Establece el campo PropagateID en la marca de agua AIGC, identificando de manera única una acción de propagación específica. Surte efecto solo cuando enable_aigc_tag es true.Valor predeterminado: El ID de solicitud de la solicitud actual de síntesis de voz.Solo cosyvoice-v3-flash, cosyvoice-v3-plus y cosyvoice-v2 admiten esta función. |
enable_markdown_filter | boolean | No | Solo las voces clonadas de cosyvoice-v3-flash admiten esta función.
|
ResultCallback
Paquete: com.alibaba.dashscope.common.ResultCallback
onEvent() - Recibir datos de audio
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
result | SpeechSynthesisResult | Sí | Se activa cuando se recibe un evento de síntesis. Contiene el cuadro de audio, información de marcas de tiempo e información de salida (tipo de evento, texto original, etc.). |
onComplete() - Síntesis completada
Firma del método:
onError() - Manejo de errores
Firma del método:
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
e | Exception | Sí | Se activa cuando ocurre un error. Contiene la información de la excepción. |
SpeechSynthesisResult
Paquete: com.alibaba.dashscope.audio.tts.SpeechSynthesisResult
getAudioFrame() - Obtener trama de datos de audio
Firma del método:
ByteBuffer, la trama de datos de audio.
getTimestamp() - Obtener información de marca de tiempo
Firma del método:
getOutput() - Obtener información de salida
Firma del método:
com.google.gson.JsonObject, la información de salida del evento de síntesis, que contiene el tipo de evento y el contenido del texto. Requiere una versión del SDK >= 2.22.0.
Información de marcas de tiempo a nivel de oración (Sentence)
Sentence encapsula información de marcas de tiempo a nivel de oración.
getBeginTime() - Obtener tiempo de inicio de oración
Firma del método:
getEndTime() - Obtener tiempo de fin de oración
Firma del método:
getWords() - Obtener marcas de tiempo a nivel de palabra
Firma del método:
List de objetos Word que contiene información de marcas de tiempo a nivel de palabra. Puede estar vacía.
Información de marcas de tiempo a nivel de palabra (Word)
Word encapsula información de marcas de tiempo a nivel de palabra.
getBeginTime() - Obtener tiempo de inicio de palabra
Firma del método:
getEndTime() - Obtener tiempo de fin de palabra
Firma del método:
getText() - Obtener texto
Firma del método:
String, el contenido del texto.
getPhonemes() - Obtener marcas de tiempo a nivel de fonema
Firma del método:
List de objetos Phoneme que contiene información de marcas de tiempo a nivel de fonema. Puede estar vacía.
Información de marcas de tiempo a nivel de fonema (Phoneme)
Phoneme encapsula información de marcas de tiempo a nivel de fonema.
getBeginTime() - Obtener tiempo de inicio de fonema
Firma del método:
getEndTime() - Obtener tiempo de fin de fonema
Firma del método:
getText() - Obtener texto
Firma del método:
String, el contenido del texto.
getTone() - Obtener tono
Firma del método:
- En inglés, 0, 1 y 2 representan sílaba átona, acento primario y acento secundario respectivamente.
- En pinyin chino, 1, 2, 3, 4 y 5 representan el primer, segundo, tercer, cuarto y tono neutro respectivamente.
Información de salida (output)
getOutput() devuelve un JsonObject que encapsula la información de salida del evento de síntesis. Recupérela en la devolución de llamada onEvent o en el flujo Flowable. Contiene los siguientes campos:
| Campo | Tipo | Descripción |
|---|---|---|
type | String | Tipo de evento. Valores posibles: sentence-begin (inicio de oración; devuelve el texto a sintetizar), sentence-synthesis (síntesis de audio en curso; devuelve un fragmento de datos de audio), sentence-end (fin de oración; devuelve contenido de texto y marcas de tiempo a nivel de palabra). |
original_text | String | Texto original de la oración actual. Se devuelve en los eventos sentence-begin y sentence-end. |
sentence | JsonObject | Información de la oración, que contiene el índice de la oración (index) y las marcas de tiempo a nivel de palabra (words). El evento sentence-end incluye información completa de marcas de tiempo a nivel de palabra. |
Código de ejemplo
El SDK admite los siguientes modos de síntesis:
- No streaming: Una llamada bloqueante que envía el texto completo de una sola vez y devuelve el audio completo directamente. Ideal para la síntesis de voz de texto corto.
- Streaming unidireccional: Una llamada no bloqueante que envía el texto completo de una sola vez y entrega datos de audio (potencialmente en fragmentos) a través de una función de devolución de llamada. Ideal para escenarios de texto corto que requieren baja latencia.
- Streaming bidireccional: Una llamada no bloqueante que envía texto en múltiples segmentos y entrega audio sintetizado incrementalmente a través de una función de devolución de llamada en tiempo real. Ideal para escenarios de texto largo que requieren baja latencia.
- Llamadas sin streaming
- Llamadas de streaming unidireccional
- Llamadas de streaming bidireccional
Llamadas basadas en Flowable
Flowable es un tipo de RxJava que representa un flujo reactivo compatible con contrapresión. Para obtener más información, consulte la documentación de Flowable de RxJava.
Antes de usar Flowable, asegúrese de que la biblioteca RxJava esté integrada y de comprender los conceptos básicos de la programación reactiva.
La longitud del texto por llamada individual no debe exceder los 20,000 caracteres, y la longitud acumulada del texto en todas las llamadas no debe exceder los 200,000 caracteres.
- Llamadas de streaming unidireccional
- Llamadas de streaming bidireccional
El siguiente ejemplo muestra cómo usar la interfaz
blockingForEach de un objeto Flowable para recuperar cada objeto SpeechSynthesisResult transmitido de manera bloqueante.