搭配 Kubernetes 和 Helm 使用語音服務容器

管理內部部署語音容器的其中一個選項是使用 Kubernetes 和 Helm。 我們使用 Kubernetes 和 Helm 來定義語音轉換文字和文字到語音容器映像,我們會建立 Kubernetes 套件。 此套件會部署至內部部署的 Kubernetes 叢集。 最後,我們會探索如何測試已部署的服務和各種組態選項。 如需在沒有 Kubernetes 協調流程的情況下執行 Docker 容器的詳細資訊,請參閱 安裝和執行語音服務容器

必要條件

在內部部署使用語音容器之前,下列必要條件:

必要 目的
Azure 帳戶 如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶
Container Registry 存取 為了讓 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 測試 命令。

helm test onprem-speech

重要

如果 POD 狀態不是 Running ,或部署未列在 AVAILABLE 數據行底下,這些測試將會失敗。 耐心,因為這可能需要十分鐘的時間才能完成。

這些測試會輸出各種狀態結果:

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 測試的替代方案,您可以從 命令收集 外部 IP 位址和對應的埠 kubectl get all 。 使用IP和埠,開啟網頁瀏覽器並流覽至 以 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,以進行測試,並從此登錄提取 測試使用 映像。 docker.io
speechToText.verification.image.repository helm test 用來測試語音轉換文字服務的 Docker 映像存放庫。 Helm 測試 Pod 會使用此存放庫來提取 測試使用 映像。 antsu/on-prem-client
speechToText.verification.image.tag 搭配 helm test 使用的 Docker 映像標籤,用於語音轉換文字服務。 Helm 測試 Pod 會使用此標記來提取 測試使用 映像。 latest
speechToText.verification.image.pullByHash 測試使用 Docker 映像是否由哈希提取。 如果 true為 , speechToText.verification.image.hash 則應該加入有效的影像哈希值。 false
speechToText.verification.image.arguments 用來執行test-use docker 映像的自變數。 Helm 測試 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,以進行測試,並從此登錄提取 測試使用 映像。 docker.io
textToSpeech.verification.image.repository helm test 用來測試語音轉換文字服務的 Docker 映像存放庫。 Helm 測試 Pod 會使用此存放庫來提取 測試使用 映像。 antsu/on-prem-client
textToSpeech.verification.image.tag 搭配 helm test 使用的 Docker 映像標籤,用於語音轉換文字服務。 Helm 測試 Pod 會使用此標記來提取 測試使用 映像。 latest
textToSpeech.verification.image.pullByHash 測試使用 Docker 映像是否由哈希提取。 如果 true為 , textToSpeech.verification.image.hash 則應該加入有效的影像哈希值。 false
textToSpeech.verification.image.arguments 要搭配test-use docker 映像執行的自變數。 執行 時 helm test,helm 測試 Pod 會將這些自變數傳遞至容器。 "./text-to-speech-client"
"--input='What's the weather like'"
"--host=$(TEXT_TO_SPEECH_HOST)"
"--port=$(TEXT_TO_SPEECH_PORT)"

語音轉換文字 (子圖表:charts/speechToText)

若要覆寫 「umbrella」 圖表,請在任何參數上新增前置詞 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 映像是否由哈希提取。 如果需要 trueimage.hash 則為 。 false
image.hash 語音轉換文字 Docker 映像雜湊。 只有在 時 image.pullByHash: true才會使用。
image.args.eula (必要) 表示您已接受授權。 唯一有效的值為 accept
image.args.billing (必要) 帳單端點 URI 值可在 Azure 入口網站 的 [語音概觀] 頁面上取得。
image.args.apikey (必要) 用來追蹤帳單資訊。
service.type 語音轉換文字服務的 Kube 服務類型。 如需詳細資訊並確認雲端提供者支援,請參閱 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

情感分析 (子圖表:chart/speechToText)

從 2.2.0 版語音轉換文字容器和 0.2.0 版 Helm 圖表開始,下列參數用於使用語言服務 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。 帳單端點 URI 值可在 Azure 入口網站 的 [語音概觀] 頁面上取得。 有效的計費端點 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)

若要覆寫 「umbrella」 圖表,請在任何參數上新增前置詞 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 映像是否由哈希提取。 如果需要 trueimage.hash 則為 。 false
image.hash 文字轉換語音 Docker 映像雜湊。 只有在 時 image.pullByHash: true才會使用。
image.args.eula (必要) 表示您已接受授權。 唯一有效的值為 accept
image.args.billing (必要) 帳單端點 URI 值可在 Azure 入口網站 的 [語音概觀] 頁面上取得。
image.args.apikey (必要) 用來追蹤帳單資訊。
service.type 文字轉換語音服務的 Kube 服務類型。 如需詳細資訊並確認雲端提供者支援,請參閱 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 Service 中使用 Helm 安裝應用程式的詳細資訊, 請造訪這裡