搭配 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}
重要
如果未提供 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
資料行底下,這些測試將會失敗。 請耐心等候,這可能需要十幾分鐘才能完成。
這些測試會輸出各種狀態結果:
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 安裝應用程式的詳細資訊,請瀏覽這裡。