Batch synthesis API para texto a voz
Batch synthesis API puede sintetizar de forma asincrónica un gran volumen de entrada de texto (largo y corto). Los publicadores y las plataformas de contenido de audio pueden crear contenido de audio de larga duración en un lote. Por ejemplo: audiolibros, artículos de noticias y documentos. Batch synthesis API puede crear audio sintetizado de más de 10 minutos.
Importante
Batch synthesis API está disponible con carácter general. Long Audio API se retirará el 1 de abril de 2027. Para obtener más información, consulte Migración a Batch synthesis API.
Batch synthesis API es asincrónica y no devuelve audio sintetizado en tiempo real. Los archivos de texto se envían para sintetizarse, sondean el estado y descargan la salida de audio cuando el estado indica que se ha producido correctamente. Las entradas de texto deben ser texto sin formato o texto en el Lenguaje de marcado de síntesis de voz (SSML).
El diagrama a continuación proporciona una introducción general del flujo de trabajo.
Sugerencia
También puede usar el SDK de Voz para crear audio sintetizado de más de 10 minutos si itera el texto y lo sintetiza en fragmentos. Para obtener un ejemplo de C#, consulte GitHub.
Puede usar las siguientes operaciones de la API REST para la síntesis por lotes:
Operación | Método | Llamada a API REST |
---|---|---|
Creación de síntesis por lotes | PUT |
texttospeech/batchsyntheses/YourSynthesisId |
Obtención de síntesis por lotes | GET |
texttospeech/batchsyntheses/YourSynthesisId |
Enumeración de síntesis por lotes | GET |
texttospeech/batchsyntheses |
Eliminación de síntesis por lotes | DELETE |
texttospeech/batchsyntheses/YourSynthesisId |
Para obtener ejemplos de código, consulte GitHub.
Creación de síntesis por lotes
Para enviar una solicitud de síntesis por lotes, construya la ruta de acceso y el cuerpo de la solicitud HTTP PUT según las instrucciones siguientes:
- Establezca la propiedad
inputKind
requerida. - Si la propiedad
inputKind
está establecida en "PlainText", debe establecer también la propiedadvoice
ensynthesisConfig
. En el ejemplo siguiente,inputKind
está establecido en "SSML", de modo que no se ha establecidosynthesisConfig
. - Opcionalmente, puede establecer
description
,timeToLiveInHours
y otras propiedades. Para obtener más información, consulte Propiedades de la síntesis por lotes.
Nota:
El tamaño máximo de carga JSON que se acepta es de 2 megabytes.
Establezca el YourSynthesisId
obligatoria en la ruta de acceso. YourSynthesisId
debe ser único. Debe ser de 3 a 64 largos, solo contiene números, letras, guiones, guiones y puntos, comienza y termina con una letra o un número.
Realice una solicitud HTTP PUT con el URI, tal y como se muestra en el ejemplo siguiente. Reemplace YourSpeechKey
por la clave de recurso de Voz, YourSpeechRegion
por la región del recurso de Voz, y establezca las propiedades del cuerpo de la solicitud como se ha descrito anteriormente.
curl -v -X PUT -H "Ocp-Apim-Subscription-Key: YourSpeechKey" -H "Content-Type: application/json" -d '{
"description": "my ssml test",
"inputKind": "SSML",
"inputs": [
{
"content": "<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">The rainbow has seven colors.</voice></speak>"
}
],
"properties": {
"outputFormat": "riff-24khz-16bit-mono-pcm",
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"concatenateResult": false,
"decompressOutputFiles": false
}
}' "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01"
Debe recibir un cuerpo de respuesta en el formato siguiente:
{
"id": "YourSynthesisId",
"internalId": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "NotStarted",
"createdDateTime": "2024-03-12T07:23:18.0097387Z",
"lastActionDateTime": "2024-03-12T07:23:18.0097388Z",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false
}
}
La propiedad status
debe evolucionar del estado NotStarted
a Running
y, por último, a Succeeded
o Failed
. Puede llamar a la API de obtención de síntesis por lotes periódicamente hasta que el estado devuelto sea Succeeded
o Failed
.
Obtención de síntesis por lotes
Para obtener el estado del trabajo de síntesis por lotes, realice una solicitud HTTP GET mediante el URI, como se muestra en el ejemplo siguiente. Reemplace YourSpeechKey
por la clave de recurso de Voz y YourSpeechRegion
por la región del recurso de Voz.
curl -v -X GET "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Debe recibir un cuerpo de respuesta en el formato siguiente:
{
"id": "YourSynthesisId",
"internalId": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:23:18.0097387Z",
"lastActionDateTime": "2024-03-12T07:23:18.7979669",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/YourSynthesisId/results.zip?SAS_Token"
}
}
En outputs.result
puede descargar un archivo ZIP que contiene el audio (como 0001.wav
), un resumen y los detalles de depuración. Para obtener más información, consulte Resultados de la síntesis por lotes.
Enumeración de síntesis por lotes
Para enumerar todos los trabajos de síntesis por lotes para el recurso de Voz, realice una solicitud HTTP GET mediante el URI, como se muestra en el ejemplo siguiente. Reemplace YourSpeechKey
por la clave del recurso de Voz y YourSpeechRegion
por la región del recurso de Voz. Opcionalmente, puede establecer los parámetros de consulta skip
y maxpagesize
(hasta 100) en la dirección URL. El valor predeterminado de skip
es 0 y el valor predeterminado de maxpagesize
es 100.
curl -v -X GET "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses?api-version=2024-04-01&skip=1&maxpagesize=2" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Debe recibir un cuerpo de respuesta en el formato siguiente:
{
"value": [
{
"id": "my-job-03",
"internalId": "5f7e9ab6-2c92-4dcb-b5ee-ec0983ee4db0",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:28:32.5690441Z",
"lastActionDateTime": "2024-03-12T07:28:33.0042293",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/my-job-03/results.zip?SAS_Token"
}
},
{
"id": "my-job-02",
"internalId": "5577585f-4710-4d4f-aab6-162d14bd7ee0",
"status": "Succeeded",
"createdDateTime": "2024-03-12T07:28:29.6418211Z",
"lastActionDateTime": "2024-03-12T07:28:30.0910306",
"inputKind": "SSML",
"customVoices": {},
"properties": {
"timeToLiveInHours": 744,
"outputFormat": "riff-24khz-16bit-mono-pcm",
"concatenateResult": false,
"decompressOutputFiles": false,
"wordBoundaryEnabled": false,
"sentenceBoundaryEnabled": false,
"sizeInBytes": 120000,
"succeededAudioCount": 1,
"failedAudioCount": 0,
"durationInMilliseconds": 2500,
"billingDetails": {
"neuralCharacters": 29
}
},
"outputs": {
"result": "https://stttssvcuse.blob.core.windows.net/batchsynthesis-output/29f2105f997c4bfea176d39d05ff201e/my-job-02/results.zip?SAS_Token"
}
}
],
"nextLink": "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses?skip=3&maxpagesize=2&api-version=2024-04-01"
}
En outputs.result
puede descargar un archivo ZIP que contiene el audio (como 0001.wav
), un resumen y los detalles de depuración. Para obtener más información, consulte Resultados de la síntesis por lotes.
La propiedad value
de la respuesta JSON enumera las solicitudes de síntesis. La lista está paginada, con un tamaño de página máximo de 100. La propiedad "nextLink"
se proporciona según sea necesario para obtener la página siguiente de la lista paginada.
Eliminación de síntesis por lotes
Elimine el historial de trabajos de síntesis por lotes después de recuperar los resultados de la salida de audio. El servicio de Voz conserva el historial de síntesis por lotes un máximo de 31 días o mientras dure la propiedad timeToLiveInHours
de la solicitud, lo que ocurra antes. La fecha y hora de eliminación automática (para trabajos de síntesis con el estado "Succeeded" o "Failed") es igual a las propiedades lastActionDateTime
+ timeToLiveInHours
.
Para eliminar un trabajo de síntesis por lotes, realice una solicitud HTTP DELETE mediante el URI, como se muestra en el ejemplo siguiente. Reemplace YourSynthesisId
por el identificador de la síntesis por lotes, YourSpeechKey
por la clave del recurso de Voz y YourSpeechRegion
por la región del recurso de Voz.
curl -v -X DELETE "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01" -H "Ocp-Apim-Subscription-Key: YourSpeechKey"
Los encabezados de respuesta incluyen HTTP/1.1 204 No Content
si la solicitud de eliminación se realizó correctamente.
Resultados de la síntesis por lotes
Después de obtener un trabajo de síntesis por lotes con un valor de status
"Succeeded", puede descargar los resultados de la salida de audio. Use la dirección URL de la propiedad outputs.result
de la respuesta GET de síntesis por lotes.
Para obtener el archivo de resultados de la síntesis por lotes, realice una solicitud HTTP GET mediante el URI, como se muestra en el ejemplo siguiente. Reemplace YourOutputsResultUrl
por la dirección URL de la propiedad outputs.result
de la respuesta GET de síntesis por lotes. Reemplace YourSpeechKey
por su clave de recurso de Voz.
curl -v -X GET "YourOutputsResultUrl" -H "Ocp-Apim-Subscription-Key: YourSpeechKey" > results.zip
Los resultados se encuentran en un archivo ZIP que contiene el audio (como 0001.wav
), un resumen y los detalles de depuración. El prefijo numerado de cada nombre de archivo (que se muestra a continuación como [nnnn]
) está en el mismo orden que las entradas de texto que se usaron al crear la síntesis por lotes.
Nota
El archivo [nnnn].debug.json
contiene el identificador del resultado de la síntesis y otra información que podría ayudar a solucionar problemas. Las propiedades que contiene pueden cambiar, por lo que no debe tomar dependencias del formato JSON.
El archivo de resumen contiene los resultados de la síntesis de cada entrada de texto. Este es un archivo summary.json
de ejemplo:
{
"jobID": "7ab84171-9070-4d3b-88d4-1b8cc1cb928a",
"status": "Succeeded",
"results": [
{
"contents": [
"<speak version=\"1.0\" xml:lang=\"en-US\"><voice name=\"en-US-JennyNeural\">The rainbow has seven colors.</voice></speak>"
],
"status": "Succeeded",
"audioFileName": "0001.wav",
"properties": {
"sizeInBytes": "120000",
"durationInMilliseconds": "2500"
}
}
]
}
Si se solicitaron datos del límite de las oraciones ("sentenceBoundaryEnabled": true
), se incluye un archivo [nnnn].sentence.json
correspondiente en los resultados. Del mismo modo, si se solicitaron datos del límite de las palabras ("wordBoundaryEnabled": true
), se incluye un archivo [nnnn].word.json
correspondiente en los resultados.
Este es un ejemplo de un archivo de datos de palabras con el desplazamiento de audio y la duración en milisegundos:
[
{
"Text": "The",
"AudioOffset": 50,
"Duration": 137
},
{
"Text": "rainbow",
"AudioOffset": 200,
"Duration": 350
},
{
"Text": "has",
"AudioOffset": 562,
"Duration": 175
},
{
"Text": "seven",
"AudioOffset": 750,
"Duration": 300
},
{
"Text": "colors",
"AudioOffset": 1062,
"Duration": 625
},
{
"Text": ".",
"AudioOffset": 1700,
"Duration": 100
}
]
Latencia y procedimientos recomendados de síntesis por lotes
Al usar la síntesis por lotes para generar voz sintetizada, es importante tener en cuenta la latencia implicada y seguir los procedimientos recomendados para lograr resultados óptimos.
Latencia en la síntesis por lotes
La latencia en la síntesis por lotes depende de varios factores, incluida la complejidad del texto de entrada, el número de entradas en el lote y las funcionalidades de procesamiento del hardware subyacente.
La latencia para la síntesis por lotes es la siguiente (aproximadamente):
La latencia del 50 % de las salidas de voz sintetizadas es de 10 a 20 segundos.
La latencia del 95 % de las salidas de voz sintetizadas es de 120 segundos.
procedimientos recomendados
Al considerar la síntesis por lotes de la aplicación, se recomienda evaluar si la latencia cumple sus requisitos. Si la latencia se alinea con el rendimiento deseado, la síntesis por lotes puede ser una opción adecuada. Sin embargo, si la latencia no satisface sus necesidades, es posible que considere la posibilidad de usar la API en tiempo real.
Códigos de estado HTTP
En esta sección se detallan los mensajes y códigos de respuesta HTTP de Batch synthesis API.
HTTP 200 OK
HTTP 200 OK indica que la solicitud se ha realizado correctamente.
HTTP 201 Created
HTTP 201 Created indica que la solicitud de creación de síntesis por lotes (a través de HTTP PUT) se realizó correctamente.
Error HTTP 204
Un error HTTP 204 indica que la solicitud se ha realizado correctamente, pero el recurso no existe. Por ejemplo:
- Ha intentado obtener o eliminar un trabajo de síntesis que no existe.
- Ha eliminado correctamente un trabajo de síntesis.
Error HTTP 400
Estos son ejemplos que pueden dar lugar al error 400:
outputFormat
es compatible o no es válido. Proporcione un valor de formato válido o dejeoutputFormat
vacío para usar la configuración predeterminada.- El número de entradas de texto solicitadas ha superado el límite de 10 000.
- Ha intentado usar un identificador de implementación no válido o una voz personalizada que no se ha implementado correctamente. Asegúrese de que el recurso de Voz tiene acceso a la voz personalizada y de que esta se ha implementado correctamente. También debe asegurarse de que la asignación de
{"your-custom-voice-name": "your-deployment-ID"}
es correcta en la solicitud de síntesis por lotes. - Ha intentado usar un recurso de Voz F0, pero la región solo admite el plan de tarifa de recursos de Voz Estándar.
Error HTTP 404
No se encuentra la entidad especificada. Asegúrese de que el id. de síntesis sea correcto.
Error HTTP 429
Hay demasiadas solicitudes recientes. Cada aplicación cliente puede enviar hasta 100 solicitudes cada diez segundos para cada recurso de Voz. Reduzca el número de solicitudes por segundo.
Error HTTP 500
El error interno del servidor HTTP 500 indica que se ha producido un error en la solicitud. El cuerpo de la respuesta contiene el mensaje de error.
Ejemplo de error HTTP
Esta es una solicitud de ejemplo que produce un error HTTP 400, ya que la propiedad inputs
es necesaria para crear un trabajo.
curl -v -X PUT -H "Ocp-Apim-Subscription-Key: YourSpeechKey" -H "Content-Type: application/json" -d '{
"inputKind": "SSML"
}' "https://YourSpeechRegion.api.cognitive.microsoft.com/texttospeech/batchsyntheses/YourSynthesisId?api-version=2024-04-01"
En este caso, los encabezados de respuesta incluirán HTTP/1.1 400 Bad Request
.
El cuerpo de la respuesta es similar al ejemplo JSON siguiente:
{
"error": {
"code": "BadRequest",
"message": "The inputs is required."
}
}