Dataflow、Pub/Sub、Speech-to-Text API を使用して、メディア クリップにリアルタイムでキャプションを生成する

;

Dataflow パイプラインで Speech-to-Text API を使用して、音声または動画クリップのリアルタイム WebVTT キャプションを作成する方法について説明します。

このチュートリアルでは、Dataflow を使用したストリーミング Speech-to-Text API による自動変換 WebVTT のリファレンス実装で提供される Dataflow Flex テンプレートを使用して、リアルライムで WebVTT キャプションを作成する際のよくある課題を解決できます。これらの課題は次のとおりです。

  • キャプション作成時のレイテンシを最小限に抑える。
  • 各キャプションの開始時間と終了時間のオフセットを作成する。
  • 各キャプションの作成時間を指定する。

このチュートリアルはデベロッパーを対象としており、Dataflow パイプラインの基本知識があることを前提としています。

アーキテクチャ

このチュートリアルは、「Dataflow を使用したストリーミング Speech-to-Text API による自動変換 WebVTT」の GitHub でのリファレンス実装に基づいています。リファレンス実装は次のように機能します。

  1. メディア クリップが Cloud Storage バケットにアップロードされます。オブジェクトをバケットに追加すると、Pub/Sub トピックにメッセージが送信されます。
  2. Dataflow パイプラインには、その Pub/Sub トピックへのサブスクリプションがありますす。メッセージが到着すると、メディア クリップを取得して処理するようになります。
  3. パイプラインはメディア クリップを処理します。最初に Speech-to-Text API を呼び出して、メディア ファイルから音声の文字変換テキストを取得して、この文字変換テキストからキャプションを作成します。
  4. パイプラインはキャプションを WebVTT 形式で出力し、Pub/Sub トピックに公開します。

このリファレンス実装は、より小さなメディア ファイルに適しています。5 MB 以下のファイルを使用することをおすすめします。

次の図は、リファレンス実装のアーキテクチャを示しています。

メディアの音声文字変換ソリューションのアーキテクチャを示す図。

データ処理の設計上の決定

Dataflow パイプラインを実行する際には、リファレンス実装から Java コードを呼び出す、一般向けにホストされている Flex テンプレートを使用します。このコードは、Speech-to-Text API から返された結果からキャプションを作成します。このコードでの主な設計上の決定事項は次のとおりです。

  • このコードは、Speech-to-Text API の ストリーミング認識メソッドを使用してクリップを処理します。この方法では、最終結果に加えて中間結果も提供され、中間結果の品質は低いですがより早く得られます。リファレンス実装のコード結果は中間結果を処理し、クリップを受信してから字幕を生成するまでのレイテンシを短縮します。
  • 中間結果で返された音声文字変換テキストを処理するには、安定性の基準を満たす必要があります。中間結果の安定性は、完全な不安定性を示す 0.0 から、完全な安定性を示す 1.0 までの範囲です。安定性基準はデフォルトで 0.8 に設定されていますが、パイプラインの実行時に --stabilityThreshold パラメータを使用して変更できます。
  • 中間結果は完全に処理されないため、文字変換テキストには信頼度が低く重複するフレーズが含まれる場合があります。この形式については、StreamingRecognizeResponse の例をご覧ください。

    この処理のために、コードは単語数に基づいてキャプションに分割されます。これは --wordCount パラメータで指定します。次に、Apache Beam Timer API を使用して、各キャプションを以前のものと比較し、すでに表示されている単語をスキップします。このロジックを実装するコードを確認するには、@ProcessElement をご覧ください。

    --wordCount の値が小さいほど、コードによるキャプションの評価と評価が可能になり、パイプラインのパフォーマンスが向上します。--wordCount はデフォルトで 10 に設定されています。

  • 各キャプションの開始時間と終了時間のオフセットは、StreamingRecognitionResult オブジェクトの result_end_time フィールドを使用して作成されます。00:00 を起点として、コードは処理された各キャプションの result_end_time を追跡し、その結果を次のキャプションの開始時間として使用します。

目標

  • Cloud Storage バケット、Pub/Sub トピック、Cloud Storage 用の Pub/Sub 通知を作成してリンクします。これらのリソースをまとめて、処理のためにメディア ファイルをパイプラインにフィードするメカニズムを作成します。
  • メディア クリップを使用する Dataflow パイプラインを作成して実行し、Speech-to-Text API でテキストに変換して、それらのテキストから WebVTT 形式でキャプションを作成します。
  • WebVTT キャプションを Pub/Sub トピックに公開します。

料金

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Cloud Storage
  • Dataflow
  • Pub/Sub
  • Speech-to-Text API

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    [プロジェクトの選択] ページに移動

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Storage, Dataflow, Pub/Sub, and the Speech-to-Text API API を有効にします。

    API を有効にする

環境変数の設定

このチュートリアルで使用するプロジェクトとリージョンの環境変数を設定します。

  1. Cloud Shell をアクティブにする
  2. Cloud Shell で次のコマンドを実行して、プロジェクトとリージョンの環境変数を設定します。myProject は、このチュートリアルで使用するプロジェクトの ID に置き換えます。

    export PROJECT=myProject
    export REGION=us-central1
    

Cloud Storage バケットの作成

キャプション用のメディア ファイルを受け取るバケットを作成します。

Cloud Shell で、次のコマンドを実行してバケットを作成します。

export MEDIA_CLIPS_BUCKET=media_$PROJECT
gsutil mb gs://$MEDIA_CLIPS_BUCKET

Pub/Sub トピックとサブスクリプションの作成

2 つの Pub/Sub トピックと 2 つの Pub/Sub サブスクリプションを作成します。最初のトピックとサブスクリプションのペアは、メディア ファイルが処理可能であることを Dataflow パイプラインに通知するために使用されます。2 番目のトピックとサブスクリプションのペアは、Dataflow パイプラインからキャプション ファイルを出力するために使用されます。これにより、メディア ファイルと再統合できるようになります。

  1. Cloud Shell で次のコマンドを実行して、トピックとサブスクリプションを作成します。

    export MEDIA_TOPIC="media-clips"
    export MEDIA_SUBSCRIPTION="media-clips"
    export CAPTION_TOPIC="captions"
    export CAPTION_SUBSCRIPTION="captions"
    gcloud pubsub topics create $MEDIA_TOPIC
    gcloud pubsub subscriptions create $MEDIA_SUBSCRIPTION --topic=$MEDIA_TOPIC
    gcloud pubsub topics create $CAPTION_TOPIC
    gcloud pubsub subscriptions create $CAPTION_SUBSCRIPTION --topic=$CAPTION_TOPIC
    

Cloud Storage から Pub/Sub への通知の作成

メディア ファイルを Cloud Storage バケットにアップロードしたときに、media-clips トピックにメッセージを送信する通知を作成します。これにより、Dataflow ファイルがトリガーされ、メディア ファイルが処理されます。

Cloud Storage サービス アカウントのメールアドレスの取得

  1. Cloud Storage ブラウザを開く

  2. [設定] をクリックします。

  3. [プロジェクト アクセス] タブの [Cloud Storage サービス アカウント] セクションからサービス アカウントのメールアドレスをコピーします。

Cloud Storage サービス アカウントの権限の更新

  1. Pub/Sub トピックページを開く
  2. media-clips トピックのその他アイコン をクリックし、[権限を表示] をクリックします。
  3. [メンバーを追加] をクリックします。 表示されるペインで、次の操作を行います。
    1. [新しいメンバー] に Cloud Storage サービス アカウントのメールアドレスを貼り付けます。
    2. [ロールを選択] で、[Pub/Sub] を選択し、[Pub/Sub パブリッシャー] を選択します。
    3. [保存] をクリックします。

通知の作成

  1. Cloud Shell をアクティブにする
  2. Cloud Shell で次のコマンドを実行して、Pub/Sub 通知を作成します。

    gsutil notification create -t media-clips -f json gs://media_$PROJECT
    

Dataflow パイプラインを開始する

  1. Cloud Shell で次のコマンドを実行して、パイプラインを実行します。

    gcloud beta dataflow flex-template run "create-captions" \
    --project=$PROJECT \
    --region=us-central1 \
    --template-file-gcs-location=gs://dataflow-stt-audio-clips/dynamic_template_stt_analytics.json \
    --parameters=^~^streaming=true~enableStreamingEngine=true~numWorkers=1~maxNumWorkers=3~runner=DataflowRunner~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-standard-4~outputTopic=projects/$PROJECT/topics/$CAPTION_TOPIC~inputNotificationSubscription=projects/$PROJECT/subscriptions/$MEDIA_SUBSCRIPTION~wordCount=10
    
  2. Dataflow ジョブページを開きます

  3. create-captions パイプラインのステータスが [実行中] になるまで待ちます。これには数分かかることがあります。

パイプラインのテスト

音声ファイルを Cloud Storage バケットにコピーし、ファイルを処理するパイプラインをトリガーします。次に、captions サブスクリプションのメッセージを調べて出力されたキャプションを確認します。

  1. Cloud Shell をアクティブにする
  2. Cloud Shell で次のコマンドを実行して、音声ファイルをコピーします。

    gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
    
  3. Pub/Sub サブスクリプション ページを開く

  4. サブスクリプション リストの [キャプション] をクリックします。

  5. [メッセージを表示] をクリックします。

  6. [メッセージ] ペインで [pull] をクリックします。

  7. いずれかのメッセージで 展開アイコン をクリックすると、コンテンツが表示されます。次のような結果が表示されます。

    音声ファイルの音声文字変換を含むメッセージ

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトは削除せず、これらのリソースのみを削除します。

いずれにしても、今後これらのリソースについて料金が発生しないように、削除する必要があります。以降のセクションでは、このようなリソースを削除する方法を説明します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

コンポーネントの削除

プロジェクトを削除しない場合は、以下のセクションに従って、このチュートリアルの課金対象コンポーネントを削除してください。

Dataflow ジョブを停止する

  1. Dataflow ジョブページを開きます
  2. ジョブリストで、[create-captions] をクリックします。
  3. ジョブの詳細ページで、[停止] をクリックします。
  4. [キャンセル] を選択します。
  5. [ジョブを停止] をクリックします。

Cloud Storage バケットを削除する

  1. Cloud Storage ブラウザを開く
  2. media-<myProject> バケットと dataflow-staging-us-central1-<projectNumber> バケットのチェックボックスをオンにします。
  3. [削除] をクリックします。
  4. 上に重なったウィンドウで「DELETE」と入力し、[確認] をクリックします。

Pub/Sub トピックとサブスクリプションの削除

  1. Pub/Sub サブスクリプション ページを開きます
  2. media-clips サブスクリプションと captions サブスクリプションのチェックボックスをオンにします。
  3. [削除] をクリックします。
  4. 上に重なったウィンドウで、[削除] をクリックして、サブスクリプションとそのコンテンツの削除を確定します。
  5. [トピック] をクリックします。
  6. [media-clips] トピックと [captions] トピックのチェックボックスをオンにします。
  7. [削除] をクリックします。
  8. 上に重なったウィンドウで、「delete」と入力して [削除] をクリックします。

次のステップ