Configure legendas geradas automaticamente

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.