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.