이 페이지에서는 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의 기본 매핑
이러한 예에서는 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
동일한 trackDefinition
에 languages
와 detectLanguages
를 모두 지정하면 어떻게 되나요?
단일 trackDefinition
내에서 languages
필드 또는 detectLanguages
필드 중 하나만 지정할 수 있습니다. 동일한 정의에 두 값을 모두 제공하면 잘못된 구성이므로 오류가 발생합니다.
여러 trackDefinitions
가 textStream
의 언어와 일치하는 경우 API는 사용할 오디오 트랙을 어떻게 선택하나요?
요청된 textStream
의 languageCode
와 일치할 수 있는 trackDefinitions
가 inputs.attributes.trackDefinitions
배열에 여러 개 있는 경우 API는 배열 순서에서 일치하는 trackDefinition
중 첫 번째 오디오 트랙을 사용합니다. 이는 textStream
내에서 명시적 mapping
필드를 사용하지 않는 경우에만 적용됩니다.