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.
📝 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
- 🔄 Conversión de audio a texto con alta precisión
- 🚀 API rápida y eficiente con FastAPI
- 🌍 Soporte CORS para integraciones con aplicaciones web
- 🔒 Manejo seguro de archivos de audio
- ☁️ Compatible con despliegue serverless (AWS Lambda)
🧰 Tecnologías Utilizadas
Para desarrollar este proyecto, utilizamos las siguientes tecnologías:
- FastAPI: Framework web de alto rendimiento
- OpenAI Whisper: Modelo avanzado de reconocimiento de voz
- Mangum: Adaptador para facilitar el despliegue en AWS Lambda
- Python-dotenv: Gestión de variables de entorno
- CORS Middleware: Para permitir solicitudes de diferentes orígenes
📋 Requisitos Previos
Antes de empezar, asegúrate de tener:
- Python 3.8 o superior
- Cuenta en OpenAI con API Key
- Pip (gestor de paquetes de Python)
🚀 Instalación y Configuración
Paso 1: Clonar el repositorio
git clone https://github.com/tu-usuario/convertidor-audio-texto.git
cd convertidor-audio-texto
Paso 2: Crear un entorno virtual
python -m venv venv
Paso 3: Activar el entorno virtual
venv\Scripts\activate
Terminal (macOS/Linux)
source venv/bin/activate
Paso 4: Instalar dependencias
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:
OPENAI.API_KEY=tu_api_key_de_openai
💻 Código del Proyecto
A continuación se muestra el código completo de la API:
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")
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
uvicorn main:app --reload
El servidor estará disponible en http://localhost:8000
Endpoints
GET /
Endpoint de prueba para verificar que el servicio está funcionando.
{
"hello ✔": "Audio to text converter"
}
POST /audio
Convierte un archivo de audio a texto.
Parámetros:
audio
: Archivo de audio (máximo 5MB)
Ejemplo de solicitud usando curl:
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:
{
"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:
- Swagger UI:
http://localhost:8000/docs
- ReDoc:
http://localhost:8000/redoc
🔍 Limitaciones
- Tamaño máximo de archivo de audio: 5MB
- Formatos de audio soportados: MP3, M4A, WAV, MPG, MPEG, WEBM
🚀 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
-
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 ../..
-
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
-
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)
- Añade la variable
-
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. -
Prueba el despliegue
Una vez desplegada tu API, puedes probarla con curl:
Terminalcurl -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:
- Autenticación: Implementa un sistema de autenticación API Key o JWT
- Límites de tamaño: Configura API Gateway para aceptar archivos de mayor tamaño si es necesario
- Caché: Configura caché en API Gateway para respuestas repetidas
- Monitoreo: Configura CloudWatch para monitorear el uso y errores de la API
- Dominio personalizado: Configura un dominio personalizado para tu API
📦 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:
- Transcripción de entrevistas: Automatiza la transcripción de entrevistas de investigación o periodísticas
- Notas de voz: Convierte notas de voz de aplicaciones móviles en texto para facilitar su búsqueda y organización
- Contenido para podcasts: Genera transcripciones automáticas para mejorar la accesibilidad y el SEO de podcasts
- Subtitulado automático: Crea subtítulos para vídeos a partir del audio
- Análisis de llamadas: Transcribe llamadas de servicio al cliente para análisis posterior
🧩 Personalización y extensiones
Aquí hay algunas formas de personalizar o extender este proyecto:
- Soporte multiidioma: Añade parámetros para especificar el idioma del audio
- Detección de hablantes: Implementa identificación de diferentes hablantes en la conversación
- Procesamiento de texto: Añade análisis de sentimiento o extracción de palabras clave del texto resultante
- Traducción: Combina con APIs de traducción para convertir el texto a otros idiomas
- Interfaz web: Desarrolla una interfaz de usuario amigable para subir archivos y visualizar transcripciones
📚 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