Script Acceso Libre 20 Feb, 2026

Script: Transcripción de audio con Whisper API

Transcribe archivos de audio/video a texto usando la API de Whisper de OpenAI. Incluye soporte para archivos grandes, timestamps y múltiples idiomas.

#whisper #openai #audio #transcripcion #python

Contenido

Transcripción de Audio con Whisper API

Convierte audio a texto con la API de Whisper de OpenAI. Soporta más de 50 idiomas, puntuación automática y timestamps.

Instalación

pip install openai pydub

Transcripción simple

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

Transcripción con timestamps (para subtítulos)

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}"

Archivos grandes (>25MB): dividir con pydub

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)

Pipeline completo: Audio → Texto → Resumen

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()),
    }

Costos y límites

  • Precio: $0.006 por minuto de audio
  • Límite: 25MB por request (usa la función transcribe_large para archivos mayores)
  • Formatos: mp3, mp4, mpeg, mpga, m4a, wav, webm
  • 1 hora de audio ≈ $0.36

Recurso Externo

Este recurso incluye un enlace externo. Regístrate para acceder.

Inicia Sesión para Acceder

Únete a la Comunidad

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

Erik Taveras

Autor

Erik Taveras

Recursos Relacionados