自動生成された字幕を構成する

このページでは、Transcoder API を使用して、自動生成された字幕を出力に追加する方法について説明します。この機能を使用すると、言語が不明な場合でも音声トラックから字幕を生成し、さまざまな言語に翻訳できます。

この機能を構成するには、ジョブ構成の inputs 配列内の各アイテムの attributes フィールドを使用して、入力アセットに関する追加のメタデータを提供します。このフィールドは、Transcoder API が音声トラックに含まれる言語とその処理方法を理解するのに役立ちます。

始める前に

このページでは、始める前にの手順が完了していることを前提としています。

制限事項

この機能には次の制限があります。

サポートされているロケーション

この機能は us-central1europe-west4 でサポートされています。

出力形式

自動生成された字幕の出力は WebVTT(webvtt)形式にする必要があります。

リストのステッチを編集する

この機能では、editList を使用して複数の動画クリップを結合することはできません。

構成の例

次の例は、さまざまなユースケースで自動字幕を構成する方法を示しています。

ユーザー提供のマッピング

この方法では、字幕の生成に使用する入力トラックを正確に指定することで、直接制御できます。

入力トラックを出力字幕ストリームに明示的にマッピングする

この例では、各 textStream 内の mapping フィールドを使用して、英語とフランス語の字幕の生成に使用する入力音声トラックを正確に制御する方法を示します。

{
  "config": {
    "inputs": [
      {
        "key": "input0",
        "uri": "gs://input-bucket/input.mp4",
        "attributes": {
          "trackDefinitions": [
            {
              "inputTrack": 1,
              "languages": [
                "en-US"
              ]
            },
            {
              "inputTrack": 2,
              "languages": [
                "fr-FR"
              ]
            }
          ]
        }
      }
    ],
    "editList": [
      {
        "key": "atom0",
        "inputs": [
          "input0"
        ]
      }
    ],
    "elementaryStreams": [
      {
        "key": "video-stream0",
        "videoStream": {
          "h264": {
            "frameRate": 30,
            "widthPixels": 1280,
            "heightPixels": 720,
            "bitrateBps": 3200000,
            "frameRateConversionStrategy": "DOWNSAMPLE"
          }
        }
      },
      {
        "key": "audio-stream0",
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 64000,
          "sampleRateHertz": 48000,
          "channelCount": 2,
          "channelLayout": [
            "fl",
            "fr"
          ]
        }
      },
      {
        "key": "vtt-stream-english",
        "textStream": {
          "codec": "webvtt",
          "languageCode": "en-US",
          "displayName": "English",
          "mapping": [
            {
              "atomKey": "atom0",
              "inputKey": "input0",
              "inputTrack": 1
            }
          ]
        }
      },
      {
        "key": "vtt-stream-french",
        "textStream": {
          "codec": "webvtt",
          "languageCode": "fr-FR",
          "displayName": "French",
          "mapping": [
            {
              "atomKey": "atom0",
              "inputKey": "input0",
              "inputTrack": 2
            }
          ]
        }
      }
    ],
    "muxStreams": [
      {
        "container": "fmp4",
        "elementaryStreams": [
          "video-stream0"
        ],
        "fileName": "video-only.m4s",
        "key": "hd-video-only",
        "segmentSettings": {
          "segmentDuration": "6s"
        }
      },
      {
        "container": "fmp4",
        "elementaryStreams": [
          "audio-stream0"
        ],
        "fileName": "audio-only.m4s",
        "key": "audio-only",
        "segmentSettings": {
          "segmentDuration": "6s"
        }
      },
      {
        "key": "text-vtt-english",
        "container": "vtt",
        "elementaryStreams": [
          "vtt-stream-english"
        ],
        "segmentSettings": {
          "individualSegments": true,
          "segmentDuration": "6s"
        }
      },
      {
        "key": "text-vtt-french",
        "container": "vtt",
        "elementaryStreams": [
          "vtt-stream-french"
        ],
        "segmentSettings": {
          "individualSegments": true,
          "segmentDuration": "6s"
        }
      }
    ],
    "manifests": [
      {
        "fileName": "manifest.m3u8",
        "muxStreams": [
          "hd-video-only",
          "audio-only",
          "text-vtt-english",
          "text-vtt-french"
        ],
        "type": "HLS"
      }
    ],
    "output": {
      "uri": "gs://your-bucket/output/"
    }
  }
}

明示的なマッピングにより、vtt-stream-english ストリームは input0 のトラック 1 から生成されます。vtt-stream-french ストリームは input0 のトラック 2 から生成されます。

Transcoder API によるデフォルトのマッピング

これらの例では、API を使用して、inputs で提供される attributes に基づいて使用する音声トラックを推測します。構成の他の部分(muxStreamsmanifestsoutput)は、完全な例と同様であると想定されます。

言語がわかっている単一の音声トラック

入力動画に 1 つの音声トラック(トラック 1 など)があり、それが英語(en-US)であることがわかっている場合は、英語の字幕を生成できます。フランス語(fr-FR)などの他の言語の字幕をリクエストすることもできます。API は英語の文字起こしを翻訳します。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "inputTrack": 1,
            "languages": [
              "en-US"
            ]
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    },
    {
      "key": "vtt-stream-french",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "fr-FR",
        "displayName": "French"
      }
    }
  ]
}

言語コードが一致するため、英語の字幕ストリーム(vtt-stream-english)は定義されたオーディオ トラック 1 から直接生成されます。フランス語字幕ストリーム(vtt-stream-french)は、まずトラック 1 の英語音声を文字起こしし、その結果のテキストをフランス語に翻訳することで生成されます。

言語がわかっている複数の音声トラック

入力ファイルに異なる言語の複数の音声トラック(英語と日本語など)が含まれている場合は、トラック 1 にフランス語、トラック 2 に英語など)、各トラックの言語を指定できます。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "inputTrack": 1,
            "languages": ["fr-FR"]
          },
          {
            "inputTrack": 2,
            "languages": ["en-US"]
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    },
    {
      "key": "vtt-stream-french",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "fr-FR",
        "displayName": "French"
      }
    }
  ]
}

この構成では、vtt-stream-english 字幕は音声トラック 2 から生成され、vtt-stream-french 字幕は attributes で指定された言語コードに基づいて音声トラック 1 から生成されます。

出力言語が入力音声トラックと一致しない

リクエストされた字幕言語が定義されたトラック言語と一致しない場合、API は最初に使用可能な音声トラックを文字起こしと翻訳に使用します。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "inputTrack": 1,
            "languages": ["fr-FR"]
          },
          {
            "inputTrack": 2,
            "languages": ["en-US"]
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-hindi",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "hi-IN",
        "displayName": "Hindi"
      }
    }
  ]
}

ヒンディー語の音声トラックが定義されていないため、最初の音声トラック(トラック 1、フランス語)を文字起こしし、その文字起こしをヒンディー語に翻訳することで、vtt-stream-hindi 字幕が生成されます。

複数の言語が混在する単一の音声トラック

1 つの音声トラックに複数の言語が含まれている場合は、それらすべてを languages 配列にリストします。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "inputTrack": 1,
            "languages": ["en-US", "fr-FR"]
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    },
    {
      "key": "vtt-stream-french",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "fr-FR",
        "displayName": "French"
      }
    },
    {
      "key": "vtt-stream-hindi",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "hi-IN",
        "displayName": "Hindi"
      }
    }
  ]
}

3 つの VTT ストリーム(英語、フランス語、ヒンディー語)はすべて、音声トラック 1 から生成されます。API は、多言語の音声を文字に変換し、languageCode フィールドで指定された単一の言語で各出力ストリームを提供します。

API は音声を文字起こしし、トラック 1 内で複数の言語を検出する可能性があります。出力 textStream ごとに、そのストリームの languageCode フィールドで指定された言語の字幕のみを生成します。

特定の音声トラックの言語検出

特定のトラックの言語が不明な場合は、detectLanguages": true を使用します。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "inputTrack": 1,
            "detectLanguages": true
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    }
  ]
}

API はまず、音声トラック 1 に含まれる言語を検出します。次に、検出された言語が英語でない場合は翻訳を含め、英語の字幕を生成します。

デフォルトの音声トラックの言語検出

言語とトラック番号の両方が不明な場合、API はデフォルトで最初に使用可能な音声トラックを使用します。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "detectLanguages": true
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    }
  ]
}

API は最初のアオディオ トラックを分析して言語を検出し、必要に応じて翻訳して英語の字幕を生成します。

デフォルトの音声トラックの言語を指定する

言語はわかっているが、特定のトラック番号がわからない場合、API は、使用可能な最初の音声トラックが指定された言語と一致すると想定します。

{
  "inputs": [
    {
      "key": "input0",
      "uri": "gs://input-bucket/input.mp4",
      "attributes": {
        "trackDefinitions": [
          {
            "languages": ["en-US"]
          }
        ]
      }
    }
  ],
  "elementaryStreams": [
    { "key": "video-stream0", "videoStream": { ... } },
    { "key": "audio-stream0", "audioStream": { ... } },
    {
      "key": "vtt-stream-english",
      "textStream": {
        "codec": "webvtt",
        "languageCode": "en-US",
        "displayName": "English"
      }
    }
  ]
}

英語の字幕(vtt-stream-english)は、入力の最初の音声トラックが英語であるという前提で、このトラックから生成されます。

よくある質問

同じ trackDefinitionlanguagesdetectLanguages の両方を指定するとどうなりますか?

1 つの trackDefinition 内で指定できるのは、languages フィールドまたは detectLanguages フィールドのいずれか 1 つのみです。同じ定義で両方を指定すると、構成が無効になり、エラーが発生します。

複数の trackDefinitionstextStream の言語と一致する場合、API はどの音声トラックを使用するかをどのように選択しますか?

リクエストされた textStreamlanguageCode に一致する可能性がある trackDefinitionsinputs.attributes.trackDefinitions 配列に複数ある場合、API は配列順で最初に一致する trackDefinition の音声トラックを使用します。これは、textStream 内で明示的な mapping フィールドを使用していない場合にのみ適用されます。