Esta página explica como adicionar legendas geradas automaticamente à saída através da Transcoder API. Esta funcionalidade permite-lhe gerar legendas a partir de faixas de áudio, mesmo que o idioma não seja conhecido, e traduzir legendas para vários idiomas.
Configura esta funcionalidade fornecendo metadados adicionais sobre os seus recursos de entrada através do campo attributes
em cada item da matriz inputs
na configuração da tarefa. Este campo ajuda a API Transcoder a compreender os idiomas presentes nas suas faixas de áudio e como processá-los.
Antes de começar
Esta página pressupõe que concluiu os passos em Antes de começar.
Limitações
Esta funcionalidade tem as seguintes limitações:
Localizações suportadas
Esta funcionalidade é suportada em us-central1
e europe-west4
.
Formato de saída
A saída das legendas geradas automaticamente tem de estar no formato WebVTT (webvtt
).
Edite a união de listas
Esta funcionalidade não suporta a utilização de um editList
para unir vários clipes de vídeo.
Exemplos de configuração
Os exemplos seguintes demonstram como configurar legendas automáticas para vários exemplos de utilização.
Mapeamento fornecido pelos utilizadores
Este método oferece controlo direto, especificando exatamente que faixa de entrada usar para gerar legendas.
Mapeie explicitamente as faixas de entrada para os streams de legendas de saída
Este exemplo mostra como usar o campo mapping
em cada textStream
para controlar com precisão que faixa de áudio de entrada é usada para gerar as legendas em inglês e francês.
{
"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/"
}
}
}
A stream vtt-stream-english
é gerada a partir da faixa 1 de input0
devido ao mapeamento explícito. A stream vtt-stream-french
é gerada a partir da faixa 2 de input0
.
Mapeamento predefinido pela API Transcoder
Estes exemplos baseiam-se na API para inferir que faixa de áudio usar com base no attributes
fornecido no inputs
. As outras partes da configuração (muxStreams
, manifests
, output
) são consideradas semelhantes ao exemplo completo.
Faixa de áudio única com um idioma conhecido
Se o vídeo de entrada tiver uma faixa de áudio (por exemplo, a faixa 1) e souber que está em inglês (en-US
), pode gerar legendas em inglês. Também pode pedir legendas noutros idiomas, como francês (fr-FR
), e a API traduz a transcrição em inglês.
{
"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"
}
}
]
}
A stream de legendas em inglês (vtt-stream-english
) é gerada diretamente a partir da faixa de áudio 1 definida, uma vez que os códigos de idioma correspondem. A stream de legendas em francês (vtt-stream-french
) é produzida primeiro transcrevendo o áudio em inglês da faixa 1 e, em seguida, traduzindo o texto resultante para francês.
Várias faixas de áudio com idiomas conhecidos
Quando o ficheiro de entrada contém várias faixas de áudio com idiomas diferentes (por exemplo, Francês na faixa 1 e inglês na faixa 2), pode especificar os idiomas de cada faixa.
{
"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"
}
}
]
}
Nesta configuração, as legendas vtt-stream-english
são geradas a partir da faixa de áudio 2 e as legendas vtt-stream-french
são geradas a partir da faixa de áudio 1, com base nos códigos de idioma fornecidos no elemento attributes
.
O idioma de saída não corresponde a nenhuma faixa de áudio de entrada
Se o idioma das legendas pedido não corresponder a nenhum dos idiomas das faixas definidos, a API usa a faixa de áudio primeira disponível para a transcrição e a tradução.
{
"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"
}
}
]
}
Uma vez que não está definida nenhuma faixa de áudio em hindi, as legendas vtt-stream-hindi
são geradas transcrevendo a primeira faixa de áudio (faixa 1, francês) e, em seguida, traduzindo a transcrição para hindi.
Faixa de áudio única com vários idiomas
Se uma única faixa de áudio contiver vários idiomas, liste-os todos na matriz 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"
}
}
]
}
Todas as três streams VTT (inglês, francês e hindi) são geradas a partir da faixa de áudio 1. A API transcreve o áudio em vários idiomas e fornece cada stream de saída no idioma único especificado pelo campo languageCode
.
A API transcreve o áudio, detetando potencialmente vários idiomas na faixa 1. Para cada saída textStream
, gera legendas apenas no idioma especificado pelo campo languageCode
desse stream.
Deteção de idioma numa faixa de áudio específica
Use detectLanguages": true
quando o idioma de uma faixa específica for desconhecido.
{
"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"
}
}
]
}
Primeiro, a API deteta os idiomas presentes na faixa de áudio 1. Em seguida, gera as legendas em inglês, incluindo a tradução se o idioma detetado não for o inglês.
Deteção de idioma na faixa de áudio predefinida
Se o idioma e o número da faixa forem desconhecidos, a API usa por predefinição a primeira faixa de áudio disponível.
{
"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"
}
}
]
}
A API analisa a primeira faixa de áudio para detetar os idiomas e, em seguida, gera as legendas em inglês, traduzindo-as, se necessário.
Especifique o idioma da faixa de áudio predefinida
Se souber o idioma, mas não o número da faixa específico, a API assume que a primeira faixa de áudio disponível corresponde ao idioma indicado.
{
"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"
}
}
]
}
As legendas em inglês (vtt-stream-english
) são geradas a partir da primeira faixa de áudio da entrada, partindo do princípio de que esta faixa está em inglês.
Perguntas frequentes
O que acontece se especificar languages
e detectLanguages
no mesmo trackDefinition
?
Só pode especificar um dos campos languages
ou detectLanguages
num único trackDefinition
. Fornecer ambos na mesma definição é uma configuração inválida e resulta num erro.
Como é que a API escolhe a faixa de áudio a usar se várias trackDefinitions
corresponderem ao idioma de uma textStream
?
Se tiver vários trackDefinitions
na matriz inputs.attributes.trackDefinitions
que possam corresponder ao languageCode
de um textStream
pedido, a API usa a faixa de áudio do primeiro trackDefinition
correspondente na ordem da matriz. Isto aplica-se apenas quando não está a usar o campo mapping
explícito no textStream
.