Kubernetes および Helm と共に Speech サービス コンテナーを使用する

オンプレミスの音声コンテナーを管理するための 1 つの方法は、Kubernetes と Helm を使用することです。 Kubernetes と Helm を使って音声テキスト変換とテキスト読み上げのコンテナー イメージを定義し、Kubernetes パッケージを作成します。 このパッケージは、オンプレミスの Kubernetes クラスターにデプロイされます。 最後に、デプロイされたサービスをテストする方法と、さまざまな構成オプションについて調べます。 Kubernetes オーケストレーションを使用せずに、Docker コンテナーを実行する方法の詳細については、「Speech サービス コンテナーをインストールして実行する」を参照してください。

前提条件

オンプレミスの Speech コンテナーを使用する前の前提条件は次のとおりです。

必須 目的
Azure アカウント Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。
コンテナー レジストリのアクセス Kubernetes でクラスターに Docker イメージをプルするには、コンテナー レジストリにアクセスする必要があります。
Kubernetes CLI コンテナー レジストリからの共有資格情報を管理するには、Kubernetes CLI が必要です。 また、Kubernetes は、Kubernetes のパッケージ マネージャーである Helm の前に必要です。
Helm CLI Helm Chart (コンテナー パッケージ定義) のインストールに使用される Helm CLI をインストールします。
Speech リソース これらのコンテナーを使用するためには、以下が必要です。

関連付けられている課金キーと課金エンドポイント URI を取得するための Speech Azure リソース。 これらの値は、どちらも Azure portal の Speech の [概要] ページと [キー] ページで入手でき、コンテナーを起動するために必要です。

{API_KEY} : リソース キー

{ENDPOINT_URI} : エンドポイント URI の例: https://eastus.api.cognitive.microsoft.com/sts/v1.0

詳しくは、Speech サービスのコンテナー ホスト コンピューターに関する記事をご覧ください。 この "Helm チャート" では、ユーザーが指定しているデコードの数 (同時要求数) に基づいて、CPU とメモリの要件が自動的に計算されます。 さらに、オーディオ/テキスト入力の最適化が enabled として構成されているかどうかに基づいて調整されます。 Helm チャートの既定値では、同時要求の数は 2、最適化は無効です。

サービス CPU/コンテナー メモリ/コンテナー
音声テキスト変換 1 つのデコーダーで、1,150 ミリコア以上が必要です。 optimizedForAudioFile が有効になっている場合は、1,950 ミリコアが必要です。 (既定値: 2 つのデコーダー) 必須: 2 GB
上限: 4 GB
テキスト読み上げ 1 つの同時要求で、500 ミリコア以上が必要です。 optimizeForTurboMode が有効になっている場合は、1,000 ミリコアが必要です。 (既定値: 2 つの同時要求) 必須: 1 GB
上限: 2 GB

Kubernetes クラスターに接続する

ホスト コンピューターには使用可能な Kubernetes クラスターがあることが想定されます。 ホスト コンピューターへの Kubernetes クラスターの展開方法の概念を理解するには、Kubernetes クラスターの展開に関するこのチュートリアルをご覧ください。

展開に対する Helm チャートの値を構成する

Microsoft によって提供されているすべてのパブリックに使用可能な Helm チャートについては、Microsoft Helm Hub をご覧ください。 Microsoft Helm Hub で、Azure AI 音声オンプレミス グラフを探します。 Azure AI 音声オンプレミス グラフをインストールしますが、最初に明示的な構成で config-values.yaml ファイルを作成する必要があります。 最初に、Helm インスタンスに Microsoft リポジトリを追加しましょう。

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

次に、Helm グラフの値を構成します。 次の YAML をコピーし、config-values.yaml という名前のファイルに貼り付けます。 Azure AI 音声オンプレミス Helm chart のカスタマイズについて詳しくは、「Helm chart をカスタマイズする」をご覧ください。 # {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 リソースのセットが記述されているファイルのコレクションです。 1 つのチャートを使って、memcached ポッドのような単純なものや、HTTP サーバー、データベース、キャッシュなどを含む完全な Web アプリ スタックのような複雑なものを、展開できます。

提供されている "Helm Chart" では、テキスト読み上げサービスと音声テキスト変換サービス両方の音声サービスの Docker イメージが、mcr.microsoft.com コンテナー レジストリからプルされます。

Kubernetes クラスターに Helm チャートをインストールする

Helm グラフをインストールするには、helm install コマンドを実行し、<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 の展開が完了するには数分かかります。 ポッドとサービスの両方が適切に展開されて使用可能なことを確認するには、次のコマンドを実行します。

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

重要

ポッドの状態が 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 チャートは階層的です。 階層的であるためチャートを継承できます。また、特異性の概念に対応するので、継承された規則はいっそう固有の設定によってオーバーライドされます。

音声 (アンブレラ チャート)

最上位レベル「アンブレラ」チャートの値は、対応するサブチャートの値を上書きします。 そのため、オンプレミスでカスタマイズされたすべての値をここで追加する必要があります。

パラメーター 説明 Default
speechToText.enabled 音声テキスト変換サービスが有効かどうか。 true
speechToText.verification.enabled 音声テキスト変換サービス用の helm test 機能が有効かどうか。 true
speechToText.verification.image.registry helm test音声テキスト変換サービスをテストするために使用する Docker イメージ リポジトリ。 helm は、テストおよびこのレジストリから test-use イメージをプルするため、クラスター内に個別のポッドを作成します。 docker.io
speechToText.verification.image.repository helm test音声テキスト変換サービスをテストするために使用する Docker イメージ リポジトリ。 helm テスト ポッドは、test-use イメージをプルするため、このリポジトリを使用します。 antsu/on-prem-client
speechToText.verification.image.tag 音声テキスト変換サービスで helm test とともに使用される Docker イメージ タグ。 helm テスト ポッドは、test-use イメージをプルするため、このタグを使用します。 latest
speechToText.verification.image.pullByHash test-use Docker イメージをハッシュでプルするかどうか。 true の場合、speechToText.verification.image.hash を有効なイメージ ハッシュ値とともに追加する必要があります。 false
speechToText.verification.image.arguments test-use Docker イメージを実行するために使用される引数。 helm テスト ポッドは、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 は、テストおよびこのレジストリから test-use イメージをプルするため、クラスター内に個別のポッドを作成します。 docker.io
textToSpeech.verification.image.repository helm test音声テキスト変換サービスをテストするために使用する Docker イメージ リポジトリ。 helm テスト ポッドは、test-use イメージをプルするため、このリポジトリを使用します。 antsu/on-prem-client
textToSpeech.verification.image.tag 音声テキスト変換サービスで helm test とともに使用される Docker イメージ タグ。 helm テスト ポッドは、test-use イメージをプルするため、このタグを使用します。 latest
textToSpeech.verification.image.pullByHash test-use Docker イメージをハッシュでプルするかどうか。 true の場合、textToSpeech.verification.image.hash を有効なイメージ ハッシュ値とともに追加する必要があります。 false
textToSpeech.verification.image.arguments test-use Docker イメージを実行する引数。 helm テスト ポッドは、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.numberOfConcurrentRequestnumberOfConcurrentRequest を上書きするように、対応するパラメーターを上書きします。

パラメーター 説明 Default
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 portal の Speech の [概要] ページで入手できます。
image.args.apikey (必須) 課金情報の追跡に使用されます。
service.type 音声テキスト変換サービスの Kubernetes サービスの種類。 詳細およびクラウド プロバイダーのサポートの検証については、Kubernetes サービスの種類の手順に関する記事を参照してください。 LoadBalancer
service.port 音声テキスト変換サービスのポート。 80
service.annotations サービス メタデータに使用される音声変換の注釈。 注釈は、キーと値のペアになっています。
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled ポッドの水平オートスケーラーが有効かどうか。 true の場合、speech-to-text-autoscaler が Kubernetes クラスターにデプロイされます。 true
service.podDisruption.enabled ポッド中断バジェットが有効かどうか。 true の場合、speech-to-text-poddisruptionbudget が Kubernetes クラスターにデプロイされます。 true

センチメント分析 (サブチャート: charts/speechToText)

音声テキスト変換コンテナー v2.2.0 および Helm Chart v0.2.0 以降、Language service API を使用した感情分析には、次のパラメーターが使用されています。

パラメーター 説明 Default
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 テキスト分析コンテナーによって要求された引数の 1 つ。ライセンスに同意したことを示します。 このオプションの値は accept である必要があります。 コンテナーを使用する場合は、accept にします
textanalytics.image.args.billing テキスト分析コンテナーによって要求された引数の 1 つ。課金エンドポイント URI を指定します。 課金エンドポイント URI の値は、Azure portal の Speech の [概要] ページで入手できます。 有効な課金エンドポイント URI
textanalytics.image.args.apikey テキスト分析コンテナーによって要求される引数の 1 つ。課金情報を追跡するために使用されます。 有効な 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
注釈 (各行に 1 つ)
textanalytics.serivce.autoScaler.enabled ポッドの水平オートスケーラーが有効かどうか。 有効の場合、text-analytics-autoscaler が Kubernetes クラスターにデプロイされます true/false true
textanalytics.service.podDisruption.enabled ポッド中断バジェットが有効かどうか。 有効の場合、text-analytics-poddisruptionbudget が Kubernetes クラスターにデプロイされます true/false true

テキスト読み上げ (サブチャート: charts/textToSpeech)

「アンブレラ」チャートを上書きするには、任意のパラメーターに textToSpeech. プレフィックスを追加して限定します。 たとえば、textToSpeech.numberOfConcurrentRequestnumberOfConcurrentRequest を上書きするように、対応するパラメーターを上書きします。

パラメーター 説明 Default
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 portal の Speech の [概要] ページで入手できます。
image.args.apikey (必須) 課金情報の追跡に使用されます。
service.type テキスト読み上げサービスの Kubernetes サービスの種類。 詳細およびクラウド プロバイダーのサポートの検証については、Kubernetes サービスの種類の手順に関する記事を参照してください。 LoadBalancer
service.port テキスト読み上げサービスのポート。 80
service.annotations サービス メタデータに使用されるテキスト読み上げの注釈。 注釈は、キーと値のペアになっています。
annotations:
  some/annotation1: value1
  some/annotation2: value2
service.autoScaler.enabled ポッドの水平オートスケーラーが有効かどうか。 true の場合、text-to-speech-autoscaler が Kubernetes クラスターにデプロイされます。 true
service.podDisruption.enabled ポッド中断バジェットが有効かどうか。 true の場合、text-to-speech-poddisruptionbudget が Kubernetes クラスターにデプロイされます。 true

次のステップ

Azure Kubernetes Service (AKS) での Helm を使用したアプリケーションのインストールについて詳しくは、こちらをご覧ください