14. Audio en la Web: Transcripción con Whisper API y Text-to-Speech (TTS)
Captura audio en el navegador con MediaRecorder API, transcribe con Whisper en el servidor y sintetiza respuestas de voz de alta fidelidad.
La Interfaz de Voz en la Web Moderna
Muchos usuarios prefieren hablar en lugar de teclear en teléfonos móviles: soporte al cliente por notas de voz, dictado de tickets médicos, búsqueda por voz en catálogos y asistentes accesibles para personas con discapacidad visual. Hoy es posible construir una experiencia de voz fluida de extremo a extremo utilizando los estándares web nativos y modelos de audio de última generación.
El flujo de voz completo consta de tres pasos sincronizados:
- Captura del Micrófono (Frontend): Con la API nativa de JavaScript
MediaRecorder, grabamos fragmentos en formato WebM u Opus. - Transcripción (Speech-to-Text con Whisper): El servidor backend envía el archivo de audio al endpoint
/v1/audio/transcriptionspara convertirlo en texto exacto con puntuación y soporte multiidioma. - Síntesis de Voz (Text-to-Speech / TTS): El backend convierte la respuesta del LLM en un archivo de audio MP3 de voz humana natural para su reproducción inmediata en el cliente con la etiqueta
<audio>.
Especificaciones Técnicas del Endpoint de Transcripción (Whisper)
| Campo / Parámetro | Tipo | Descripción |
|---|---|---|
file |
Multipart File (binario) | Archivo de audio en formatos mp3, mp4, mpeg, mpga, m4a, wav o webm (máximo 25 MB). |
model |
String | Identificador del modelo, típicamente whisper-1. |
language |
String ISO (opcional) | Código del idioma (ej. es para español). Mejora la velocidad y evita confusiones léxicas. |
response_format |
String | json, text, srt o vtt (ideal para subtítulos de vídeo web). |
⚡ Grabación de Micrófono en el Navegador y Envío al Backend
Código JavaScript con MediaRecorder API que graba la voz del usuario y la envía por POST como multipart/form-data.
/**
* voice-chat-recorder.js - Grabador de notas de voz web para transcripción
*/
class VoiceAssistantRecorder {
constructor() {
this.mediaRecorder = null;
this.audioChunks = [];
}
async startRecording() {
this.audioChunks = [];
// Solicitamos acceso al micrófono del dispositivo
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm" });
this.mediaRecorder.ondataavailable = (event) => {
if (event.data.size > 0) {
this.audioChunks.push(event.data);
}
};
this.mediaRecorder.start();
console.log("Grabando audio...");
}
stopAndTranscribe(onSuccess, onError) {
if (!this.mediaRecorder) return;
this.mediaRecorder.onstop = async () => {
try {
const audioBlob = new Blob(this.audioChunks, { type: "audio/webm" });
const formData = new FormData();
formData.append("audio_file", audioBlob, "grabacion.webm");
// Enviamos al backend proxy para evitar exponer la API Key
const res = await fetch("/api/transcribe.php", {
method: "POST",
body: formData
});
if (!res.ok) throw new Error("Fallo en la transcripción");
const data = await res.json();
onSuccess(data.transcription); // Texto transcrito por Whisper
} catch (err) {
onError(err);
}
};
this.mediaRecorder.stop();
// Detenemos los tracks de audio para liberar el micrófono en el navegador
this.mediaRecorder.stream.getTracks().forEach((track) => track.stop());
}
}
Mini-Quiz de Retención
Comprueba tu comprensión antes de pasar a la siguiente lección¿Qué formato de petición HTTP exige el endpoint /v1/audio/transcriptions de Whisper para enviar un archivo de audio grabado por el usuario?
¿Tienes dudas con este tema?
Sócrates AI puede darte analogías y explicarte este código paso a paso.🚀 ¿Quieres dominar IA Aplicada a Desarrollo Web: APIs, RAG & Agentes y crear proyectos reales?
Aprende arquitectura limpia, desarrollo web moderno, buenas prácticas y despliegue en producción con nuestro Bootcamp Fullstack Developer con mentorías en vivo.
🏛️ Autoría y Propiedad Intelectual: Obra educativa original de David Amador para Kilopolis Academia (Solucionáticos), estructurada sobre las especificaciones y estándares abiertos del W3C, el estándar vivo de WHATWG y la documentación oficial de código abierto. © Todos los derechos reservados.