Convertidor de Audio a Texto con Inteligencia Artificial

En este artículo te enseñaré cómo crear una API para convertir archivos de audio a texto utilizando la potencia de la Inteligencia Artificial. El proyecto utiliza FastAPI, un moderno framework web para Python, y el modelo Whisper de OpenAI para lograr transcripciones precisas y eficientes.

FastAPI OpenAI Whisper Python AWS Lambda

📝 Descripción del Proyecto

Este proyecto es una API desarrollada con FastAPI que permite convertir archivos de audio a texto utilizando el modelo Whisper de OpenAI. Esta herramienta es ideal para transcripciones automáticas de grabaciones, notas de voz, entrevistas o cualquier contenido de audio que necesites transformar en texto.

✨ Características Principales

🧰 Tecnologías Utilizadas

Para desarrollar este proyecto, utilizamos las siguientes tecnologías:

Audio
API (FastAPI)
OpenAI Whisper
Texto

📋 Requisitos Previos

Antes de empezar, asegúrate de tener:

🚀 Instalación y Configuración

Paso 1: Clonar el repositorio

Terminal
git clone https://github.com/tu-usuario/convertidor-audio-texto.git
cd convertidor-audio-texto

Paso 2: Crear un entorno virtual

Terminal
python -m venv venv

Paso 3: Activar el entorno virtual

Terminal (Windows)
venv\Scripts\activate
Terminal (macOS/Linux)
source venv/bin/activate

Paso 4: Instalar dependencias

Terminal
pip install -r requirements.txt

Paso 5: Configurar variables de entorno

Crea un archivo .env.dev en la raíz del proyecto con el siguiente contenido:

.env.dev
OPENAI.API_KEY=tu_api_key_de_openai

💻 Código del Proyecto

A continuación se muestra el código completo de la API:

main.py
from fastapi import FastAPI, UploadFile, File, HTTPException
from typing import Optional
import openai
from fastapi.responses import JSONResponse
from starlette.status import HTTP_200_OK
import logging
from dotenv import load_dotenv
from fastapi.middleware.cors import CORSMiddleware
from mangum import Mangum
import io
import os

load_dotenv('.env.dev')
openai.api_key = os.getenv("OPENAI.API_KEY")

# Tamaño máximo permitido en MB
MAX_AUDIO_SIZE_MB = 5 
MAX_AUDIO_SIZE_BYTES = MAX_AUDIO_SIZE_MB * 1024 * 1024  # Convertido a bytes

app = FastAPI(
    title="Convertidor de Audio a Texto",
    description="API para convertir audio a texto"
)

# Configura CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/")
async def root():
    return {"hello ✔": "Audio to text converter"}

@app.post("/audio")
async def chat(audio: Optional[UploadFile] = File(...)):
    print("recibiendo el nombre del audio... ", audio.filename)
    if not audio:
        raise HTTPException(status_code=400, detail="Debe proporcionar un archivo de audio")
    
    # Leemos el contenido del archivo de audio
    audio_content = await audio.read()
    try:
        # Creamos un archivo en memoria usando io.BytesIO para simular un archivo
        audio_file = io.BytesIO(audio_content)
        audio_file.name = audio.filename
        
        # Convertimos el audio a texto utilizando OpenAI
        response = openai.Audio.transcribe(
            model="whisper-1",
            file=audio_file
        )
        
        # Preparamos la respuesta con el texto transcrito y el status code
        responde = {
            "text": response['text'],
            "status": HTTP_200_OK
        }
        
        # Retornamos la respuesta en formato JSON con el status code
        return JSONResponse(content=responde, status_code=HTTP_200_OK)
    except Exception as e:
        logging.error(f"Error durante la transcripción: {e}")
        raise HTTPException(status_code=500, detail="Error en la transcripción del audio.")

# Configuración para AWS Lambda
handler = Mangum(app, lifespan="off")
requirements.txt
fastapi==0.99.0
mangum==0.14.0
uvicorn==0.23.0
openai==0.28.0
lxml==4.9.0
python-dotenv==1.0.1
openai==0.28.0
python-multipart==0.0.9

🔧 Uso de la API

Iniciar el servidor localmente

Terminal
uvicorn main:app --reload

El servidor estará disponible en http://localhost:8000

Endpoints

GET /

Endpoint de prueba para verificar que el servicio está funcionando.

Respuesta
{
  "hello ✔": "Audio to text converter"
}

POST /audio

Convierte un archivo de audio a texto.

Parámetros:

Ejemplo de solicitud usando curl:

Terminal
curl -X POST "http://localhost:8000/audio" \
  -H "accept: application/json" \
  -H "Content-Type: multipart/form-data" \
  -F "audio=@tu_archivo_audio.mp3"

Respuesta exitosa:

JSON
{
  "text": "Texto transcrito del audio...",
  "status": 200
}

Documentación de la API

FastAPI genera automáticamente la documentación de la API. Puedes acceder a:

🔍 Limitaciones

🚀 Despliegue en la Nube

Este proyecto está diseñado para ser desplegado fácilmente en AWS Lambda gracias a Mangum. Esta integración nos permite crear un servicio serverless completamente escalable sin preocuparnos por la infraestructura.

Pasos para el despliegue en AWS Lambda

  1. Empaquetar la aplicación

    Para crear un paquete de despliegue adecuado para AWS Lambda, sigue estos pasos:

    Terminal
    # Crear directorio para el paquete
    mkdir -p deployment/package
    
    # Instalar dependencias en el directorio de despliegue
    pip install -r requirements.txt -t deployment/package/
    
    # Copiar el archivo principal
    cp main.py deployment/package/
    
    # Crear el archivo ZIP para Lambda
    cd deployment/package/
    zip -r ../lambda_deployment.zip .
    cd ../..
  2. Configurar un API Gateway

    En la consola de AWS:

    • Crea un nuevo API Gateway REST API
    • Configura métodos GET y POST con integración a tu función Lambda
    • Habilita CORS si es necesario para integraciones web
    • Despliega la API y anota la URL generada
  3. Configurar variables de entorno

    En la sección de configuración de tu función Lambda:

    • Añade la variable OPENAI.API_KEY con tu clave de API de OpenAI
    • Configura el tiempo de espera adecuado (recomendado: 30 segundos)
    • Ajusta la memoria asignada según tus necesidades (mínimo recomendado: 256MB)
  4. Definir el handler

    En la configuración de AWS Lambda, establece el handler como main.handler. Este es el punto de entrada que Mangum ha configurado para comunicar API Gateway con tu aplicación FastAPI.

  5. Prueba el despliegue

    Una vez desplegada tu API, puedes probarla con curl:

    Terminal
    curl -X POST "https://tu-api-id.execute-api.tu-region.amazonaws.com/prod/audio" \
      -H "Content-Type: multipart/form-data" \
      -F "audio=@ejemplo.mp3"

Consideraciones para el despliegue en producción

Para un entorno de producción, considera estas mejoras adicionales:

📦 Estructura del Proyecto

convertidor-audio-texto/
├── main.py            # Archivo principal con la API
├── requirements.txt   # Dependencias del proyecto
├── .env.dev           # Variables de entorno para desarrollo
├── deployment/        # Directorio para archivos de despliegue
│   └── package/       # Paquete para Lambda
│       └── lambda_deployment.zip  # Archivo ZIP para despliegue
└── README.md          # Documentación

🔍 Casos de uso reales

Este convertidor de audio a texto puede aplicarse en numerosos escenarios:

🧩 Personalización y extensiones

Aquí hay algunas formas de personalizar o extender este proyecto:

📚 Conclusión

En este artículo, hemos explorado cómo crear una API robusta para convertir audio a texto utilizando FastAPI y el modelo Whisper de OpenAI. Esta herramienta puede ser integrada en diversas aplicaciones que requieran transcripción de audio, desde aplicaciones de notas de voz hasta sistemas de transcripción de entrevistas.

El uso de FastAPI nos proporciona un rendimiento excepcional y una experiencia de desarrollo agradable, mientras que OpenAI Whisper ofrece un reconocimiento de voz de alta calidad con soporte para múltiples idiomas. Además, gracias a Mangum, la API puede desplegarse fácilmente en un entorno serverless como AWS Lambda, permitiendo una escalabilidad prácticamente ilimitada sin preocuparse por la infraestructura.

Las posibilidades de aplicación de esta tecnología son enormes y continuarán expandiéndose a medida que los modelos de IA para reconocimiento de voz sigan mejorando. Te animo a experimentar con este proyecto, adaptarlo a tus necesidades específicas y explorar nuevas formas de aprovechar la potencia de la IA para trabajar con contenido de audio.

¿Tienes alguna pregunta o comentario sobre este proyecto? ¿O tal vez ideas para mejorarlo? ¡No dudes en contactarme a través de mis redes sociales o dejar un comentario más abajo!

Si estás interesado en implementar esta solución o tienes preguntas sobre el proyecto, no dudes en contactarme a través de mi GitHub o LinkedIn.

Desarrollado con ❤️ usando FastAPI y OpenAI Whisper