Utilice el SDK de iOS de CosyVoice para convertir texto en voz expresiva y de alta calidad en sus aplicaciones iOS.
NeoNui
Aspectos destacados de la arquitectura:- Patrón Singleton: obtenga la instancia global mediante
[StreamInputTts get_instance]. - Impulsado por callbacks: reciba eventos y datos de audio a través del protocolo
StreamInputTtsDelegate. - Configuración JSON: pase los parámetros como cadenas JSON.
Flujos de llamada
CosyVoice admite dos modos de invocación: entrada única y entrada en streaming.
Entrada única: ideal para la síntesis de texto corto o cuando necesita marcado SSML.
playStreamInputTts()oasyncPlayStreamInputTts()— Envía un texto completo e inicia la síntesis. El primero es síncrono y retorna después de que finaliza la síntesis; el segundo es asíncrono y retorna inmediatamente después de iniciar la síntesis.onStreamInputTtsDataCallback()— Recibir datos de audio.TTS_EVENT_SYNTHESIS_COMPLETE— Síntesis completada.
Entrada en streaming: ideal para conversaciones en tiempo real o escenarios de formato largo de "hablar mientras se sintetiza". Este modo no admite marcado SSML.
startStreamInputTts()— Inicialice el SDK y configure el delegado de callback y los parámetros de conexión.sendStreamInputTts()— Envíe continuamente fragmentos de texto para ser sintetizados.onStreamInputTtsDataCallback()— Recibir datos de audio.stopStreamInputTts()oasyncStopStreamInputTts()— Envía la solicitud de fin de síntesis. El primero es síncrono y retorna después de que finaliza la síntesis; el segundo es asíncrono y retorna inmediatamente después de enviar la solicitud.TTS_EVENT_SYNTHESIS_COMPLETE— Síntesis completada.
startStreamInputTts
Inicia una tarea de síntesis de voz en streaming y abre una conexión con el servidor.
Firma del 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 | Descripción |
|---|---|---|
ticket | char* | Cadena JSON que contiene la configuración de autenticación, conexión y depuración. |
parameters | char* | Cadena JSON que contiene la configuración de efectos de síntesis de voz. |
sessionId | char* | ID de sesión especificado por el cliente. Si se omite, el servidor genera uno. |
logLevel | NuiSdkLogLevel | Nivel de impresión para los registros internos del SDK. |
saveLog | BOOL | Indica si se deben guardar los registros localmente. Cuando se establece en YES, debe especificar una ruta con debug_path y puede limitar el tamaño del archivo con max_log_file_size. |
Devuelve un código de error. Ejemplo de JSON de ticket: El siguiente ejemplo no incluye todos los campos. Agregue los demás según lo requiera su código:
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id"
}
Campos de ticket
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
url | string | Sí | Dirección del servicio:
Reemplace |
apikey | string | Sí | Clave de API. Para limitar la exposición en caso de que se filtre una clave de larga duración, utilice una clave de API de corta duración en su lugar. |
device_id | string | Sí | Identificador único para el usuario final. Establézcalo en el ID de usuario dentro de la aplicación o en un identificador de dispositivo generado por el cliente. El ID se utiliza para el rastreo de registros y la resolución de problemas. |
complete_waiting_ms | int | No | Tiempo de espera, en milisegundos, para esperar el evento de síntesis completada (TTS_EVENT_SYNTHESIS_COMPLETE) después de llamar a stopStreamInputTts.Predeterminado: 10000. |
debug_path | string | No | Ruta local donde se almacenan los archivos de registro. Este campo solo surte efecto cuando Se conservan como máximo dos archivos de registro localmente. |
max_log_file_size | int | No | Tamaño máximo de un archivo de registro, en bytes. Este campo surte efecto únicamente cuando Valor predeterminado: 104857600 (100 × 1024 × 1024 bytes, es decir, 100 MiB). |
log_track_level | int | No | Nivel de filtro para los registros entregados a través del callback de registro (onStreamInputTtsLogTrackCallback).Predeterminado: 2. Valores válidos:
Nota: |
Ejemplo de JSON de parameters: El siguiente ejemplo no incluye todos los campos. Agregue los demás según lo requiera su código:
{
"model": "cosyvoice-v3-plus",
"voice": "longanyang",
"format": "mp3",
"sample_rate": 24000,
"volume": 50,
"rate": 1,
"pitch": 1,
"language_hints": ["zh"],
"enable_ssml": false
}
Campos de parameters
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
model | string | Sí | El nombre del modelo. |
voice | string | Sí | La voz utilizada para la síntesis de habla.
|
format | string | No | El formato de codificación de audio. Valores válidos:
|
enable_audio_decoder | BOOL | No | Si se debe habilitar el decodificador interno del SDK. Valor predeterminado: NO.Este parámetro surte efecto solo cuando el formato de codificación de audio es opus o mp3. Cuando está habilitado, el SDK decodifica los datos de audio opus o mp3 en datos PCM antes de devolverlos. |
volume | int | No | El nivel de volumen. Valor predeterminado: 50. Valores válidos: [0, 100]. |
sample_rate | int | No | La tasa de muestreo de audio en Hz. Valores válidos: 8000, 16000, 22050 (predeterminado), 24000, 44100, 48000. |
rate | float | No | La velocidad del habla. Valor predeterminado: 1.0. Valores válidos: [0.5, 2.0]. |
pitch | float | No | El tono. Valor predeterminado: 1.0. Valores válidos: [0.5, 2.0]. |
bit_rate | int | 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_ssml | boolean | No | Si se debe habilitar SSML. Predeterminado: false.
Para las restricciones de uso de SSML (modelos, voces y API compatibles), consulte Limitaciones. |
word_timestamp_enabled | 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 | 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]. |
language_hints | array[string] | No | Importante
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 | 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. |
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. NotaSolo 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. NotaSolo 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. NotaSolo cosyvoice-v3-flash, cosyvoice-v3-plus y cosyvoice-v2 admiten esta función. |
hot_fix | object | No | Configuración de corrección rápida de texto para personalizar la pronunciación de palabras especificadas o reemplazar texto antes de la síntesis. Notacosyvoice-v2 no admite esta función. Campos:
Ejemplo: |
enable_markdown_filter | BOOL | No | NotaSolo las voces clonadas de cosyvoice-v3-flash admiten esta función. Si se debe filtrar el marcado Markdown del texto de entrada antes de la síntesis para que el marcado no se lea en voz alta. Predeterminado: Valores válidos:
|
sendStreamInputTts
Envía el texto que se va a sintetizar. Utilice este método junto con startStreamInputTts.
Después de llamar a startStreamInputTts, utilice este método para enviar texto continuamente.
Después de enviar todo el texto, llame a stopStreamInputTts o asyncStopStreamInputTts para indicar el fin de la entrada.
- (int) sendStreamInputTts:(const char *)text;
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
text | char* | Texto a sintetizar. SSML no es compatible. Las etiquetas SSML en la entrada se leen como texto plano en lugar de analizarse. |
Devuelve un código de error.
stopStreamInputTts
Método síncrono. Notifica al servidor que se ha enviado todo el texto y luego se bloquea hasta que se sintetice cada fragmento de audio y se reciba TTS_EVENT_SYNTHESIS_COMPLETE.
El tiempo de espera de bloqueo está controlado por complete_waiting_ms.
- (int) stopStreamInputTts;
Valor de retorno
Devuelve un código de error.
asyncStopStreamInputTts
Método asíncrono. Notifica al servidor que se ha enviado todo el texto y regresa inmediatamente. La síntesis continúa en segundo plano.
Utilice TTS_EVENT_SYNTHESIS_COMPLETE para detectar cuándo finaliza la síntesis.
- (int) asyncStopStreamInputTts;
Valor de retorno
Devuelve un código de error.
cancelStreamInputTts
Cierra inmediatamente la conexión con el servidor y termina la tarea de síntesis actual. Después de llamar a este método, no se activarán más callbacks de datos de audio.
Firma del método- (int) cancelStreamInputTts;
Valor de retorno
Devuelve un código de error.
playStreamInputTts
Método de síntesis única síncrono. Envía el texto y se bloquea mientras se reciben todos los datos de audio, luego regresa después de que finaliza la síntesis. No necesita llamar a stopStreamInputTts posteriormente.
Este método habilita SSML de forma predeterminada. Para deshabilitar SSML, establezca el campo enable_ssml en parameters como false.
- (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
Los parámetros compartidos ticket, parameters y otros utilizan las mismas definiciones que startStreamInputTts.
| Parámetro | Tipo | Descripción |
|---|---|---|
text | char* | Texto a sintetizar. Admite SSML. |
Devuelve un código de error.
asyncPlayStreamInputTts
Este método envía todo el texto para su síntesis de manera asíncrona. Regresa inmediatamente sin esperar datos de audio. No necesita llamar a stopStreamInputTts posteriormente.
Este método habilita SSML de forma predeterminada. Para deshabilitar SSML, establezca el campo enable_ssml en parameters como false.
- (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
Los parámetros compartidos ticket, parameters y otros utilizan las mismas definiciones que startStreamInputTts.
| Parámetro | Tipo | Descripción |
|---|---|---|
text | char* | Texto a sintetizar. Admite SSML. |
Devuelve un código de error.
StreamInputTtsDelegate
Protocolo de callback para la síntesis de voz en streaming de CosyVoice. Implemente este protocolo para recibir eventos de síntesis, datos de audio y registros.
onStreamInputTtsEventCallback: escucha de eventos
Firma del 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 | Descripción |
|---|---|---|
event | StreamInputTtsCallbackEvent | Evento de callback. |
taskid | char* | ID de la tarea de síntesis de voz. |
sessionId | char* | ID de sesión. El valor proporcionado por el cliente se devuelve tal cual. Si no se proporcionó none, el servidor genera uno. |
ret_code | int | Código de error. Válido únicamente para el evento TTS_EVENT_TASK_FAILED. Consulte los códigos de error. |
error_msg | char* | Mensaje de error. Válido únicamente para el evento TTS_EVENT_TASK_FAILED. |
timestamp | char* | Información de marca de tiempo para el resultado de la síntesis. |
all_response | char* | Respuesta JSON completa. Analice esta cadena para extraer los campos que necesita. |
onStreamInputTtsDataCallback: escucha de datos de audio
El SDK activa este callback repetidamente durante la síntesis. Lea los datos de audio desde el callback.
Firma del método- (void)onStreamInputTtsDataCallback:(char*)buffer len:(int)len;
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
buffer | char* | Datos de audio para el segmento actual. Utilice estos datos para:
Nota:
|
len | int | Longitud de los datos de audio, en bytes. |
onStreamInputTtsLogTrackCallback: escucha de registros de seguimiento
Este callback entrega registros internos detallados del SDK para ayudar en la resolución de problemas y la depuración.
Firma del método- (void)onStreamInputTtsLogTrackCallback:(NuiSdkLogLevel)level
logMessage:(const char *)log;
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
level | NuiSdkLogLevel | Nivel de registro. |
log | char* | Contenido del registro. |
StreamInputTtsCallbackEvent
Enumeración de tipo de evento para la síntesis de voz en streaming de CosyVoice.
| Evento | Descripción |
|---|---|
TTS_EVENT_SYNTHESIS_STARTED | El servidor aceptó la solicitud y comenzó el procesamiento. onStreamInputTtsDataCallback normalmente entrega el primer segmento de audio poco después de este evento. |
TTS_EVENT_SENTENCE_SYNTHESIS | Información de progreso emitida durante la síntesis, incluidos los datos de facturación. |
TTS_EVENT_SYNTHESIS_COMPLETE | El servidor ha terminado de enviar todos los datos de audio. onStreamInputTtsDataCallback no se vuelve a llamar. Este evento es la señal definitiva de fin de flujo. |
TTS_EVENT_TASK_FAILED | La tarea falló. Lea task_id, error_code y error_message de all_response en onStreamInputTtsEventCallback para diagnosticar el fallo. |
NuiSdkLogLevel
Enumeración de nivel de registro del SDK que controla la salida de registros.
| Nivel | Descripción |
|---|---|
| 0: LOG_LEVEL_VERBOSE | Most detailed log level. Includes all debug information. |
| 1: LOG_LEVEL_DEBUG | Debug-level logs. |
| 2: LOG_LEVEL_INFO | Registros informativos generales (predeterminado). |
| 3: LOG_LEVEL_WARNING | Warning-level logs. |
| 4: LOG_LEVEL_ERROR | Error-level logs. |
| 5: LOG_LEVEL_NONE | Disables log output. |
Código de ejemplo
- Obtenga su clave de API: Obtener una clave de API.
NotaPara aplicaciones de terceros o usuarios finales que necesitan acceso temporal, o cuando usted want un control estricto sobre operaciones sensibles como el acceso y la eliminación de datos, utilice una clave API temporal en su lugar. Una clave API temporal es válida durante 60 segundos fijos y debe regenerarse después de que expire.
-
Descargue el SDK y ejecute el código de ejemplo:
- Descargue el paquete más reciente del SDK.
- Extraiga el archivo ZIP y agregue
nuisdk.frameworka su proyecto de Xcode. - En Build Phases > Link Binary With Libraries, agregue
nuisdk.framework. - En General > Frameworks, Libraries, and Embedded Content, configure
nuisdk.frameworken Embed & Sign. - Abra el proyecto de ejemplo en Xcode. El código de ejemplo se encuentra en
DashCosyVoiceStreamInputTTSViewController.m. Reemplace la clave de API del marcador de posición con la suya propia y ejecute la aplicación para probarla.
Modos de llamada
| Modo de llamada | Descripción |
|---|---|
One-shot input | Pasos:
|
Streaming input | Pasos:
|
Funciones avanzadas
Marcado SSML
Propósito: Incrustar etiquetas XML en el texto de entrada para controlar con precisión la pronunciación, la velocidad del habla, las pausas y otros detalles de la prosodia.
Limitaciones: SSML solo es compatible con la entrada única (los métodos playStreamInputTts y asyncPlayStreamInputTts). No es compatible con la entrada en streaming (el método sendStreamInputTts).
Cómo usar: Cuando llama a playStreamInputTts o asyncPlayStreamInputTts, el SDK habilita SSML automáticamente. Pase el texto que contiene etiquetas SSML directamente en el parámetro text.
Para más detalles, consulte SSML.
Expresiones matemáticas
Propósito: Hacer que el modelo lea correctamente fórmulas y expresiones matemáticas comunes.
Cómo usar: Pase texto que contenga expresiones matemáticas en formato LaTeX directamente en el parámetro text. Para más detalles, consulte Convertir fórmulas LaTeX a voz (solo idioma chino).