image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Eduardo Freitas
Eduardo Freitas14/05/2024 18:45
Compartilhe

Utilizando IA Generativa para analisar vídeos da Assembleia Legislativa de Pernambuco

  • #IA Generativa

Cansado de ter que assistir a vídeos longos no YouTube apenas para encontrar um trecho específico? E se houvesse uma maneira de automatizar esse processo, economizando tempo e esforço? Descubra como utilizar a IA Generativa para criar uma solução eficiente para encontrar rapidamente os trechos desejados nos vídeos e montar automaticamente uma timeline com os principais momentos.

Introdução

Assistir a vídeos longos no YouTube em busca de informações específicas pode ser uma tarefa tediosa e demorada. A solução para esse problema é conhecida: escrever, na descrição do vídeo, um resumo do conteúdo e criar uma timeline com links para os principais trechos. De fato, muitos produtores de conteúdo já se valem desse artifício atualmente.

Quer aprender a criar uma timeline para o seu vídeo? Siga esse link.

Entretanto, o processo de criação manual de resumos e timelines é extremamente trabalhoso e consome muito tempo. Além de requerer uma certa intimidade com tecnologia, o que para muitos produtores é um desafio considerável.

A situação fica bem evidente no contexto da instituição em que eu trabalho: Assembleia Legislativa de Pernambuco (Alepe). Na Alepe ocorrem diariamente diversas reuniões e debates, todas sendo gravadas e disponibilizadas online para a população. As sessões plenárias costumam durar entre 1h30m e 3 horas.

Imagine o trabalho que dá criar manualmente a timeline de cada reunião dessa! O resultado é que as timelines para os vídeos acabam não sendo criadas, e por consequência a visualização dos vídeos acaba sendo baixíssima.

A solução? IA Generativa!

Diante desse cenário, surgiu a necessidade de uma solução mais eficiente e automatizada para os vídeos publicados pela Alepe. Foi aí que entrou em cena o YouTubeClipper!

YouTubeClipper: automatizando a análise de vídeos

O YouTubeClipper é um aplicativo que se integra à plataforma do YouTube para extrair as transcrições dos vídeos usando a YouTube API. Em seguida, utiliza a IA Generativa para resumir automaticamente as transcrições e montar uma timeline com os principais trechos.

Benefícios da Ferramenta

  • Economiza tempo e esforço na criação de timelines e resumos de vídeos.
  • Garante a precisão e consistência dos resumos e timelines gerados.
  • Facilita o acesso e compreensão do conteúdo dos vídeos da Alepe para produtores de conteúdo, jornalistas e o público em geral.
  • Aumenta a transparência e visibilidade das atividades legislativas da Alepe.

Tecnologias

Desenvolvido em Python, o YouTubeClipper utiliza a YouTube Transcript API para acessar transcrições dos vídeos. Em seguida, ele utiliza os recursos de IA Generativa do Google Gemini para resumir automaticamente a transcrição e extrair os principais trechos do vídeo.

YouTube Transcript API

Essa API possibilita o download de vídeos e a extração de transcrições, elementos essenciais para a análise de conteúdo de vídeo.

O funcionamento é bem simples: basta você informar o id do vídeo e chamar uma função da API:

from youtube_transcript_api import YouTubeTranscriptApi

YouTubeTranscriptApi.get_transcript(video_id)

O retorno dessa chamada será uma lista de dicionários, cada um representando um trecho do vídeo.

O JSON de saída possui a seguinte estrutura:

[ 
  { 
    'text': 'Boa tarde, nobres colegas e demais presentes.', 
    'start': 0, 
    'duration': 5 
  }, 
  { 
    'text': 'Iniciamos hoje mais uma sessão plenária para debater importantes projetos de lei.', 
    'start': 10, 
    'duration': 10 
  }                         
] 

No exemplo acima, o primeiro trecho começa no segundo 0 e dura 5 segundos. O segundo trecho começa no segundo 10 e dura 10 segundos.

Você pode encontrar a documentação e o código fonte da Transcript API aqui.

Gemini API

O Gemini API é a ferramenta de IA Generativa do Google. O funcionamento também é bastante simples: após obter a chave da API, basta montar o prompt (sua pergunta) e chamar uma função da API:

model = genai.GenerativeModel(model_name="gemini-1.0-pro")


response = model.generate_content(f"Faça um resumo do vídeo")

Você pode gerar sua API Key e encontrar a documentação do Gemini aqui.

Funcionamento

A principal limitação de modelos de Linguagem de Modelagem de Longo Alcance (LLM) como o Gemini é o tamanho do prompt. Em nosso cenário de vídeos de longa duração, essa restrição representa o grande desafio da aplicação.

Para contornar essa limitação, foi adotada a seguinte estratégia:

  • Divisão do transcript em trechos menores: o transcript foi dividido em trechos menores, de aproximadamente 10 minutos de duração cada. 
def split_transcript(transcript, max_duration=600):
  parts = []
  current_part = []
  current_duration = 0

  for entry in transcript:
      if current_duration + entry["duration"] <= max_duration:
          current_part.append(json.dumps(entry))
          current_duration += entry["duration"]
      else:
          decoded_part = [bytes(entry, "utf-8").decode("unicode_escape") for entry in current_part]
          parts.append(decoded_part)  # Adiciona a parte atual à lista de partes
          current_part = [json.dumps(entry)]  # Começa uma nova parte com a entrada atual
          current_duration = entry["duration"]

  decoded_part = [bytes(entry, "utf-8").decode("unicode_escape") for entry in current_part]
  parts.append(decoded_part)

  return parts
  • Envio dos trechos para o Gemini: cada trecho é individualmente enviado ao Gemini, junto com um prompt específico que instrui o modelo sobre como gerar a saída.
summaries = []
clips = []

for segment in segments:
prompt = "Preciso descrever o conteúdo de um vídeo do YouTube."
prompt += " Aqui está o conteúdo:"
prompt += "\n".join(segment)
prompt += " Os dados do vídeo estão no formato JSON {text:'', start:'', duration:''}. start representa o início do trecho em segundos, e duration representa a duração do trecho em segundos;"
prompt += " Quais são os assuntos discutidos nesse vídeo? Crie uma lista contendo uma descrição do assunto e o valor do campo start em que se inicia o assunto."
prompt += " Também preciso que você faça um breve resumo do vídeo inteiro."
prompt += " Responda no formato JSON, de forma que uma aplicação possa fazer o parse da resposta. Os campos do JSON devem ser exatamente estes: 1. summary: resumo do vídeo e 2: topics: lista dos assuntos, que também deve ter um formato JSON assim definido: 1. description e 2.start"
prompt += " O valor de start deve ser exatamente igual ao encontrado no json original."
response = model.generate_content(prompt)
response_text = response.text
response_text = response_text.replace("```json", '')
response_text = response_text.replace("```", '')

json_object = json.loads(response_text)

summaries.append(json_object["summary"])
clips.extend(json_object["topics"])
  • Solicitação do resumo geral: após receber os resumos de todos os trechos, o YouTubeClipper solicita ao Gemini um resumo geral do vídeo completo.
summaries_string = '\n'.join(summaries)

prompt = "Preciso descrever o conteúdo de um vídeo do YouTube."
prompt += " O vídeo contém vários trechos. Vou enviar o resumo de cada trecho. Você deve ler todos eles e gerar um resumo geral."
prompt += " Retorne apenas o resumo geral. Estes são os resumos:\n"

prompt += summaries_string
response = model.generate_content(prompt)

total_summary = response.text
  • Formatação da saída como uma Timeline: os trechos resumidos são formatados como links para a timeline do vídeo. Cada link direciona para o momento específico do vídeo em que o trecho ocorre.
import textwrap
from IPython.display import display
from IPython.display import Markdown

def to_markdown(text):
text = text.replace('•', '  *')
return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))

display (to_markdown("### Resumo:"))
display (to_markdown(total_summary))
display (to_markdown("### Timeline:"))

for clip in clips:
if isinstance(clip['start'], str):
  clip['start'] = clip['start'].replace("'", "")
  clip['start'] = float(clip['start'])

for clip in clips:
  link = f"{video_url}&t={clip['start']}s"
  hours = int(clip['start'] // 3600)
  minutes = int((clip['start'] % 3600) // 60)
  seconds = int(clip['start'] % 60)

  # Formato do tempo HH:MM:SS
  time_formatted = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
  #time_formatted = clip['start']
  start_aligned = f"{time_formatted}".ljust(10)
  description_aligned = clip['description'].ljust(50)
  display (to_markdown(f"{start_aligned} - [{description_aligned}]({link})"))

Você pode encontrar a documentação sobre o YouTubeClipper, bem com um ambiente de testes da aplicação no Google Colab, aqui.

Exemplo de uso

Que tal vermos agora o YouTubeClipper em ação? Assista a esse vídeo:

image

E confira o resumo e os trechos que o aplicativo gerou automaticamente:

Resumo

O vídeo aborda a estrutura e o funcionamento das frentes parlamentares e comissões especiais na Assembleia Legislativa de Pernambuco (Alepe). Ele explica o processo de criação, composição e objetivos desses colegiados, destacando seu papel crucial na discussão e acompanhamento de questões de interesse público.

Timeline

00:00:13 - Frentes parlamentares e comissões especiais na Alepe

00:00:30 - Criação de frentes parlamentares

00:01:03 - Formação de comissões especiais

00:01:37 - Acompanhamento das atividades legislativas na TV Alepe e no YouTube

Conclusão

O YouTubeClipper é apenas um exemplo de como a IA generativa pode ser aplicada para o benefício da sociedade. Ao simplificar a análise de vídeos extensos e proporcionar uma maneira eficiente de acessar informações específicas, a ferramenta não apenas economiza tempo e esforço, mas também promove maior transparência em instituições públicas como a Alepe.

Compartilhe
Comentários (0)