設定自動產生的字幕

本頁說明如何使用 Transcoder API,在輸出內容中加入自動生成的字幕。這項功能可根據音軌生成字幕,即使不知道音軌語言也沒問題,還能將字幕翻譯成各種語言。

如要設定這項功能,請在工作設定的 inputs 陣列中,使用每個項目的 attributes 欄位提供輸入資產的其他中繼資料。這個欄位可協助 Transcoder API 瞭解音軌中的語言,以及如何處理這些語言。

事前準備

本頁假設您已完成「事前準備」中的步驟。

限制

這項功能含有以下限制:

支援的地區

這項功能支援 us-central1 和 europe-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 的預設對應

這些範例會根據 inputs 中提供的 attributes,透過 API 推斷要使用的音軌。設定的其他部分 (muxStreams、manifests、output) 應與完整範例類似。

單一音軌,且語言已知

如果輸入影片只有一個音軌 (例如音軌 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"
      }
    }
  ]
}

由於語言代碼相符,系統會直接從定義的音軌 1 生成英文字幕串流 (vtt-stream-english)。法文字幕串流 (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"
      }
    }
  ]
}

在這個設定中,系統會根據 attributes 中提供的語言代碼,從音軌 2 生成 vtt-stream-english 字幕,並從音軌 1 生成 vtt-stream-french 字幕。

輸出語言與任何輸入音軌不符

如果要求的字幕語言與任何已定義的音軌語言不符,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 字幕。

混合語言的單一音軌

如果單一音軌包含多種語言,請在 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"
      }
    }
  ]
}

這三種 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),並假設該音軌為英文。

常見問題

如果我在同一個 trackDefinition 中同時指定 languages 和 detectLanguages,會發生什麼情況?

在單一 trackDefinition 中,您只能指定 languages 欄位或 detectLanguages 欄位。在同一個定義中提供這兩者是無效的設定,會導致錯誤。

如果有多個 trackDefinitions 符合 textStream 的語言,API 會選擇使用哪個音軌?

如果 inputs.attributes.trackDefinitions 陣列中有多個 trackDefinitions 可能與所要求 textStream 的 languageCode 相符,API 會使用陣列順序中第一個相符 trackDefinition 的音軌。只有在 textStream 中未使用明確的 mapping 欄位時,才適用這項規則。