Spaces:
Sleeping
Sleeping
from moviepy.editor import * | |
import whisper | |
import os | |
from reportlab.pdfgen import canvas | |
from reportlab.lib.pagesizes import letter | |
# Caminho da pasta principal com as subpastas de vídeos e onde os PDFs serão salvos | |
videos_root_folder = "pasta_com_videos" # Pasta principal contendo as subpastas por cidade | |
pdf_root_folder = "pdf" # Pasta principal para salvar os PDFs | |
# Criar a pasta PDF principal, caso não exista | |
if not os.path.exists(pdf_root_folder): | |
os.makedirs(pdf_root_folder) | |
# Carregar o modelo Whisper | |
modelo = whisper.load_model("base") | |
# Configurações da página PDF | |
page_width, page_height = letter | |
margin_left = 50 | |
margin_top = 750 | |
line_spacing = 14 | |
line_length = 90 # Limite de caracteres por linha (ajuste conforme necessário) | |
# Iterar pelas subpastas dentro da pasta principal de vídeos | |
for city_folder in os.listdir(videos_root_folder): | |
city_path = os.path.join(videos_root_folder, city_folder) | |
if os.path.isdir(city_path): # Verificar se é uma pasta (cidade) | |
# Criar a subpasta correspondente na pasta PDF | |
city_pdf_folder = os.path.join(pdf_root_folder, city_folder) | |
if not os.path.exists(city_pdf_folder): | |
os.makedirs(city_pdf_folder) | |
# Contador para nomear os arquivos de transcrição dentro da cidade | |
contador = 1 | |
# Iterar pelos arquivos de vídeo dentro da subpasta da cidade | |
for video_filename in os.listdir(city_path): | |
if video_filename.endswith(('.mp4', '.avi', '.mov')): # Filtrar apenas arquivos de vídeo | |
# Caminho completo do arquivo de vídeo | |
video_path = os.path.join(city_path, video_filename) | |
# Carregar o vídeo | |
video = VideoFileClip(video_path) | |
# Extrair áudio do vídeo e salvar como um arquivo WAV temporário | |
audio_path = "audio_extraido.wav" | |
video.audio.write_audiofile(audio_path, codec='pcm_s16le') | |
# Transcrever o áudio | |
result = modelo.transcribe(audio_path) | |
# Nome do arquivo PDF | |
pdf_filename = f"transcription_{contador}.pdf" | |
pdf_path = os.path.join(city_pdf_folder, pdf_filename) | |
# Criar o PDF e adicionar o texto transcrito | |
c = canvas.Canvas(pdf_path, pagesize=letter) | |
text = result["text"] | |
# Configurar o texto no PDF | |
c.setFont("Helvetica", 12) # Fonte e tamanho | |
c.drawString(margin_left, margin_top, f"Transcrição do vídeo: {video_filename}") # Título | |
# Posição inicial do texto | |
y_position = margin_top - 30 | |
# Adicionar o texto transcrito ao PDF, quebrando em linhas menores | |
for paragraph in text.split("\n"): | |
while len(paragraph) > 0: | |
# Pegar um trecho que caiba na linha | |
line = paragraph[:line_length] | |
paragraph = paragraph[line_length:] | |
# Adicionar a linha ao PDF | |
c.drawString(margin_left, y_position, line.strip()) | |
y_position -= line_spacing | |
# Se chegar ao final da página, criar uma nova | |
if y_position < 50: | |
c.showPage() | |
c.setFont("Helvetica", 12) | |
y_position = margin_top | |
# Salvar o PDF | |
c.save() | |
# Excluir o arquivo de áudio temporário | |
os.remove(audio_path) | |
# Incrementar o contador para o próximo arquivo | |
contador += 1 | |
print(f"Transcrições concluídas e salvas como PDFs na pasta '{pdf_root_folder}'.") | |