設定自動產生的字幕

本頁說明如何使用 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 的預設對應

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

單一音軌,且語言已知

如果輸入影片只有一個音軌 (例如音軌 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 中同時指定 languagesdetectLanguages,會發生什麼情況?

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

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

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