你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将语音服务容器与 Kubernetes 和 Helm 配合使用

在本地管理语音容器的一种做法是使用 Kubernetes 和 Helm。 我们将使用 Kubernetes 和 Helm 定义语音转文本和文本转语音容器映像,以此创建一个 Kubernetes 包。 此包将部署到本地 Kubernetes 群集。 最后,我们将了解如何测试已部署的服务和各种配置选项。 有关在不使用 Kubernetes 业务流程的情况下运行 Docker 容器的详细信息,请参阅安装和运行语音服务容器

先决条件

在本地使用语音容器之前,必须满足以下先决条件:

必须 目的
Azure 帐户 如果没有 Azure 订阅,请在开始之前创建一个免费帐户
容器注册表访问权限 Kubernetes 需要有权访问容器注册表才能将 Docker 映像提取到群集中。
Kubernetes CLI 需要使用 Kubernetes CLI 来管理容器注册表中的共享凭据。 在安装 Helm(Kubernetes 包管理器)之前,也需要有 Kubernetes。
Helm CLI 安装 Helm CLI,它可用于安装 Helm 图表(容器包定义)。
语音资源 若要使用这些容器,必须具有:

“语音”Azure 资源,用于获取关联的计费密钥和计费终结点 URI。 这两个值可以从 Azure 门户中的“语音概述”和“密钥”页面获得,并且是启动容器时所必需的。

{API_KEY}:资源密钥

{ENDPOINT_URI}:终结点 URI 示例:https://eastus.api.cognitive.microsoft.com/sts/v1.0

有关详细信息,请参考语音服务容器主机。 此 Helm 图表根据用户指定的解码(并发请求)数自动计算 CPU 和内存要求。 此外,它还会根据音频/文本输入优化是否配置为 enabled 来进行调整。 默认情况下,Helm 图表假设指定了两个并发请求并禁用了优化。

服务 CPU/容器 内存/容器
语音转文本 一个解码器至少需要 1,150 个毫核心。 如果已启用 optimizedForAudioFile,则需要 1,950 个毫核心。 (默认值:两个解码器) 必需:2 GB
限制:4 GB
文本转语音 一个并发请求至少需要 500 个毫核心。 如果已启用 optimizeForTurboMode,则需要 1,000 个毫核心。 (默认值:两个并发请求) 必需:1 GB
限制:2 GB

连接到 Kubernetes 群集

主机预期有一个可用的 Kubernetes 群集。 请参阅这篇有关部署 Kubernetes 群集的教程,对如何将 Kubernetes 群集部署到主机有一个概念性的了解。

配置用于部署的 Helm 图表值

访问 Microsoft Helm Hub,查看 Microsoft 提供的所有已公开的 Helm 图表。 从 Microsoft Helm Hub 中,可以看到“Azure AI 语音本地图表”。 “Azure AI 语音本地图表”是我们要安装的图表,但我们必须先创建一个包含显式配置的 config-values.yaml 文件。 首先,将 Microsoft 存储库添加到 Helm 实例。

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

接下来,配置 Helm 图表值。 将以下 YAML 复制并粘贴到名为 config-values.yaml 的文件。 有关自定义“Azure AI 语音本地 Helm 图表”的详细信息,请参阅自定义 Helm 图表。 请将 # {ENDPOINT_URI}# {API_KEY} 注释替换为自己的值。

# 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}

重要

如果未提供 billingapikey 值,服务将在 15 分钟后过期。 同样,由于服务不可用,验证将会失败。

Kubernetes 包(Helm 图表)

Helm 图表包含要从 mcr.microsoft.com 容器注册表提取的 Docker 映像的配置。

Helm 图表是描述一组相关 Kubernetes 资源的文件集合。 单个图表既可用于部署简单的资源(例如 Memcached Pod),也可用于部署复杂的资源(例如,包含 HTTP 服务器、数据库、缓存等的完整 Web 应用堆栈)。

提供的 Helm 图表将从 mcr.microsoft.com 容器注册表中提取语音服务(文本转语音和语音转文本服务)的 Docker 映像。

在 Kubernetes 群集上安装 Helm 图表

运行 helm install 命令安装 Helm 图表(请将 <config-values.yaml> 替换为相应的路径和文件名参数)。 microsoft/cognitive-services-speech-onpremise Helm 图表在 Microsoft Helm Hub 上提供。

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

下面是成功执行安装命令后预期会看到的示例输出:

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

Kubernetes 部署可能需要几分钟才能完成。 若要确认 Pod 和服务是否已正确部署且可用,请执行以下命令:

kubectl get all

预期会看到类似于以下输出的内容:

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

通过 Helm 测试验证 Helm 部署

安装的 Helm 图表定义了 Helm 测试以方便验证。 这些测试将验证服务就绪性。 为了验证语音转文本和文本转语音服务,我们将执行 Helm test 命令。

helm test onprem-speech

重要

如果 POD 状态不是 RunningAVAILABLE 列下未列出部署,则这些测试将会失败。 请耐心等待,此测试可能需要 10 分钟以上才能完成。

这些测试将输出各种状态结果:

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

如果不执行 Helm 测试,也可以通过 kubectl get all 命令收集外部 IP 地址和相应的端口。 使用该 IP 和端口打开 Web 浏览器,并导航到 http://<external-ip>:<port>:/swagger/index.html 以查看 API Swagger 页。

自定义 Helm 图表

Helm 图表是分层的。 分层结构可以实现图表继承,同时还与明确性的理念相符,使更具体的设置替代继承的规则。

语音(伞形图)

顶级“伞形”图中的值会替代相应的子图值。 因此,应在此处添加所有本地自定义值。

参数 描述 默认
speechToText.enabled 是否启用了语音转文本服务。 true
speechToText.verification.enabled 是否启用了语音转文本服务的 helm test 功能。 true
speechToText.verification.image.registry helm test 用于测试语音转文本服务的 docker 映像存储库。 Helm 在群集内创建单独的 Pod 用于测试,并从该注册表拉取 test-use 映像。 docker.io
speechToText.verification.image.repository helm test 用于测试语音转文本服务的 docker 映像存储库。 Helm 测试 Pod 使用此存储库拉取 test-use 映像。 antsu/on-prem-client
speechToText.verification.image.tag helm test 一起用于语音转文本服务的 docker 映像标记。 Helm 测试 Pod 使用此标记拉取 test-use 映像。 latest
speechToText.verification.image.pullByHash 是否通过哈希方法拉取 test-use docker 映像。 如果为 true,则 speechToText.verification.image.hash 应随有效的映像哈希值一起添加。 false
speechToText.verification.image.arguments 用于执行 test-use docker 映像的参数。 Helm test Pod 在运行 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 是否启用了文本转语音服务。 true
textToSpeech.verification.enabled 是否启用了语音转文本服务的 helm test 功能。 true
textToSpeech.verification.image.registry helm test 用于测试语音转文本服务的 docker 映像存储库。 Helm 在群集内创建单独的 Pod 用于测试,并从该注册表拉取 test-use 映像。 docker.io
textToSpeech.verification.image.repository helm test 用于测试语音转文本服务的 docker 映像存储库。 Helm 测试 Pod 使用此存储库拉取 test-use 映像。 antsu/on-prem-client
textToSpeech.verification.image.tag helm test 一起用于语音转文本服务的 docker 映像标记。 Helm 测试 Pod 使用此标记拉取 test-use 映像。 latest
textToSpeech.verification.image.pullByHash 是否通过哈希方法拉取 test-use docker 映像。 如果为 true,则 textToSpeech.verification.image.hash 应随有效的映像哈希值一起添加。 false
textToSpeech.verification.image.arguments 用于执行 test-use docker 映像的参数。 Helm 测试 Pod 在运行 helm test 时将这些参数传递给容器。 "./text-to-speech-client"
"--input='What's the weather like'"
"--host=$(TEXT_TO_SPEECH_HOST)"
"--port=$(TEXT_TO_SPEECH_PORT)"

语音转文本(子图表:图表/语音转文本)

若要替代“伞形”图,请在任何参数上添加前缀 speechToText.,以使其更具体。 例如,它将替代相应参数,例如,speechToText.numberOfConcurrentRequest 替代 numberOfConcurrentRequest

参数 描述 默认
enabled 是否启用了语音转文本服务。 false
numberOfConcurrentRequest 语音转文本服务的并发请求数。 此图表基于该值自动计算 CPU 和内存资源。 2
optimizeForAudioFile 服务是否需要针对通过音频文件输入的音频进行优化。 如果为 true,此图表将为服务分配更多的 CPU 资源。 false
image.registry 语音转文本 Docker 映像注册表。 containerpreview.azurecr.io
image.repository 语音转文本 Docker 映像存储库。 microsoft/cognitive-services-speech-to-text
image.tag 语音转文本 Docker 映像标记。 latest
image.pullSecrets 用于拉取语音转文本 Docker 映像的映像机密。
image.pullByHash 是否通过哈希方法拉取该 docker 映像。 如果为 true,则需要 image.hash false
image.hash 语音转文本 Docker 映像哈希。 仅当 image.pullByHash: true 时使用。
image.args.eula(必需) 指示已接受许可证。 唯一有效的值是 accept
image.args.billing(必需) 可以在 Azure 门户的“语音概述”页上获取计费终结点 URI 值。
image.args.apikey(必需) 用于跟踪账单信息。
service.type 语音转文本服务的 Kubernetes 服务类型。 请参阅 Kubernetes 服务类型说明了解详细信息并验证云服务提供商支持。 LoadBalancer
service.port 语音转文本服务的端口。 80
service.annotations 服务元数据的语音转文本批注。 批注是键值对。
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled 是否启用了水平 Pod 自动缩放程序。 如果为 true,则 speech-to-text-autoscaler 将部署在 Kubernetes 群集中。 true
service.podDisruption.enabled 是否启用了 Pod 中断预算。 如果为 true,则 speech-to-text-poddisruptionbudget 将部署在 Kubernetes 群集中。 true

情绪分析(子图表:图表/语音转文本)

从语音转文本容器 v2.2.0 和 Helm 图表 v0.2.0 开始,使用语言服务 API 将以下参数用于情绪分析。

参数 说明 默认
textanalytics.enabled 是否启用了文本分析服务 true/false false
textanalytics.image.registry 文本分析 Docker 映像注册表 有效的 Docker 映像注册表
textanalytics.image.repository 文本分析 Docker 映像存储库 有效的 Docker 映像存储库
textanalytics.image.tag 文本分析 Docker 映像标记 有效的 Docker 映像标记
textanalytics.image.pullSecrets 用于拉取文本分析 Docker 映像的映像机密 有效的机密名称
textanalytics.image.pullByHash 指定是否通过哈希方法拉取 Docker 映像。 如果为 yes,则还需要 image.hash。 如果为 no,则将其设置为“false”。 默认值为 false true/false false
textanalytics.image.hash 文本分析 Docker 映像哈希。 仅将它与 image.pullByHash:true 一起使用。 有效的 Docker 映像哈希
textanalytics.image.args.eula 文本分析容器所需的参数之一,用于指示已接受许可证。 此选项的值必须为:accept 如果要使用容器,则为 accept
textanalytics.image.args.billing 文本分析容器所需的参数之一,用于指定计费终结点 URI。 可以在 Azure 门户的“语音概述”页上获取计费终结点 URI 值。 有效的计费终结点 URI
textanalytics.image.args.apikey 文本分析容器所需的参数之一,用于跟踪计费信息。 有效的 apikey
textanalytics.cpuRequest 文本分析容器的请求 CPU int 3000m
textanalytics.cpuLimit 文本分析容器的有限 CPU 8000m
textanalytics.memoryRequest 文本分析容器的请求内存 3Gi
textanalytics.memoryLimit 文本分析容器的有限内存 8Gi
textanalytics.service.sentimentURISuffix 情绪分析 URI 后缀,整个 URI 的格式为“http://<service>:<port>/<sentimentURISuffix>”。 text/analytics/v3.0-preview/sentiment
textanalytics.service.type Kubernetes 中文本分析服务的类型。 请参阅 Kubernetes 服务类型 有效的 Kubernetes 服务类型 LoadBalancer
textanalytics.service.port 文本分析服务的端口 int 50085
textanalytics.service.annotations 用户可以添加到文本分析服务元数据的批注。 例如:
批注:
some/annotation1: value1
some/annotation2: value2
批注,每行一个批注
textanalytics.serivce.autoScaler.enabled 是否启用了水平 Pod 自动缩放程序。 如果已启用,则 text-analytics-autoscaler 将部署在 Kubernetes 群集中 true/false true
textanalytics.service.podDisruption.enabled 是否启用了 Pod 中断预算。 如果已启用,则 text-analytics-poddisruptionbudget 将部署在 Kubernetes 群集中 true/false true

文本转语音(子图:charts/textToSpeech)

若要替代“伞形”图,请在任何参数上添加前缀 textToSpeech.,以使其更具体。 例如,它将替代相应参数,例如,textToSpeech.numberOfConcurrentRequest 替代 numberOfConcurrentRequest

参数 描述 默认
enabled 是否启用了文本转语音服务。 false
numberOfConcurrentRequest 文本转语音服务的并发请求数。 此图表基于该值自动计算 CPU 和内存资源。 2
optimizeForTurboMode 服务是否需要针对通过文本文件输入的文本进行优化。 如果为 true,此图表将为服务分配更多的 CPU 资源。 false
image.registry 文本转语音 docker 映像注册表。 containerpreview.azurecr.io
image.repository 文本转语音 docker 映像存储库。 microsoft/cognitive-services-text-to-speech
image.tag 文本转语音 docker 映像标记。 latest
image.pullSecrets 用于拉取文本到语音 docker 映像的映像机密。
image.pullByHash 是否通过哈希方法拉取该 docker 映像。 如果为 true,则需要 image.hash false
image.hash 文本转语音 docker 映像哈希。 仅当 image.pullByHash: true 时使用。
image.args.eula(必需) 指示已接受许可证。 唯一有效的值是 accept
image.args.billing(必需) 可以在 Azure 门户的“语音概述”页上获取计费终结点 URI 值。
image.args.apikey(必需) 用于跟踪账单信息。
service.type 文本转语音服务的 Kubernetes 服务类型。 请参阅 Kubernetes 服务类型说明了解详细信息并验证云服务提供商支持。 LoadBalancer
service.port 文本转语音服务的端口。 80
service.annotations 服务元数据的文本转语音批注。 批注是键值对。
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled 是否启用了水平 Pod 自动缩放程序。 如果为 true,则 text-to-speech-autoscaler 将部署在 Kubernetes 群集中。 true
service.podDisruption.enabled 是否启用了 Pod 中断预算。 如果为 true,则 text-to-speech-poddisruptionbudget 将部署在 Kubernetes 群集中。 true

后续步骤

有关在 Azure Kubernetes 服务 (AKS) 中使用 Helm 安装应用程序的更多详细信息,请访问此页