Transcripción de Voz con Whisper
Explicación del Código de Transcripción de Voz con Whisper
Este proyecto es un sistema de transcripción de voz en tiempo real que utiliza:
Whisper (modelo de IA de OpenAI para reconocimiento de voz)
Flask (backend en Python)
Web Audio API (para capturar audio del navegador)
Socket.IO (para comunicación en tiempo real)
Estructura del Proyecto
proyecto/
├── app.py # Servidor backend
├── templates/
│ └── index.html # Interfaz web
└── static/
└── script.js # Lógica del clienteRequisitos para ejecutarlo
Python 3.7+
FFmpeg (debe estar instalado y accesible en el PATH)
Dependencias de Python (instalables con pip)
Instalación
Instala las dependencias:
pip install flask flask-socketio eventlet openai-whisperAsegúrate de tener FFmpeg instalado:
ffmpeg -versionExplicación detallada del código
1. app.py (Backend)
import whisper
import tempfile
from flask import Flask, render_template
from flask_socketio import SocketIO
import eventlet
import os
import subprocess
eventlet.monkey_patch() # Necesario para SocketIO con Flask
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*")
# Carga el modelo Whisper (base, small, medium, large)
model = whisper.load_model("base")
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('audio_chunk')
def handle_audio(data):
# Crea archivos temporales
with tempfile.NamedTemporaryFile(suffix=".webm", delete=False) as input_file:
input_file.write(data)
input_path = input_file.name
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as output_file:
output_path = output_file.name
# Convierte el audio a formato WAV con FFmpeg
ffmpeg_cmd = [
"ffmpeg", "-y", "-i", input_path,
"-ar", "16000", "-ac", "1", output_path
]
try:
subprocess.run(ffmpeg_cmd, check=True)
# Transcribe el audio
result = model.transcribe(output_path, language='es')
text = result.get('text', '').strip()
if text:
socketio.emit('transcription', text)
except Exception as e:
print("Error:", e)
finally:
# Limpia archivos temporales
os.remove(input_path)
os.remove(output_path)
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0', port=5000)2. index.html (Interfaz)
<!DOCTYPE html>
<html>
<head>
<!-- Estructura básica y estilos -->
</head>
<body>
<h1>🎙️ Dictador de Voz</h1>
<textarea id="texto" placeholder="Aquí aparecerá la transcripción..." readonly></textarea>
<button id="btn">Iniciar Dictado</button>
<div id="status">Estado: Inactivo</div>
<!-- Dependencias -->
<script src="https://cdn.socket.io/4.5.4/socket.io.min.js"></script>
<script src="/static/script.js"></script>
</body>
</html>3. script.js (Cliente)
const btn = document.getElementById('btn');
const texto = document.getElementById('texto');
const status = document.getElementById('status');
const socket = io();
let mediaRecorder;
let audioChunks = [];
let escuchando = false;
btn.addEventListener('click', async () => {
if (!escuchando) {
// Inicia la grabación
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.ondataavailable = e => {
if (e.data.size > 0) audioChunks.push(e.data);
};
mediaRecorder.onstop = async () => {
// Envía el audio al servidor
const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });
const arrayBuffer = await audioBlob.arrayBuffer();
socket.emit('audio_chunk', new Uint8Array(arrayBuffer));
status.textContent = 'Estado: Procesando...';
};
mediaRecorder.start();
// Actualiza la interfaz
status.textContent = 'Estado: Escuchando...';
btn.textContent = 'Detener Dictado';
escuchando = true;
} else {
// Detiene la grabación
mediaRecorder.stop();
status.textContent = 'Estado: Inactivo';
btn.textContent = 'Iniciar Dictado';
escuchando = false;
}
});
// Recibe la transcripción del servidor
socket.on('transcription', (data) => {
texto.value += data + ' ';
status.textContent = 'Estado: Transcripción completada.';
});Cómo funciona
Cliente (navegador):
El usuario hace clic en "Iniciar Dictado"
El navegador solicita permiso para usar el micrófono
Comienza a grabar audio en formato WebM
Cuando se detiene, envía los fragmentos de audio al servidor
Servidor:
Recibe los fragmentos de audio
Convierte WebM a WAV usando FFmpeg
Usa Whisper para transcribir el audio a texto
Envía el texto de vuelta al cliente
Cliente:
Recibe el texto y lo muestra en el área de texto
Posibles problemas y soluciones
Error al instalar Whisper:
Asegúrate de tener Python 3.7+
Prueba con
pip install --upgrade --no-deps --force-reinstall whisper
FFmpeg no encontrado:
Instala FFmpeg y asegúrate de que esté en tu PATH
En Windows, descárgalo de https://ffmpeg.org/
Problemas de permisos del micrófono:
Asegúrate de que el navegador tenga permiso para usar el micrófono
La página debe servirse sobre HTTPS (o localhost)
Rendimiento lento:
Usa un modelo más pequeño (
tinyobaseen lugar demedium/large)Reduce la frecuencia de muestreo del audio
Este proyecto es excelente para aplicaciones de dictado, transcripción de reuniones, o cualquier sistema que necesite convertir voz a texto en tiempo real.
Comentarios
Publicar un comentario