자동 생성 자막 구성

이 페이지에서는 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에 따라 사용할 오디오 트랙을 추론합니다. 구성의 다른 부분 (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"
      }
    }
  ]
}

언어 코드가 일치하므로 영어 자막 스트림 (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"
      }
    }
  ]
}

힌디어 오디오 트랙이 정의되어 있지 않으므로 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"
      }
    }
  ]
}

세 가지 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)은 이 트랙이 영어로 되어 있다고 가정하고 입력의 첫 번째 오디오 트랙에서 생성됩니다.

FAQ

동일한 trackDefinitionlanguagesdetectLanguages를 모두 지정하면 어떻게 되나요?

단일 trackDefinition 내에서 languages 필드 또는 detectLanguages 필드 중 하나만 지정할 수 있습니다. 동일한 정의에 두 값을 모두 제공하면 잘못된 구성이므로 오류가 발생합니다.

여러 trackDefinitionstextStream의 언어와 일치하는 경우 API는 사용할 오디오 트랙을 어떻게 선택하나요?

요청된 textStreamlanguageCode와 일치할 수 있는 trackDefinitionsinputs.attributes.trackDefinitions 배열에 여러 개 있는 경우 API는 배열 순서에서 일치하는 trackDefinition첫 번째 오디오 트랙을 사용합니다. 이는 textStream 내에서 명시적 mapping 필드를 사용하지 않는 경우에만 적용됩니다.