Transcrição e Sumarização de Áudio Rápida Usando os Modelos da OpenAI

Andre Luiz Cavalcanti Tenorio
edifyeducation
Published in
4 min readMay 23, 2023

Introdução

Informação é tudo hoje em dia, mas o desafio é lidar com o volume de dados que recebemos constantemente. O uso de arquivos de áudio e vídeo como formas de compartilhamento de informação tem se tornado cada vez mais comum, portanto é crucial desenvolver soluções que nos ajudem a consumir esses dados de forma eficiente.

Aqui, exploraremos como usar os modelos Whisper e GPT-3.5-turbo da OpenAI para transcrever e sumarizar áudios longos. Mostraremos como transcrevemos e sumarizamos cinco arquivos de áudio de 40 minutos em poucos minutos usando Python.

Limitações

Para lidar com as limitações da tecnológica precisamos repartir o áudio em varias partes, temo um limite de áudio de 25 minutos que podemos enviar para API e também temos um limite de tokens que podemos enviar para fazer o resumo, com isso chegamos a um tempo “ideal” de 10 minutos em cada trecho de áudio onde vamos enviar para ser transcrito depois para ser resumido.

Explicação do Código

Nosso script Python realiza a tarefa em quatro etapas principais:

  1. Divisão de arquivos de áudio longos em segmentos gerenciáveis
  2. Transcrição dos segmentos de áudio em texto usando o Whisper ASR da OpenAI
  3. Sumarização de cada segmento de transcrição usando o GPT-3.5-turbo da OpenAI
  4. Produção de um resumo final de todos os resumos individuais.

Divisão de Arquivos de Áudio Longos

Arquivos de áudio longos podem ser desafiadores para processar diretamente. Por isso, dividimos os arquivos de áudio em segmentos menores usando a biblioteca PyDub. Definimos a duração de cada segmento para 600000 milissegundos (ou 10 minutos), que é um tamanho gerenciável para a API do OpenAI e para o próprio processo de transcrição.

Transcrição dos Segmentos de Áudio

Depois de dividir o arquivo de áudio, transcrevemos cada segmento de áudio em texto usando o Whisper, o modelo de Reconhecimento Automático de Fala (ASR) da OpenAI. Abrimos cada arquivo de áudio segmentado, enviamos para o método openai.Audio.transcribe e anexamos a resposta transcrita a uma lista de transcrições.

Sumarização de Cada Segmento de Transcrição

Após a transcrição, sumarizamos cada segmento de transcrição usando o modelo GPT-3.5-turbo da OpenAI. Criamos uma lista de mensagens, onde cada mensagem representa um turno da conversa e passamos essa lista para a função openai.ChatCompletion.create. Esta função retorna a resposta do modelo, que é o resumo do texto. Nós então anexamos cada resumo a uma lista de resumos.

Produção de um Resumo Final

Na etapa final, produzimos um resumo geral de todos os resumos individuais. Novamente, utilizamos o GPT-3.5-turbo para ler todos os resumos individuais e compilar um resumo final conciso.

Conclusão

Lembrando para utilizar este solução é necessário tem o token de acesso a API do open ai e isso gera um custo. Para este projeto onde foram utilizados 5 áudios de 40 minutos o custo total ficou em $1,73 dolares

Com os modelos da OpenAI, é possível criar ferramentas poderosas para nos ajudar a digerir e resumir grandes volumes de dados de áudio rapidamente. Este processo não apenas economiza tempo, mas também garante que as transcrições e resumos sejam precisos e relevantes. Conforme a IA continua a evoluir, continuaremos a ver maneiras.

from pydub import AudioSegment
import os
import math
import openai

token_openai = 'xxxx'
openai.api_key = token_openai

transcript = []
summary = []

us = "-"
dot = "."
fn = 'nome_arquivo'
ft = 'm4a'
ft_s = 'mp3'
audio_path = fn + dot + ft

print('Segmentando o arquivo:', audio_path)
segment_length = 600000
audio = AudioSegment.from_file(audio_path)
audio_duration = len(audio)
num_segments = math.ceil(audio_duration / segment_length)

print("Numero de segmentos: -", num_segments)

for i in range(num_segments):
start_time = i * segment_length
end_time = min((i + 1) * segment_length, audio_duration)
output_file = fn + us + str(i) + dot + ft_s
segment = audio[start_time:end_time]
segment.export(output_file, format=ft_s)

print("Segmentação concluida")

print("Transcrição com whisper")

for i in range(num_segments):
input_file = fn + us + str(i) + dot + ft_s
with open(input_file, "rb") as audio_file:
response = openai.Audio.transcribe(file=audio_file, model="whisper", response_format="text", language="pt")
transcript.append(response['transcript'])
print(response['transcript'])

print("—fim da transcrição—")

print("Resumo")

prompt_action = "Resuma o seguinte texto:"

for i in range(num_segments):
my_prompt = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt_action + transcript[i]}]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=my_prompt)
my_summary = response['choices'][0]['message']['content']
summary.append(my_summary)

print("Fim Resumo")

print("Resumo final")

prompt_action = "Resuma o texto a seguir e liste os itens mais importantes:"
prompt_text = ''
for i in range(num_segments):
prompt_text += summary[i]

my_prompt = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt_action + prompt_text}]
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=my_prompt)

my_summary = response['choices'][0]['message']['content']

print(my_summary)

--

--

Andre Luiz Cavalcanti Tenorio
edifyeducation

Gerente de Data Analytics na Edify. Recifense e Cientista de dados