Uso de contenedores del servicio de voz con Kubernetes y Helm

Una opción para administrar los contenedores de Speech locales es usar Kubernetes y Helm. Mediante el empleo de Kubernetes y Helm para definir las imágenes de contenedor de conversión de voz en texto y de texto a voz, crearemos un paquete de Kubernetes. Este paquete se implementa en un clúster de Kubernetes en el entorno local. Por último, exploramos cómo probar los servicios implementados y diversas opciones de configuración. Para más información sobre cómo ejecutar contenedores de Docker sin orquestación de Kubernetes, consulte Instalación y ejecución de contenedores de servicio de voz.

Requisitos previos

Requisitos previos para poder usar los contenedores de Voz en el entorno local:

Obligatorio Propósito
Cuenta de Azure Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Acceso a Container Registry Para incorporar las imágenes de Docker al clúster, Kubernetes necesita acceso al registro de contenedor.
CLI de Kubernetes La CLI de Kubernetes es necesaria para administrar las credenciales compartidas desde el registro de contenedor. Kubernetes también se necesita antes que Helm, que es el administrador de paquetes de Kubernetes.
CLI de Helm Instale la CLI de Helm, que se usa para instalar un gráfico de Helm (definición de paquete de contenedor).
Recurso de Voz Para usar estos contenedores, debe tener:

Un recurso de Voz de Azure para obtener la clave de facturación asociada y el URI del punto de conexión de facturación. Ambos valores están disponibles en las páginas de claves y de introducción de Voz de Azure Portal y son necesarios para iniciar el contenedor.

{API_KEY} : clave de recurso

{ENDPOINT_URI} : el ejemplo de URI de punto de conexión es: https://eastus.api.cognitive.microsoft.com/sts/v1.0

Vea los detalles del equipo host del contenedor del servicio de voz como referencia. En este gráfico de Helm se calculan automáticamente los requisitos de CPU y memoria en función de cuántas descodificaciones (solicitudes simultáneas) especifica el usuario. Además, se ajusta en función de si las optimizaciones de entrada de audio o texto están configuradas como enabled. Los valores predeterminados del gráfico de Helm son dos solicitudes simultáneas y la deshabilitación de la optimización.

Servicio CPU o contenedor Memoria o contenedor
conversión de voz en texto un descodificador requiere un mínimo de 1150 milésimas de núcleo. Si optimizedForAudioFile está habilitado, se requieren 1950 milésimas de núcleo. (valor predeterminado: dos descodificadores) Requerido: 2 GB
Limitado: 4 GB
texto a voz una solicitud simultánea requiere un mínimo de 500 milésimas de núcleo. Si optimizeForTurboMode está habilitado, se requieren 1000 milésimas de núcleo. (valor predeterminado: dos solicitudes simultáneas) Requerido: 1 GB
Limitado: 2 GB

Conectar al clúster de Kubernetes

Se espera que el equipo host tenga un clúster de Kubernetes disponible. Vea este tutorial sobre la implementación de un clúster de Kubernetes para lograr un reconocimiento conceptual de cómo implementar un clúster de Kubernetes en un equipo host.

Configuración de los valores del gráfico de Helm para la implementación

Visite Microsoft Helm Hub para ver todos los gráficos de Helm disponibles públicamente que ofrece Microsoft. En Microsoft Helm Hub encontrará el gráfico local de Voz de Azure AI. Voz de Azure AI local es el gráfico que vamos a instalar, aunque primero debemos crear un archivo config-values.yaml con configuraciones explícitas. Vamos a comenzar por agregar el repositorio de Microsoft a la instancia de Helm.

helm repo add microsoft https://microsoft.github.io/charts/repo

Luego vamos a configurar los valores de nuestro gráfico de Helm. Copie y pegue el siguiente YAML en un archivo denominado config-values.yaml. Para obtener más información sobre la personalización del gráfico de Helm Voz de Azure AI local, vea Personalizar gráficos de Helm. Reemplace los comentarios # {ENDPOINT_URI} y # {API_KEY} por sus propios valores.

# These settings are deployment specific and users can provide customizations
# speech to text configurations
speechToText:
  enabled: true
  numberOfConcurrentRequest: 3
  optimizeForAudioFile: true
  image:
    registry: mcr.microsoft.com
    repository: azure-cognitive-services/speechservices/speech-to-text
    tag: latest
    pullSecrets:
      - mcr # Or an existing secret
    args:
      eula: accept
      billing: # {ENDPOINT_URI}
      apikey: # {API_KEY}

# text to speech configurations
textToSpeech:
  enabled: true
  numberOfConcurrentRequest: 3
  optimizeForTurboMode: true
  image:
    registry: mcr.microsoft.com
    repository: azure-cognitive-services/speechservices/neural-text-to-speech
    tag: latest
    pullSecrets:
      - mcr # Or an existing secret
    args:
      eula: accept
      billing: # {ENDPOINT_URI}
      apikey: # {API_KEY}

Importante

Si no se proporcionan los valores billing y apikey, los servicios expiran pasados 15 minutos. Del mismo modo, se produce un error de comprobación, ya que los servicios no están disponibles.

Paquete de Kubernetes (gráfico de Helm)

El gráfico de Helm contiene la configuración de las imágenes de Docker que se van a extraer del registro de contenedor mcr.microsoft.com.

Un gráfico de Helm es una colección de archivos que describen un conjunto relacionado de recursos de Kubernetes. Un solo gráfico se podría usar para implementar algo sencillo, como un pod almacenado en memoria, o complejo, como una pila de aplicación web completa con servidores HTTP, bases de datos, memorias caché, etc.

Los gráficos de Helm proporcionados extraen las imágenes de Docker del servicio de voz, los servicios de conversión de texto en voz y de voz en texto desde el registro de contenedor mcr.microsoft.com.

Instalación del gráfico de Helm en el clúster de Kubernetes

Para instalar el gráfico de Helm, se debe ejecutar el comando helm install, reemplazando <config-values.yaml> por el argumento de ruta de acceso y nombre de archivo adecuado. El gráfico de Helm microsoft/cognitive-services-speech-onpremise está disponible en Microsoft Helm Hub.

helm install onprem-speech microsoft/cognitive-services-speech-onpremise \
    --version 0.1.1 \
    --values <config-values.yaml> 

Este es el resultado de ejemplo que se puede ver tras una ejecución de instalación correcta:

NAME:   onprem-speech
LAST DEPLOYED: Tue Jul  2 12:51:42 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Pod(related)
NAME                             READY  STATUS             RESTARTS  AGE
speech-to-text-7664f5f465-87w2d  0/1    Pending            0         0s
speech-to-text-7664f5f465-klbr8  0/1    ContainerCreating  0         0s
neural-text-to-speech-56f8fb685b-4jtzh  0/1    ContainerCreating  0         0s
neural-text-to-speech-56f8fb685b-frwxf  0/1    Pending            0         0s

==> v1/Service
NAME            TYPE          CLUSTER-IP    EXTERNAL-IP  PORT(S)       AGE
speech-to-text  LoadBalancer  10.0.252.106  <pending>    80:31811/TCP  1s
neural-text-to-speech  LoadBalancer  10.0.125.187  <pending>    80:31247/TCP  0s

==> v1beta1/PodDisruptionBudget
NAME                                MIN AVAILABLE  MAX UNAVAILABLE  ALLOWED DISRUPTIONS  AGE
speech-to-text-poddisruptionbudget  N/A            20%              0                    1s
neural-text-to-speech-poddisruptionbudget  N/A            20%              0                    1s

==> v1beta2/Deployment
NAME            READY  UP-TO-DATE  AVAILABLE  AGE
speech-to-text  0/2    2           0          0s
neural-text-to-speech  0/2    2           0          0s

==> v2beta2/HorizontalPodAutoscaler
NAME                       REFERENCE                  TARGETS        MINPODS  MAXPODS  REPLICAS  AGE
speech-to-text-autoscaler  Deployment/speech-to-text  <unknown>/50%  2        10       0         0s
neural-text-to-speech-autoscaler  Deployment/neural-text-to-speech  <unknown>/50%  2        10       0         0s


NOTES:
cognitive-services-speech-onpremise has been installed!
Release is named onprem-speech

La implementación de Kubernetes puede tardar varios minutos en completarse. Para confirmar que los pods y los servicios se han implementado correctamente y están disponibles, ejecute el siguiente comando:

kubectl get all

Debería ver algo parecido al resultado siguiente:

NAME                                  READY     STATUS    RESTARTS   AGE
pod/speech-to-text-7664f5f465-87w2d   1/1       Running   0          34m
pod/speech-to-text-7664f5f465-klbr8   1/1       Running   0          34m
pod/neural-text-to-speech-56f8fb685b-4jtzh   1/1       Running   0          34m
pod/neural-text-to-speech-56f8fb685b-frwxf   1/1       Running   0          34m

NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
service/kubernetes       ClusterIP      10.0.0.1       <none>           443/TCP        3h
service/speech-to-text   LoadBalancer   10.0.252.106   52.162.123.151   80:31811/TCP   34m
service/neural-text-to-speech   LoadBalancer   10.0.125.187   65.52.233.162    80:31247/TCP   34m

NAME                             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/speech-to-text   2         2         2            2           34m
deployment.apps/neural-text-to-speech   2         2         2            2           34m

NAME                                        DESIRED   CURRENT   READY     AGE
replicaset.apps/speech-to-text-7664f5f465   2         2         2         34m
replicaset.apps/neural-text-to-speech-56f8fb685b   2         2         2         34m

NAME                                                            REFERENCE                   TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/speech-to-text-autoscaler   Deployment/speech-to-text   1%/50%    2         10        2          34m
horizontalpodautoscaler.autoscaling/neural-text-to-speech-autoscaler   Deployment/neural-text-to-speech   0%/50%    2         10        2          34m

Comprobación de la implementación de Helm con pruebas de Helm

Los gráficos de Helm instalados definen pruebas de Helm, que resultan cómodas para la comprobación. Estas pruebas validan la disponibilidad del servicio. Para comprobar las características de conversión de voz en texto y texto en voz, ejecutamos el comando Helm test.

helm test onprem-speech

Importante

Se produce un error en estas pruebas si el estado de POD no es Running o si la implementación no aparece en la columna AVAILABLE. Tenga paciencia, ya que esto puede tardar más de diez minutos en completarse.

Estas pruebas generan distintos resultados de estado:

RUNNING: speech to text-readiness-test
PASSED: speech to text-readiness-test
RUNNING: text to speech-readiness-test
PASSED: text to speech-readiness-test

Como alternativa a la ejecución de pruebas de Helm, puede recopilar las direcciones IP externas y los puertos correspondientes desde el comando kubectl get all. Con la dirección IP y el puerto, abra un explorador web y vaya a http://<external-ip>:<port>:/swagger/index.html para ver las páginas de Swagger de API.

Personalizar gráficos de Helm

Los gráficos de Helm son jerárquicos. La jerarquía permite la herencia de gráficos y, además, proporciona el concepto de especificidad, que consiste en que los valores más específicos invalidan las reglas heredadas.

Speech (gráfico de nivel superior)

Los valores del gráfico de nivel superior reemplazan a los valores de los gráficos secundarios correspondientes. Por lo tanto, todos los valores locales personalizados se deben agregar aquí.

Parámetro Descripción Valor predeterminado
speechToText.enabled Si el servicio de conversión de voz en texto está habilitado. true
speechToText.verification.enabled Si la funcionalidad helm test del servicio speech-to-text está habilitada. true
speechToText.verification.image.registry El repositorio de imágenes de Docker que helm test usa para probar el servicio speech-to-text. Helm crea un pod independiente dentro del clúster para realizar pruebas y extrae la imagen test-use de este Registro. docker.io
speechToText.verification.image.repository El repositorio de imágenes de Docker que helm test usa para probar el servicio speech-to-text. El pod de prueba de Helm usa este repositorio para extraer la imagen test-use. antsu/on-prem-client
speechToText.verification.image.tag La etiqueta de la imagen de Docker usada con helm test para el servicio de conversión de voz en texto. El pod de prueba de Helm usa esta etiqueta para extraer la imagen test-use. latest
speechToText.verification.image.pullByHash Si la imagen de Docker test-use se extrae mediante hash. Si true, debería agregarse speechToText.verification.image.hash con un valor de Hash de imagen válido. false
speechToText.verification.image.arguments Los argumentos usados para ejecutar la imagen de Docker test-use. El pod de prueba de Helm pasa estos argumentos al contenedor cuando se ejecuta helm test. "./speech-to-text-client"
"./audio/whatstheweatherlike.wav"
"--expect=What's the weather like"
"--host=$(SPEECH_TO_TEXT_HOST)"
"--port=$(SPEECH_TO_TEXT_PORT)"
textToSpeech.enabled Si el servicio de conversión de texto en voz está habilitado. true
textToSpeech.verification.enabled Si la funcionalidad helm test del servicio speech-to-text está habilitada. true
textToSpeech.verification.image.registry El repositorio de imágenes de Docker que helm test usa para probar el servicio speech-to-text. Helm crea un pod independiente dentro del clúster para realizar pruebas y extrae la imagen test-use de este Registro. docker.io
textToSpeech.verification.image.repository El repositorio de imágenes de Docker que helm test usa para probar el servicio speech-to-text. El pod de prueba de Helm usa este repositorio para extraer la imagen test-use. antsu/on-prem-client
textToSpeech.verification.image.tag La etiqueta de la imagen de Docker usada con helm test para el servicio de conversión de voz en texto. El pod de prueba de Helm usa esta etiqueta para extraer la imagen test-use. latest
textToSpeech.verification.image.pullByHash Si la imagen de Docker test-use se extrae mediante hash. Si true, debería agregarse textToSpeech.verification.image.hash con un valor de Hash de imagen válido. false
textToSpeech.verification.image.arguments Los argumentos que se ejecutarán con la imagen de Docker test-use. El pod de prueba de Helm pasa estos argumentos al contenedor cuando se ejecuta helm test. "./text-to-speech-client"
"--input='What's the weather like'"
"--host=$(TEXT_TO_SPEECH_HOST)"
"--port=$(TEXT_TO_SPEECH_PORT)"

Conversión de voz en texto (gráfico secundario: charts/speechToText)

Para reemplazar al gráfico de nivel superior, agregue el prefijo speechToText. a todos los parámetros para que sean más específicos. Se reemplazará el parámetro correspondiente, por ejemplo speechToText.numberOfConcurrentRequest reemplaza a numberOfConcurrentRequest.

Parámetro Descripción Valor predeterminado
enabled Si el servicio de conversión de voz en texto está habilitado. false
numberOfConcurrentRequest Número de solicitudes simultáneas del servicio de conversión de voz en texto. Este gráfico calcula automáticamente los recursos de CPU y memoria en función de este valor. 2
optimizeForAudioFile Si el servicio necesita optimizar la entrada de audio a través de archivos de audio. Si true, este gráfico asignará más recursos de CPU al servicio. false
image.registry Registro de la imagen de Docker de conversión de voz en texto. containerpreview.azurecr.io
image.repository Repositorio de la imagen de Docker de conversión de voz en texto. microsoft/cognitive-services-speech-to-text
image.tag Etiqueta de la imagen de Docker de conversión de voz en texto. latest
image.pullSecrets Secretos de la imagen para extraer la imagen de Docker de conversión de voz en texto.
image.pullByHash Si la imagen de Docker se extrae mediante hash. Si true, image.hash es obligatorio. false
image.hash Hash de la imagen de Docker de conversión de voz en texto. Solo se usa con image.pullByHash: true.
image.args.eula (obligatorio) Indica que ha aceptado la licencia. El único valor válido es accept.
image.args.billing (obligatorio) El valor de URI del punto de conexión de facturación está disponible en Azure Portal, en la página de Información general de Información general del servicio de voz.
image.args.apikey (obligatorio) Se usa para realizar un seguimiento de la información de facturación.
service.type Tipo de servicio de Kubernetes del servicio de conversión de voz en texto. Consulte las instrucciones de los tipos de servicio de Kubernetes para obtener más información y comprobar la compatibilidad con los proveedores de nube. LoadBalancer
service.port Puerto del servicio de conversión de voz en texto. 80
service.annotations Anotaciones de conversión de voz en texto para los metadatos del servicio. Las anotaciones son pares de clave-valor.
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled Si Horizontal Pod Autoscaler está habilitado. Si true, speech-to-text-autoscaler se implementará en el clúster de Kubernetes. true
service.podDisruption.enabled Si Pod Disruption Budget está habilitado. Si true, speech-to-text-poddisruptionbudget se implementará en el clúster de Kubernetes. true

Análisis de sentimiento (sub-chart: charts/speechToText)

A partir de la versión 2.2.0 del contenedor de conversión de voz en texto y la versión 0.2.0 del gráfico de Helm, se usan los siguientes parámetros para el análisis de sentimiento mediante la API del servicio de lenguaje.

Parámetro Descripción Valores Valor predeterminado
textanalytics.enabled Si está habilitado el servicio text-analytics. true/false false
textanalytics.image.registry El registro de la imagen de Docker text-analytics. registro de imagen de Docker válido
textanalytics.image.repository El repositorio de la imagen de Docker text-analytics. repositorio de imágenes de Docker válido
textanalytics.image.tag La etiqueta de la imagen de Docker text-analytics. etiqueta de imagen de Docker válida
textanalytics.image.pullSecrets Los secretos de imagen para extraer la imagen de Docker text-analytics. nombre de secreto válido
textanalytics.image.pullByHash Especifica si se va a extraer la imagen de Docker por hash. Si yes, image.hash también se requiere. Si no, establézcalo como "false". El valor predeterminado es false. true/false false
textanalytics.image.hash El hash de la imagen de Docker text-analytics. Úselo solo con image.pullByHash:true. hash de imagen de Docker válido
textanalytics.image.args.eula Uno de los argumentos necesarios en el contenedor text-analytics, que indica que ha aceptado la licencia. El valor de esta opción debe establecerse en accept. accept, si desea utilizar el contenedor.
textanalytics.image.args.billing Uno de los argumentos necesarios en el contenedor text-analytics, que especifica el identificador URI del punto de conexión de facturación. El valor de URI del punto de conexión de facturación está disponible en Azure Portal, en la página de Información general de Información general del servicio de voz. identificador URI del punto de conexión de facturación
textanalytics.image.args.apikey Uno de los argumentos necesarios en el contenedor text-analytics, que se usa para realizar un seguimiento de la información de facturación. apiKey válido
textanalytics.cpuRequest La CPU solicitada para el contenedor text-analytics. int 3000m
textanalytics.cpuLimit La CPU limitada del contenedor text-analytics. 8000m
textanalytics.memoryRequest La memoria solicitada del contenedor text-analytics. 3Gi
textanalytics.memoryLimit La memoria limitada del contenedor text-analytics. 8Gi
textanalytics.service.sentimentURISuffix El sufijo URI de análisis de sentimiento, el identificador URI completo tiene el formato "http://<service>:<port>/<sentimentURISuffix>". text/analytics/v3.0-preview/sentiment
textanalytics.service.type El tipo de servicio text-analytics de Kubernetes. Consulte los tipos de servicio de Kubernetes. tipo de servicio Kubernetes válido LoadBalancer
textanalytics.service.port El puerto del servicio text-analytics. int 50085
textanalytics.service.annotations Las anotaciones que los usuarios pueden agregar a los metadatos del servicio text-analytics. Por ejemplo:
anotaciones:
some/annotation1: value1
some/annotation2: value2
anotaciones, una por cada línea
textanalytics.serivce.autoScaler.enabled Si Horizontal Pod Autoscaler está habilitado. Si está habilitado, text-analytics-autoscaler se implementará en el clúster de Kubernetes. true/false true
textanalytics.service.podDisruption.enabled Si Pod Disruption Budget está habilitado. Si está habilitado, text-analytics-poddisruptionbudget se implementará en el clúster de Kubernetes. true/false true

Conversión de texto en voz (gráfico secundario: charts/textToSpeech)

Para reemplazar al gráfico de nivel superior, agregue el prefijo textToSpeech. a todos los parámetros para que sean más específicos. Se reemplazará el parámetro correspondiente, por ejemplo textToSpeech.numberOfConcurrentRequest reemplaza a numberOfConcurrentRequest.

Parámetro Descripción Valor predeterminado
enabled Si el servicio de conversión de texto en voz está habilitado. false
numberOfConcurrentRequest Número de solicitudes simultáneas del servicio de conversión de texto en voz. Este gráfico calcula automáticamente los recursos de CPU y memoria en función de este valor. 2
optimizeForTurboMode Si el servicio necesita optimizar la entrada de texto a través de archivos de texto. Si true, este gráfico asignará más recursos de CPU al servicio. false
image.registry Registro de la imagen de Docker de conversión de texto en voz. containerpreview.azurecr.io
image.repository Repositorio de la imagen de Docker de conversión de texto en voz. microsoft/cognitive-services-text-to-speech
image.tag Etiqueta de la imagen de Docker de conversión de texto en voz. latest
image.pullSecrets Secretos de la imagen para extraer la imagen de Docker de conversión de texto en voz.
image.pullByHash Si la imagen de Docker se extrae mediante hash. Si true, image.hash es obligatorio. false
image.hash Hash de la imagen de Docker de conversión de texto en voz. Solo se usa con image.pullByHash: true.
image.args.eula (obligatorio) Indica que ha aceptado la licencia. El único valor válido es accept.
image.args.billing (obligatorio) El valor de URI del punto de conexión de facturación está disponible en Azure Portal, en la página de Información general de Información general del servicio de voz.
image.args.apikey (obligatorio) Se usa para realizar un seguimiento de la información de facturación.
service.type Tipo de servicio de Kubernetes del servicio de conversión de texto en voz. Consulte las instrucciones de los tipos de servicio de Kubernetes para obtener más información y comprobar la compatibilidad con los proveedores de nube. LoadBalancer
service.port El puerto del servicio de conversión de texto en voz. 80
service.annotations Las anotaciones de conversión de texto en voz para los metadatos del servicio. Las anotaciones son pares de clave-valor.
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled Si Horizontal Pod Autoscaler está habilitado. Si true, text-to-speech-autoscaler se implementará en el clúster de Kubernetes. true
service.podDisruption.enabled Si Pod Disruption Budget está habilitado. Si true, text-to-speech-poddisruptionbudget se implementará en el clúster de Kubernetes. true

Pasos siguientes

Para obtener más información sobre la instalación de aplicaciones con Helm en Azure Kubernetes Service (AKS), visite esta página.