Tema 14 · Audio & Voz

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:

  1. Captura del Micrófono (Frontend): Con la API nativa de JavaScript MediaRecorder, grabamos fragmentos en formato WebM u Opus.
  2. Transcripción (Speech-to-Text con Whisper): El servidor backend envía el archivo de audio al endpoint /v1/audio/transcriptions para convertirlo en texto exacto con puntuación y soporte multiidioma.
  3. 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
Solo lectura
/**
 * 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
1 Pregunta
Pregunta 1
¿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.