Configurare i sottotitoli codificati generati automaticamente

Questa pagina spiega come aggiungere i sottotitoli codificati automaticamente all'output utilizzando l'API Transcoder. Questa funzionalità ti consente di generare sottotitoli codificati dalle tracce audio, anche se la lingua non è nota, e di tradurli in varie lingue.

Configura questa funzionalità fornendo metadati aggiuntivi sugli asset di input utilizzando il campo attributes all'interno di ogni elemento dell'array inputs nella configurazione del job. Questo campo aiuta l'API Transcoder a comprendere le lingue presenti nelle tracce audio e come elaborarle.

Prima di iniziare

Questa pagina presuppone che tu abbia completato i passaggi descritti in Prima di iniziare.

Limitazioni

Questa funzionalità presenta le seguenti limitazioni:

Località supportate

Questa funzionalità è supportata in us-central1 e europe-west4.

Formato di output

L'output per i sottotitoli generati automaticamente deve essere in formato WebVTT (webvtt).

Modificare l'unione degli elenchi

Questa funzionalità non supporta l'utilizzo di un editList per unire più clip video.

Esempi di configurazione

I seguenti esempi mostrano come configurare i sottotitoli codificati automatici per vari casi d'uso.

Mappatura fornita dall'utente

Questo metodo fornisce il controllo diretto specificando esattamente quale traccia di input utilizzare per generare i sottotitoli codificati.

Mappare esplicitamente le tracce di input ai flussi di sottotitoli codificati di output

Questo esempio mostra come utilizzare il campo mapping all'interno di ogni textStream per controllare con precisione quale traccia audio di input viene utilizzata per generare i sottotitoli in inglese e francese.

{
  "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/"
    }
  }
}

Lo stream vtt-stream-english viene generato dalla traccia 1 di input0 a causa del mapping esplicito. Il flusso vtt-stream-french viene generato dalla traccia 2 di input0.

Mapping predefinito per l'API Transcoder

Questi esempi si basano sull'API per dedurre quale traccia audio utilizzare in base a attributes fornito in inputs. Si presume che le altre parti della configurazione (muxStreams, manifests, output) siano simili all'esempio completo.

Una sola traccia audio con una lingua nota

Se il video di input ha una traccia audio (ad es. la traccia 1) e sai che è in inglese (en-US), puoi generare i sottotitoli codificati in inglese. Puoi anche richiedere i sottotitoli in altre lingue, ad esempio in francese (fr-FR), e l'API tradurrà la trascrizione in inglese.

{
  "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"
      }
    }
  ]
}

Lo stream dei sottotitoli in inglese (vtt-stream-english) viene generato direttamente dalla traccia audio 1 definita, poiché i codici lingua corrispondono. Il flusso di sottotitoli in francese (vtt-stream-french) viene prodotto trascrivendo prima l'audio in inglese della traccia 1 e poi traducendo il testo risultante in francese.

Più tracce audio con lingue note

Quando il file di input contiene più tracce audio in lingue diverse (ad es. francese sulla traccia 1, inglese sulla traccia 2), puoi specificare le lingue per ogni traccia.

{
  "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"
      }
    }
  ]
}

In questa configurazione, i sottotitoli codificati vtt-stream-english vengono generati dalla traccia audio 2 e i sottotitoli codificati vtt-stream-french vengono generati dalla traccia audio 1, in base ai codici di lingua forniti nel file attributes.

La lingua di output non corrisponde a nessuna traccia audio di input

Se la lingua dei sottotitoli codificati richiesta non corrisponde a nessuna lingua delle tracce definita, l'API utilizza la traccia audio disponibile per prima per la trascrizione e la traduzione.

{
  "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"
      }
    }
  ]
}

Poiché non è definita alcuna traccia audio in hindi, i sottotitoli codificati vtt-stream-hindi vengono generati trascrivendo la prima traccia audio (traccia 1, francese) e poi traducendo la trascrizione in hindi.

Singola traccia audio con lingue miste

Se una singola traccia audio contiene più lingue, elencale tutte nell'array 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"
      }
    }
  ]
}

Tutti e tre gli stream VTT (inglese, francese e hindi) vengono generati dalla traccia audio 1. L'API trascriverà l'audio in più lingue e fornirà ogni flusso di output nella singola lingua specificata dal campo languageCode.

L'API trascrive l'audio, rilevando potenzialmente più lingue nella traccia 1. Per ogni output textStream, genera sottotitoli codificati solo nella lingua specificata dal campo languageCode dello stream.

Rilevamento della lingua su una traccia audio specifica

Utilizza detectLanguages": true quando la lingua di una traccia specifica è sconosciuta.

{
  "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"
      }
    }
  ]
}

L'API rileva innanzitutto le lingue presenti nella traccia audio 1. Dopodiché, genera i sottotitoli in inglese, inclusa la traduzione se la lingua rilevata non è l'inglese.

Rilevamento della lingua sulla traccia audio predefinita

Se non sono noti né la lingua né il numero della traccia, l'API utilizza per impostazione predefinita la prima traccia audio disponibile.

{
  "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"
      }
    }
  ]
}

L'API analizza la prima traccia audio per rilevare le lingue e poi genera i sottotitoli codificati in inglese, traducendoli se necessario.

Specifica la lingua per la traccia audio predefinita

Se conosci la lingua, ma non il numero di traccia specifico, l'API presuppone che la prima traccia audio disponibile corrisponda alla lingua fornita.

{
  "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"
      }
    }
  ]
}

I sottotitoli in inglese (vtt-stream-english) vengono generati dalla prima traccia audio dell'input, partendo dal presupposto che sia in inglese.

Domande frequenti

Che cosa succede se specifico sia languages che detectLanguages nello stesso trackDefinition?

Puoi specificare solo uno dei campi languages o detectLanguages all'interno di un singolo trackDefinition. Fornire entrambi nella stessa definizione è una configurazione non valida e genererà un errore.

Come fa l'API a scegliere quale traccia audio utilizzare se più trackDefinitions corrispondono alla lingua di un textStream?

Se nell'array inputs.attributes.trackDefinitions sono presenti più trackDefinitions che potrebbero corrispondere a languageCode di un textStream richiesto, l'API utilizzerà la traccia audio del primo trackDefinition corrispondente nell'ordine dell'array. Questo vale solo quando non utilizzi il campo esplicito mapping all'interno di textStream.