Automatisch generierte Untertitel konfigurieren

Auf dieser Seite wird beschrieben, wie Sie Ihrem Ausgabevideo mit der Transcoder API automatisch generierte Untertitel hinzufügen. Mit dieser Funktion können Sie Untertitel aus Audiotracks generieren, auch wenn die Sprache nicht bekannt ist, und Untertitel in verschiedene Sprachen übersetzen.

Sie konfigurieren diese Funktion, indem Sie zusätzliche Metadaten zu Ihren Eingabe-Assets über das Feld attributes in jedem Element des Arrays inputs in Ihrer Jobkonfiguration angeben. Dieses Feld hilft der Transcoder API, die in Ihren Audiotracks enthaltenen Sprachen zu erkennen und zu verarbeiten.

Hinweise

Auf dieser Seite wird davon ausgegangen, dass Sie die Schritte unter Vorbereitung ausgeführt haben.

Beschränkungen

Diese Funktion weist die folgenden Einschränkungen auf:

Unterstützte Standorte

Diese Funktion wird auf dem us-central1 und dem europe-west4 unterstützt.

Ausgabeformat

Die Ausgabe für automatisch generierte Untertitel muss im WebVTT-Format (webvtt) erfolgen.

Listenzusammenführung bearbeiten

Diese Funktion unterstützt nicht die Verwendung eines editList zum Zusammenfügen mehrerer Videoclips.

Konfigurationsbeispiele

Die folgenden Beispiele zeigen, wie Sie automatische Untertitel für verschiedene Anwendungsfälle konfigurieren.

Von Nutzern bereitgestellte Zuordnung

Mit dieser Methode können Sie direkt steuern, welcher Eingabetrack zum Generieren von Untertiteln verwendet wird.

Eingabetracks explizit Ausgabestream für Untertitel zuordnen

In diesem Beispiel wird gezeigt, wie Sie das Feld mapping in jedem textStream verwenden, um genau zu steuern, welcher Audio-Eingabetrack zum Generieren der englischen und französischen Untertitel verwendet wird.

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

Der Stream vtt-stream-english wird aufgrund der expliziten Zuordnung aus Track 1 von input0 generiert. Der vtt-stream-french-Stream wird aus Track 2 von input0 generiert.

Standardzuordnung durch die Transcoder API

In diesen Beispielen wird die API verwendet, um anhand der in inputs bereitgestellten attributes zu ermitteln, welcher Audiotrack verwendet werden soll. Die anderen Teile der Konfiguration (muxStreams, manifests, output) werden als ähnlich wie im vollständigen Beispiel angenommen.

Einzelner Audiotrack mit einer bekannten Sprache

Wenn Ihr Eingabevideo einen Audiotrack (z.B. Track 1) hat und Sie wissen, dass er auf Englisch (en-US) ist, können Sie englische Untertitel generieren. Sie können auch Untertitel in anderen Sprachen wie Französisch (fr-FR) anfordern. Die API übersetzt dann die englische Transkription.

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

Der englische Untertitelstream (vtt-stream-english) wird direkt aus dem definierten Audio-Track 1 generiert, da die Sprachcodes übereinstimmen. Der französische Untertitelstream (vtt-stream-french) wird erstellt, indem zuerst die englischen Audiodaten von Track 1 transkribiert und der resultierende Text dann ins Französische übersetzt wird.

Mehrere Audiotracks mit bekannten Sprachen

Wenn Ihre Eingabedatei mehrere Audiotracks mit verschiedenen Sprachen enthält (z.B. Wenn Sie beispielsweise Französisch auf Track 1 und Englisch auf Track 2 haben, können Sie die Sprachen für die einzelnen Tracks angeben.

{
  "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 dieser Konfiguration werden die vtt-stream-english-Untertitel aus Audiotrack 2 und die vtt-stream-french-Untertitel aus Audiotrack 1 generiert. Die Sprachcodes werden in attributes angegeben.

Die Ausgabesprache stimmt mit keinem Audio-Track der Eingabe überein.

Wenn die angeforderte Untertitelsprache keiner definierten Tracksprache entspricht, verwendet die API den ersten verfügbaren Audiotrack für die Transkription und Übersetzung.

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

Da kein Hindi-Audiotrack definiert ist, werden die vtt-stream-hindi-Untertitel durch Transkribieren des ersten Audiotracks (Track 1, Französisch) und anschließendes Übersetzen der Transkription ins Hindi generiert.

Einzelner Audiotrack mit gemischten Sprachen

Wenn ein einzelner Audiotrack mehrere Sprachen enthält, listen Sie alle im languages-Array auf.

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

Alle drei VTT-Streams (Englisch, Französisch und Hindi) werden aus Audio-Track 1 generiert. Die API transkribiert die Audioinhalte in mehreren Sprachen und stellt jeden Ausgabestream in der einzelnen Sprache bereit, die im Feld languageCode angegeben ist.

Die API transkribiert das Audio und erkennt dabei möglicherweise mehrere Sprachen auf Track 1. Für jede Ausgabe textStream werden Untertitel nur in der Sprache generiert, die im Feld languageCode des Streams angegeben ist.

Spracherkennung für einen bestimmten Audiotrack

Verwenden Sie detectLanguages": true, wenn die Sprache eines bestimmten Tracks unbekannt ist.

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

Die API erkennt zuerst die Sprache(n) in Audiotrack 1. Anschließend werden die englischen Untertitel generiert. Wenn die erkannte Sprache nicht Englisch ist, wird auch eine Übersetzung erstellt.

Spracherkennung auf dem Standard-Audio-Track

Wenn sowohl die Sprache als auch die Tracknummer unbekannt sind, wird in der API standardmäßig der erste verfügbare Audiotrack verwendet.

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

Die API analysiert den ersten Audiotrack, um die Sprache(n) zu erkennen, und generiert dann die englischen Untertitel. Bei Bedarf werden die Untertitel übersetzt.

Sprache für den Standard-Audio-Track angeben

Wenn Sie die Sprache, aber nicht die spezifische Tracknummer kennen, geht die API davon aus, dass der erste verfügbare Audiotrack der angegebenen Sprache entspricht.

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

Die englischen Untertitel (vtt-stream-english) werden aus dem ersten Audiotrack der Eingabe generiert, wobei davon ausgegangen wird, dass dieser Track auf Englisch ist.

FAQ

Was passiert, wenn ich sowohl languages als auch detectLanguages in derselben trackDefinition angebe?

Sie können in einem einzelnen trackDefinition nur entweder das Feld languages oder das Feld detectLanguages angeben. Wenn Sie beide in derselben Definition angeben, ist das eine ungültige Konfiguration und führt zu einem Fehler.

Wie wählt die API den zu verwendenden Audiotrack aus, wenn mehrere trackDefinitions der Sprache eines textStream entsprechen?

Wenn Sie mehrere trackDefinitions im inputs.attributes.trackDefinitions-Array haben, die möglicherweise mit dem languageCode eines angeforderten textStream übereinstimmen, verwendet die API den Audiotrack des ersten übereinstimmenden trackDefinition in der Arrayreihenfolge. Dies gilt nur, wenn Sie das explizite Feld mapping nicht in textStream verwenden.