共用方式為


搭配 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 millicore。 如果已啟用 optimizedForAudioFile,則需要 1,950 millicore。 (預設值:兩個解碼器) 必要:2 GB
限制:4 GB
文字轉換語音 一個並行要求至少需要 500 millicore。 如果已啟用 optimizeForTurboMode,則需要 1,000 millicore。 (預設:兩個並行要求) 必要: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-onpremiseHelm 圖表可在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 資料行底下,這些測試將會失敗。 請耐心等候,這可能需要十幾分鐘才能完成。

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

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 和連接埠,開啟網頁瀏覽器並瀏覽至 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 測試 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)"

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

若要覆寫「傘狀」圖表,請在任何參數上新增前置詞 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 (必要) 計費端點 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,將會在 Kubernetes 叢集中部署 speech-to-text-autoscaler true
service.podDisruption.enabled 是否啟用 [Pod 中斷預算]。 若為 true,將會在 Kubernetes 叢集中部署 speech-to-text-poddisruptionbudget true

情感分析 (子圖表:charts/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 使用者可以新增至文字分析服務中繼資料的註釋。 例如:
annotations:
some/annotation1: value1
some/annotation2: value2
註釋,每一行各一個
textanalytics.serivce.autoScaler.enabled 是否啟用 [水平 Pod 自動調整程式]。 若已啟用,將會在 Kubernetes 叢集中部署 text-analytics-autoscaler true/false true
textanalytics.service.podDisruption.enabled 是否啟用 [Pod 中斷預算]。 若已啟用,將會在 Kubernetes 叢集中部署 text-analytics-poddisruptionbudget 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 (必要) 計費端點 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,將會在 Kubernetes 叢集中部署 text-to-speech-autoscaler true
service.podDisruption.enabled 是否啟用 [Pod 中斷預算]。 若為 true,將會在 Kubernetes 叢集中部署 text-to-speech-poddisruptionbudget true

下一步

如需在 Azure Kubernetes Service (AKS) 中使用 Helm 安裝應用程式的詳細資訊,請瀏覽這裡