Compreensão de Vídeos Potencializada: TwelveLabs Marengo no Amazon Bedrock

Desafios na Compreensão de Conteúdo Audiovisual

Conteúdo de mídia, entretenimento, publicidade, educação e treinamento corporativo combinam elementos visuais, sonoros e de movimento para contar histórias e transmitir informações. Essa complexidade multidimensional supera em muito a simplicidade do texto, onde palavras individuais possuem significados bem definidos. Para sistemas de IA, essa riqueza de informação representa um desafio considerável.

Um vídeo típico integra diversos elementos simultaneamente: componentes visuais como cenas, objetos e ações; dinâmica temporal expressa através de movimento e transições; elementos de áudio incluindo diálogos, música e efeitos sonoros; além de textos sobrepostos como legendas e capturas. Essa multiplicidade de camadas de informação cria desafios significativos para organizações que precisam buscar em arquivos de vídeo, localizar cenas específicas, categorizar automaticamente e extrair insights de seus ativos de mídia para tomada de decisão efetiva.

Abordagem Multimodal com Embeddings Especializados

A solução apresentada pela AWS com o TwelveLabs Marengo utiliza uma arquitetura de múltiplos vetores para criar representações especializadas de diferentes modalidades de conteúdo. Em vez de comprimir toda a informação em um único vetor — abordagem que resulta em perda considerável de nuances — o modelo gera embeddings distintos para cada aspecto do vídeo.

Embeddings são representações vetoriais densas que capturam significado semântico em um espaço de alta dimensionalidade. Funcionam como impressões digitais numéricas que codificam a essência do conteúdo de forma compreensível e comparável por máquinas. Para texto, um embedding pode capturar que “rei” e “rainha” são conceitos relacionados; para imagens, pode compreender que um retriever dourado e um labrador são ambos cães, apesar de aparências diferentes.

A arquitetura multivetor do Marengo 3.0 oferece vantagens significativas: cada vetor captura uma modalidade específica, evitando perda de informação; permite buscas flexíveis direcionadas a aspectos particulares do conteúdo — somente visual, apenas áudio ou combinadas; e proporciona precisão superior em cenários complexos enquanto mantém escalabilidade eficiente para grandes volumes de dados videoconteúdo em empresas.

Integração com Amazon Bedrock e OpenSearch Serverless

A AWS expandiu as capacidades do Amazon Bedrock para suportar o modelo TwelveLabs Marengo Embed 3.0 com processamento de texto e imagem em tempo real através de inferência síncrona. Essa integração possibilita que negócios implementem funcionalidade de busca em vídeos mais rápida utilizando consultas em linguagem natural, além de viabilizar descoberta interativa de produtos através de sofisticado matching de similaridade de imagens.

Para armazenar e recuperar embeddings, a solução utiliza Amazon OpenSearch Serverless como banco de dados vetorial. Como banco de dados específico para vetores, o OpenSearch Serverless permite localizar conteúdo similar rapidamente através de busca semântica, sem necessidade de gerenciar servidores ou infraestrutura subjacente.

O código completo de exemplo está disponível em repositório GitHub, demonstrando como integrar essas tecnologias em uma aplicação prática.

Como Funciona a Geração de Embeddings de Vídeo

O Amazon Bedrock utiliza API assíncrona para geração de embeddings de vídeo com o modelo Marengo. Um vídeo típico é processado para gerar múltiplas representações vetoriais especializadas:

  • Embeddings Visuais: capturam elementos visuais do conteúdo
  • Embeddings de Transcrição: representam texto transcrito do áudio
  • Embeddings de Áudio: codificam características sonoras do vídeo

Por padrão, um único processamento com o Marengo gera embeddings para visual-texto, visual-imagem e áudio. É possível configurar para gerar apenas tipos específicos de embedding conforme necessário.

O processamento segmenta automaticamente o vídeo em clips. Para vídeo, a divisão ocorre em mudanças naturais de cena (shot boundaries). Para áudio, os segmentos são divididos em durações próximas a 10 segundos — por exemplo, áudio de 50 segundos resulta em 5 segmentos de 10 segundos cada.

Preparando o Ambiente

Antes de começar a implementação, é necessário verificar alguns pré-requisitos:

Para demonstração prática, a solução utiliza Netflix Open Content, conteúdo de código aberto disponível sob licença Creative Commons Attribution 4.0 International. Especificamente, um vídeo chamado Meridian é usado para demonstrar o funcionamento do modelo.

Criando Embeddings de Vídeo

O seguinte fragmento de código Python mostra um exemplo de invocação da API que processa um vídeo armazenado em um bucket S3:

bedrock_client = boto3.client("bedrock-runtime")
model_id = 'us.twelvelabs.marengo-embed-3-0-v1:0'
video_s3_uri = ""
aws_account_id = ""
s3_bucket_name = ""
s3_output_prefix = ""

response = bedrock_client.start_async_invoke(
    modelId=model_id,
    modelInput={
        "inputType": "video",
        "video": {
            "mediaSource": {
                "s3Location": {
                    "uri": video_s3_uri,
                    "bucketOwner": aws_account_id
                }
            }
        }
    },
    outputDataConfig={
        "s3OutputDataConfig": {
            "s3Uri": f's3://{s3_bucket_name}/{s3_output_prefix}'
        }
    }
)

Um vídeo típico processado desta forma gera 280 embeddings individuais — um para cada segmento — viabilizando busca temporal precisa e análise detalhada. A saída inclui embeddings multimodais com estrutura similar a esta:

[
    {
        'embedding': [0.053192138671875,...],
        'embeddingOption': "visual",
        'embeddingScope': "clip",
        "startSec": 0.0,
        "endSec": 4.3
    },
    {
        'embedding': [0.053192138645645,...],
        'embeddingOption': "transcription",
        'embeddingScope': "clip",
        "startSec": 3.9,
        "endSec": 6.5
    },
    {
        'embedding': [0.3235554er443524,...],
        'embeddingOption': "audio",
        'embeddingScope': "clip",
        "startSec": 4.9,
        "endSec": 7.5
    }
]

Para personalizar o processamento, é possível utilizar o seguinte fragmento com opções configuráveis:

response = bedrock_client.start_async_invoke(
    modelId=model_id,
    modelInput={
        "modelId": model_id,
        "modelInput": {
            "inputType": "video",
            "video": {
                "mediaSource": {
                    "base64String": "base64-encoded string",
                    "s3Location": {
                        "uri": "s3://amzn-s3-demo-bucket/video/clip.mp4",
                        "bucketOwner": "123456789012"
                    }
                },
                "startSec": 0,
                "endSec": 6,
                "segmentation": {
                    "method": "dynamic",
                    "dynamic": {
                        "minDurationSec": 4
                    },
                    "method": "fixed",
                    "fixed": {
                        "durationSec": 6
                    }
                },
                "embeddingOption": ["visual", "audio", "transcription"],
                "embeddingScope": ["clip", "asset"]
            },
            "inferenceId": "some inference id"
        }
    }
)

Consulte a documentação completa para conhecer toda funcionalidade suportada.

Configurando o Índice no OpenSearch Serverless

Após criar uma coleção no OpenSearch Serverless, é necessário criar um índice que contenha propriedades adequadas para armazenar embeddings vetoriais. O seguinte código demonstra essa configuração:

index_mapping = {
    "mappings": {
        "properties": {
            "video_id": {"type": "keyword"},
            "segment_id": {"type": "integer"},
            "start_time": {"type": "float"},
            "end_time": {"type": "float"},
            "embedding": {
                "type": "dense_vector",
                "dims": 1024,
                "index": True,
                "similarity": "cosine"
            },
            "metadata": {"type": "object"}
        }
    }
}

Indexando os Embeddings do Marengo

Após gerar os embeddings, é necessário ingeri-los no índice do OpenSearch. O fragmento abaixo demonstra esse processo:

documents = []
for i, segment in enumerate(video_embeddings):
    document = {
        "embedding": segment["embedding"],
        "start_time": segment["startSec"],
        "end_time": segment["endSec"],
        "video_id": video_id,
        "segment_id": i,
        "embedding_option": segment.get("embeddingOption", "visual")
    }
    documents.append(document)

bulk_data = []
for doc in documents:
    bulk_data.append({"index": {"_index": self.index_name}})
    bulk_data.append(doc)

bulk_body = "\n".join(json.dumps(item) for item in bulk_data) + "\n"
response = oss_client.bulk(body=bulk_body, index=self.index_name)

Busca Semântica Cruzada Entre Modalidades

Uma das grandes vantagens do design multivetor do Marengo é permitir buscas cruzadas entre diferentes modalidades — capacidade impossível com modelos de vetor único. Criando embeddings separados mas alinhados para elementos visuais, áudio, movimento e contexto, é possível buscar vídeos utilizando o tipo de entrada que for mais conveniente.

Por exemplo, uma consulta por texto “jazz tocando” retorna clipes de vídeo com músicos em apresentação, faixas de áudio de jazz e cenas de salas de concerto extraídas de uma única consulta textual.

Busca por Texto

O seguinte fragmento demonstra capacidade de busca semântica cruzada utilizando texto:

text_query = "a person smoking in a room"
modelInput={
    "inputType": "text",
    "text": {
        "inputText": text_query
    }
}
response = self.bedrock_client.invoke_model(
    modelId="us.twelvelabs.marengo-embed-3-0-v1:0",
    body=json.dumps(modelInput))
result = json.loads(response["body"].read())
query_embedding = result["data"][0]["embedding"]

search_body = {
    "query": {
        "knn": {
            "embedding": {
                "vector": query_embedding,
                "k": top_k
            }
        }
    },
    "size": top_k,
    "_source": ["start_time", "end_time", "video_id", "segment_id"]
}
response = opensearch_client.search(index=self.index_name, body=search_body)

print(f"\n✅ Found {len(response['hits']['hits'])} matching segments:")
results = []
for hit in response['hits']['hits']:
    result = {
        "score": hit["_score"],
        "video_id": hit["_source"]["video_id"],
        "segment_id": hit["_source"]["segment_id"],
        "start_time": hit["_source"]["start_time"],
        "end_time": hit["_source"]["end_time"]
    }
    results.append(result)

Busca por Imagem

O modelo também suporta busca semântica iniciada a partir de uma imagem. O fragmento seguinte demonstra essa funcionalidade:

s3_image_uri = f's3://{self.s3_bucket_name}/{self.s3_images_path}/{image_path_basename}'
s3_output_prefix = f'{self.s3_embeddings_path}/{self.s3_images_path}/{uuid.uuid4()}'
modelInput={
    "inputType": "image",
    "image": {
        "mediaSource": {
            "s3Location": {
                "uri": s3_image_uri,
                "bucketOwner": self.aws_account_id
            }
        }
    }
}
response = self.bedrock_client.invoke_model(
    modelId=self.cris_model_id,
    body=json.dumps(modelInput),
)
result = json.loads(response["body"].read())

query_embedding = result["data"][0]["embedding"]

search_body = {
    "query": {
        "knn": {
            "embedding": {
                "vector": query_embedding,
                "k": top_k
            }
        }
    },
    "size": top_k,
    "_source": ["start_time", "end_time", "video_id", "segment_id"]
}
response = opensearch_client.search(index=self.index_name, body=search_body)

Busca por Áudio

Além de buscas textuais e visuais, o modelo Marengo também possibilita buscar vídeos utilizando embeddings de áudio, com foco em diálogo e fala. Essa capacidade permite que usuários localizem vídeos com base em palestrantes específicos, conteúdo de diálogo ou tópicos falados, criando uma experiência de busca abrangente que combina texto, imagem e áudio para compreensão integrada do conteúdo videoconteúdo.

Impacto Prático

A combinação do TwelveLabs Marengo com Amazon Bedrock abre possibilidades significativas para compreensão de vídeos através de sua abordagem multimodal de múltiplos vetores. Uma chamada única à API do Bedrock transformou um arquivo de vídeo em 336 segmentos pesquisáveis capazes de responder a consultas textuais, visuais e de áudio.

Essas capacidades criam oportunidades para descoberta de conteúdo em linguagem natural, gerenciamento simplificado de ativos de mídia e outras aplicações que auxiliam organizações a compreender melhor e utilizar seu acervo de conteúdo videoconteúdo em escala. Conforme vídeo continua dominando experiências digitais, modelos como o Marengo oferecem fundação sólida para construir sistemas de análise de vídeo mais inteligentes.

Explore o código de exemplo e descubra como compreensão de vídeo multimodal pode transformar suas aplicações.

Fonte

Unlocking video understanding with TwelveLabs Marengo on Amazon Bedrock (https://aws.amazon.com/blogs/machine-learning/unlocking-video-understanding-with-twelvelabs-marengo-on-amazon-bedrock/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *