你当前正在访问 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}
重要
如果未提供 billing
和 apikey
值,服务将在 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 状态不是 Running
或 AVAILABLE
列下未列出部署,则这些测试将会失败。 请耐心等待,此测试可能需要 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 安装应用程序的更多详细信息,请访问此页。