Mengonfigurasi subtitel yang dibuat otomatis

Halaman ini menjelaskan cara menambahkan subtitel yang dibuat secara otomatis ke output menggunakan Transcoder API. Fitur ini memungkinkan Anda membuat subtitel dari trek audio, meskipun bahasanya tidak diketahui, dan menerjemahkan subtitel ke berbagai bahasa.

Anda mengonfigurasi fitur ini dengan memberikan metadata tambahan tentang aset input menggunakan kolom attributes dalam setiap item di array inputs dalam konfigurasi tugas. Kolom ini membantu Transcoder API memahami bahasa yang ada di trek audio Anda dan cara memprosesnya.

Sebelum memulai

Halaman ini mengasumsikan bahwa Anda telah menyelesaikan langkah-langkah di bagian Sebelum memulai.

Batasan

Fitur ini memiliki batasan sebagai berikut:

Lokasi yang didukung

Fitur ini didukung di us-central1 dan europe-west4.

Format output

Output untuk subtitel yang dibuat secara otomatis harus dalam format WebVTT (webvtt).

Mengedit penyambungan daftar

Fitur ini tidak mendukung penggunaan editList untuk menggabungkan beberapa klip video.

Contoh Konfigurasi

Contoh berikut menunjukkan cara mengonfigurasi subtitel otomatis untuk berbagai kasus penggunaan.

Pemetaan yang Disediakan Pengguna

Metode ini memberikan kontrol langsung dengan menentukan secara tepat jalur input mana yang akan digunakan untuk membuat subtitel.

Memetakan trek input secara eksplisit ke aliran subtitle output

Contoh ini menunjukkan cara menggunakan kolom mapping dalam setiap textStream untuk mengontrol secara tepat trek audio input mana yang digunakan untuk membuat subtitel dalam bahasa Inggris dan Prancis.

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

Aliran vtt-stream-english dihasilkan dari trek 1 input0 karena pemetaan eksplisit. Aliran vtt-stream-french dihasilkan dari trek 2 input0.

Pemetaan Default oleh Transcoder API

Contoh ini mengandalkan API untuk menyimpulkan trek audio mana yang akan digunakan berdasarkan attributes yang diberikan dalam inputs. Bagian konfigurasi lainnya (muxStreams, manifests, output) diasumsikan serupa dengan contoh lengkap.

Satu trek audio dengan bahasa yang diketahui

Jika video input Anda memiliki satu trek audio (misalnya, trek 1) dan Anda tahu bahwa trek tersebut dalam bahasa Inggris (en-US), Anda dapat membuat subtitel bahasa Inggris. Anda juga dapat meminta subtitel dalam bahasa lain, seperti Prancis (fr-FR), dan API akan menerjemahkan transkripsi bahasa Inggris.

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

Aliran subtitel bahasa Inggris (vtt-stream-english) dibuat langsung dari trek audio 1 yang ditentukan, karena kode bahasanya cocok. Aliran subtitel bahasa Prancis (vtt-stream-french) dibuat dengan terlebih dahulu mentranskripsikan audio bahasa Inggris dari trek 1, lalu menerjemahkan teks yang dihasilkan ke dalam bahasa Prancis.

Beberapa trek audio dengan bahasa yang diketahui

Jika file input Anda berisi beberapa trek audio dengan bahasa yang berbeda (misalnya, Prancis di trek 1, Inggris di trek 2), Anda dapat menentukan bahasa untuk setiap trek.

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

Dalam konfigurasi ini, subtitel vtt-stream-english dihasilkan dari trek audio 2, dan subtitel vtt-stream-french dihasilkan dari trek audio 1, berdasarkan kode bahasa yang diberikan di attributes.

Bahasa output tidak cocok dengan trek audio input mana pun

Jika bahasa subtitle yang diminta tidak cocok dengan bahasa trek yang ditentukan, API akan menggunakan trek audio pertama yang tersedia untuk transkripsi dan terjemahan.

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

Karena tidak ada trek audio Hindi yang ditentukan, subtitel vtt-stream-hindi dibuat dengan mentranskripsikan trek audio pertama (trek 1, Prancis), lalu menerjemahkan transkripsi tersebut ke dalam bahasa Hindi.

Satu trek audio dengan campuran bahasa

Jika satu trek audio berisi beberapa bahasa, cantumkan semuanya dalam 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"
      }
    }
  ]
}

Ketiga aliran VTT (Inggris, Prancis, dan Hindi) dibuat dari trek audio 1. API akan mentranskripsikan audio campuran bahasa dan menyediakan setiap aliran output dalam satu bahasa yang ditentukan oleh kolom languageCode.

API mentranskripsikan audio, yang berpotensi mendeteksi beberapa bahasa dalam trek 1. Untuk setiap output textStream, subtitle akan dibuat hanya dalam bahasa yang ditentukan oleh kolom languageCode di streaming tersebut.

Deteksi bahasa pada trek audio tertentu

Gunakan detectLanguages": true jika bahasa trek tertentu tidak diketahui.

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

API ini pertama-tama mendeteksi bahasa yang ada di trek audio 1. Kemudian, subtitel bahasa Inggris akan dibuat, termasuk terjemahan jika bahasa yang terdeteksi bukan bahasa Inggris.

Deteksi bahasa di trek audio default

Jika bahasa dan nomor trek tidak diketahui, API akan menggunakan trek audio pertama yang tersedia secara default.

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

API menganalisis trek audio pertama untuk mendeteksi bahasa, lalu membuat subtitel dalam bahasa Inggris, menerjemahkan jika perlu.

Menentukan bahasa untuk trek audio default

Jika Anda mengetahui bahasanya, tetapi tidak mengetahui nomor trek tertentu, API akan mengasumsikan bahwa trek audio pertama yang tersedia cocok dengan bahasa yang diberikan.

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

Subtitel bahasa Inggris (vtt-stream-english) dibuat dari trek audio pertama input, dengan asumsi bahwa trek ini dalam bahasa Inggris.

FAQ

Apa yang terjadi jika saya menentukan languages dan detectLanguages dalam trackDefinition yang sama?

Anda hanya dapat menentukan salah satu dari kolom languages atau kolom detectLanguages dalam satu trackDefinition. Menyediakan keduanya dalam definisi yang sama adalah konfigurasi yang tidak valid dan akan menghasilkan error.

Bagaimana cara API memilih trek audio yang akan digunakan jika beberapa trackDefinitions cocok dengan bahasa textStream?

Jika Anda memiliki beberapa trackDefinitions dalam array inputs.attributes.trackDefinitions yang berpotensi cocok dengan languageCode dari textStream yang diminta, API akan menggunakan trek audio dari trackDefinition yang cocok pertama dalam urutan array. Hal ini hanya berlaku jika Anda tidak menggunakan kolom mapping eksplisit dalam textStream.