Script Python: ETL Pipeline — CSV a PostgreSQL con pandas
Pipeline de extracción, transformación y carga de datos desde archivos CSV hacia PostgreSQL. Incluye validación, limpieza de datos y manejo de duplicados.
Transcribe archivos de audio/video a texto usando la API de Whisper de OpenAI. Incluye soporte para archivos grandes, timestamps y múltiples idiomas.
Convierte audio a texto con la API de Whisper de OpenAI. Soporta más de 50 idiomas, puntuación automática y timestamps.
pip install openai pydub
from openai import OpenAI
from pathlib import Path
client = OpenAI()
def transcribe(audio_path: str, language: str = "es") -> str:
with open(audio_path, "rb") as f:
result = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language=language,
response_format="verbose_json",
)
return result
def transcribe_with_timestamps(audio_path: str) -> list[dict]:
with open(audio_path, "rb") as f:
result = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language="es",
response_format="verbose_json",
timestamp_granularities=["segment"],
)
segments = []
for seg in result.segments:
segments.append({
"start": seg.start,
"end": seg.end,
"text": seg.text.strip(),
})
return segments
# Generar archivo SRT para subtítulos
def to_srt(segments: list[dict]) -> str:
lines = []
for i, seg in enumerate(segments, 1):
start = format_timestamp(seg["start"])
end = format_timestamp(seg["end"])
lines.append(f"{i}")
lines.append(f"{start} --> {end}")
lines.append(seg["text"])
lines.append("")
return "
".join(lines)
def format_timestamp(seconds: float) -> str:
h = int(seconds // 3600)
m = int((seconds % 3600) // 60)
s = int(seconds % 60)
ms = int((seconds % 1) * 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
from pydub import AudioSegment
import tempfile
import os
def transcribe_large(audio_path: str, chunk_minutes: int = 10) -> str:
audio = AudioSegment.from_file(audio_path)
chunk_ms = chunk_minutes * 60 * 1000
chunks = [audio[i:i + chunk_ms] for i in range(0, len(audio), chunk_ms)]
full_text = []
for i, chunk in enumerate(chunks):
with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as tmp:
chunk.export(tmp.name, format="mp3", bitrate="128k")
print(f"Transcribiendo chunk {i+1}/{len(chunks)}...")
result = transcribe(tmp.name)
full_text.append(result.text)
os.unlink(tmp.name)
return " ".join(full_text)
def audio_to_summary(audio_path: str) -> dict:
text = transcribe(audio_path).text
summary = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Resume el siguiente texto en bullet points. Máximo 5 puntos."},
{"role": "user", "content": text},
],
)
return {
"full_text": text,
"summary": summary.choices[0].message.content,
"word_count": len(text.split()),
}
transcribe_large para archivos mayores)Este recurso incluye un enlace externo. Regístrate para acceder.
Regístrate gratis para descargar archivos, guardar recursos en favoritos, ganar XP y acceder a cursos y el foro de la comunidad.
¿Ya tienes cuenta? Inicia sesión
Autor
Erik Taveras
Creado por
Erik Taveras
Pipeline de extracción, transformación y carga de datos desde archivos CSV hacia PostgreSQL. Incluye validación, limpieza de datos y manejo de duplicados.
Bot de Telegram funcional con comandos, teclados inline, manejo de estados y persistencia. Base ideal para bots de notificación, soporte o automatización.
Scraper reutilizable con requests + BeautifulSoup4. Incluye manejo de paginación, rate limiting, headers rotativos y exportación a CSV con pandas.