La era de escribir está terminando. Como explicamos en nuestra guía de SEO para búsqueda por voz, el comportamiento del usuario ha cambiado fundamentalmente en 2026. El diseño “teclado primero” se está convirtiendo en un concepto heredado. Con el auge de la “IA Ambiental”, donde las computadoras son auditores omnipresentes en lugar de simples pantallas, la expectativa de Interacción Multimodal (Voz, Gesto, Mirada) es el estándar.
Los usuarios no quieren escribir “Desarrollador WordPress Madrid”; quieren preguntar, “Encuéntrame un experto en WordPress cerca”. Esta transición representa una oportunidad enorme para los sitios WordPress que se preparen adecuadamente, y un riesgo significativo para los que ignoren esta tendencia.
Mientras los widgets de avatar IA renderizan impresionantes avatares conversacionales en 3D, creemos que el primer paso crítico para la mayoría de los sitios WordPress de alto rendimiento es una interfaz de búsqueda por voz robusta, performante y nativa.
Este caso de estudio documenta cómo construyo el botón de búsqueda por voz de la barra de búsqueda de wppoland.com: cero plugins, cero bloat, JavaScript puro. Cubre la implementación técnica, adónde va realmente el audio, qué navegadores lo soportan en octubre de 2026 y por qué elegimos esta ruta sobre los pesados widgets de terceros.
Por qué los widgets de avatar IA empeoran Core Web Vitals
Antes de elegir la búsqueda por voz nativa, la comparamos con los widgets incrustables de “Avatar IA”.
Cómo los widgets de avatar IA ralentizan el LCP y el INP
Los avatares conversacionales son visualmente impactantes. Usan WebGL para renderizar rostros realistas que sincronizan labios con audio generado por IA. Sin embargo, para un sitio corporativo o portfolio de alto rendimiento, introducen una “Deuda de Rendimiento” significativa que puede destruir tus métricas Core Web Vitals.
LCP (Largest Contentful Paint): Cargar un motor 3D (como Three.js) y assets de personaje a menudo bloquea el hilo principal y retrasa el LCP.
INP (Interaction to Next Paint): Los bucles de animación constantes y los event listeners pueden causar micro-stutters al hacer scroll o clic. Estos stutters degradan la experiencia del usuario y penalizan directamente tu puntuación INP.
Overhead de privacidad: Enviar flujos de audio continuos a un servidor de terceros plantea obstáculos de cumplimiento GDPR que complican significativamente la implementación para sitios que operan en la Unión Europea o atienden a usuarios europeos.
Nuestro objetivo: Habilitar interacción “IA Ambiental”, permitiendo a los usuarios hablar con el sitio de forma natural, sin sacrificar nuestra puntuación PageSpeed ni añadir otro script de terceros.
Qué hace la Web Speech API en la búsqueda por voz
Chrome, Edge y Safari incluyen una interfaz que muchos desarrolladores pasan por alto: la Web Speech API. Tiene dos mitades. SpeechRecognition convierte el audio del micrófono en texto y SpeechSynthesis convierte texto en audio hablado. La especificación es un borrador de informe de Community Group (Draft Community Group Report) mantenido en el repositorio del W3C Audio Community Group, no una recomendación del W3C, y MDN marca SpeechRecognition como de “disponibilidad limitada”, es decir, no es Baseline.
- Sin bibliotecas externas: El motor de reconocimiento lo aporta el navegador, así que el único código que envías es el que une la API con tu formulario de búsqueda.
- Sin contrato con un proveedor: No te das de alta en una API de voz a texto ni gestionas claves.
- No siempre es local: El reconocimiento se ejecuta donde decide el navegador. La siguiente sección explica por qué importa.
Web Speech API vs. widget de avatar IA
| Característica | Web Speech API Nativa | Widget IA Externo |
|---|---|---|
| Tamaño del Bundle | 0kb de biblioteca (Nativo del Navegador) | Script del proveedor, motor 3D y assets del personaje |
| Privacidad | Servicio del fabricante del navegador por defecto, en el dispositivo si se solicita | Nube del proveedor del widget |
| Rendimiento | No se carga nada hasta que el usuario pulsa el micrófono | Alto Uso de CPU |
| Integración | Código Personalizado (<50 líneas) | Script Drop-in |
| Costo | Gratis | Tarifa del proveedor |
| Visuales | Invisible (Dirigido por UI) | Avatar 3D |
Para wppoland.com, la elección fue clara: el rendimiento es nuestra marca. Elegimos la solución nativa sin dudarlo.
Adónde envía la Web Speech API el audio de voz
La Web Speech API no promete procesamiento local. La guía de MDN lo dice sin rodeos: “Por defecto, usar el reconocimiento de voz en una página web implica un motor de reconocimiento basado en servidor. Tu audio se envía a un servicio web para su procesamiento, así que no funcionará sin conexión.” (MDN, Using the Web Speech API, traducción propia). En Chrome, ese servicio web pertenece al fabricante del navegador, no a ti ni al autor de un plugin.
La especificación ofrece ahora una alternativa opcional. Fijar recognition.processLocally = true antes de start() “indica un requisito” de que el reconocimiento ocurra en el dispositivo (traducción propia). El modo en el dispositivo necesita un paquete de idioma por cada idioma. Si falta el paquete, start() falla con el error language-not-supported. Dos métodos estáticos gestionan los paquetes:
SpeechRecognition.available({ langs, processLocally })se resuelve comounavailable,downloadable,downloadingoavailable.SpeechRecognition.install({ langs })descarga los paquetes y se resuelve comotrueofalse.
Ambos métodos están controlados por la directiva de Permissions-Policy on-device-speech-recognition, cuya lista de permitidos por defecto es self, así que un iframe de otro origen no puede llamarlos salvo que la página padre le delegue la función.
Para un sitio con visitantes de la UE, la consecuencia práctica es sencilla: un botón de voz en modo por defecto envía la voz al servicio de reconocimiento del fabricante del navegador, y tu aviso de privacidad debería decirlo con palabras claras. Nuestra afirmación de “privacidad primero” solo se sostiene en el sentido más estrecho de que ningún plugin ni proveedor de widgets de terceros recibe el audio.
Cómo solicitar reconocimiento en el dispositivo con alternativa
const SR = window.SpeechRecognition || window.webkitSpeechRecognition;
const lang = document.documentElement.lang || 'es-ES';
const recognition = new SR();
recognition.lang = lang;
if (typeof SR.available === 'function') {
const status = await SR.available({ langs: [lang], processLocally: true });
if (status === 'available') {
recognition.processLocally = true; // el audio se queda en el dispositivo
} else if (status === 'downloadable') {
// Ofrece la descarga tras una acción del usuario; si no, usa el motor en servidor
}
}MDN señala que las implementaciones que admiten el reconocimiento en el dispositivo lo hacen sin prefijos, así que available() solo existe en el constructor sin prefijo. Detecta la función, nunca la des por supuesta.
Qué navegadores soportan la Web Speech API en 2026
La tabla procede de browser-compat-data de MDN, versión 8.1.6 (15 de octubre de 2026). Los números indican la primera versión con soporte.
| Navegador | SpeechRecognition | En el dispositivo (processLocally, available(), install()) | SpeechSynthesis |
|---|---|---|---|
| Chrome (escritorio y Android) | 139 sin prefijo, 33 como webkitSpeechRecognition | 139 (experimental) | 33 |
| Edge | 139 sin prefijo, 79 con prefijo | 139 (experimental) | 14 |
| Safari (macOS) | 14.1, solo con prefijo webkit | Sin soporte | 7 |
| Safari (iOS) | 14.5, solo con prefijo webkit | Sin soporte | 7 |
| Firefox | Solo versiones preview | Solo versiones preview | 49 |
| Samsung Internet | 30.0 sin prefijo, 2.0 con prefijo | No figura | 3.0 |
De aquí salen tres conclusiones para un tema de WordPress. Mantén la alternativa window.SpeechRecognition || window.webkitSpeechRecognition, porque Safari sigue teniendo solo el nombre con prefijo. Oculta el botón del micrófono cuando no exista ninguno de los dos constructores, porque si no los usuarios de Firefox estable verían un botón que no hace nada. Trata el reconocimiento en el dispositivo, por ahora, como un extra exclusivo de Chromium.
Cómo implementar búsqueda por voz con JavaScript
Agregamos esta funcionalidad a nuestro componente SearchInput.astro. Esto asegura que la barra de búsqueda sea la única fuente de verdad tanto para consultas de texto como de voz.
Paso 1: Detección de funcionalidades
Primero, debemos respetar las capacidades del navegador del usuario. Nunca asumimos que una API existe.
// Verificar si el navegador soporta SpeechRecognition
if ('webkitSpeechRecognition' in window || 'SpeechRecognition' in window) {
const voiceBtn = document.getElementById("voice-search-btn");
voiceBtn.classList.remove("hidden"); // Solo mostrar boton si hay soporte
}Paso 2: Código de reconocimiento de voz
Aquí está una versión simplificada del código. Fíjate en la alternativa con el prefijo webkit: los navegadores Chromium aceptan el nombre sin prefijo desde la versión 139, pero Safari sigue exponiendo solo webkitSpeechRecognition.
// 1. Inicializar
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
// 2. Configuración
recognition.continuous = false; // Detener despues de una oracion
recognition.interimResults = false; // Solo devolver resultados finales
recognition.lang = document.documentElement.lang || 'es-ES'; // Soporte de idioma dinamico
// 3. Event Handlers
recognition.onstart = () => {
// El feedback visual es crucial para UI de voz
voiceBtn.classList.add("text-red-500", "animate-pulse");
searchInput.placeholder = "Escuchando...";
};
recognition.onend = () => {
// Limpiar estado de UI
voiceBtn.classList.remove("text-red-500", "animate-pulse");
searchInput.placeholder = "Buscar...";
};
recognition.onresult = (event) => {
// 4. Capturar Transcripcion
const transcript = event.results[0][0].transcript;
searchInput.value = transcript;
// 5. UX: Auto-enviar despues de una pausa natural
setTimeout(() => searchInput.form.submit(), 500);
};
// 6. Disparador
voiceBtn.addEventListener('click', () => recognition.start());Si dejas lang sin definir, la especificación recurre al idioma del elemento raíz del documento, así que un atributo <html lang> correcto ya da a cada idioma del sitio el idioma de reconocimiento adecuado.
Paso 3: Manejo de errores
El uso en el mundo real es desordenado. Los usuarios deniegan permisos de micrófono o los fondos son ruidosos. Agregamos manejo de errores para volver al input de texto si el micrófono está bloqueado.
recognition.onerror = (event) => {
console.log('Error de voz:', event.error);
// Volver elegantemente al input de texto
searchInput.placeholder = "Buscar...";
voiceBtn.classList.remove("text-red-500", "animate-pulse");
};Qué errores de reconocimiento de voz hay que manejar
El evento error lleva uno de los ocho códigos definidos en la especificación. Cada uno pide una reacción distinta:
| Código de error | Qué dice la especificación | Reacción sensata |
|---|---|---|
no-speech | No se detectó voz | Ignorarlo o reiniciar sin aviso, el usuario simplemente no habló |
aborted | La entrada de voz se interrumpió, por ejemplo por el usuario | Reiniciar la interfaz sin mensaje |
audio-capture | Falló la captura de audio | Mostrar un error de micrófono |
network | Falló una comunicación de red necesaria | Sugerir escribir, el motor en servidor no está accesible |
not-allowed | Bloqueado por motivos de seguridad, privacidad o preferencias del usuario | Indicar que el micrófono está bloqueado en los ajustes del navegador |
service-not-allowed | El navegador no permite el servicio de voz solicitado | El mismo mensaje que con not-allowed |
language-not-supported | El idioma no está soportado | Reintentar sin processLocally u ocultar el botón para ese idioma |
phrases-not-supported | El modelo no puede aplicar frases de contexto | Quitar la lista phrases y reintentar |
En qué se diferencia nuestro componente de producción del ejemplo mínimo
El SearchInput.astro en producción va más allá del fragmento anterior, y cada diferencia salió del uso real:
- Resultados provisionales activados: fija
continuous = trueeinterimResults = true, escribe cada transcripción parcial en el campo mientras el usuario habla y solo envía cuando llega un resultado conisFinalentrue. El usuario ve aparecer las palabras en lugar de esperar en silencio. - Parada explícita: tras el resultado final llama a
recognition.stop()y envía el formulario 500 ms después. - Botón conmutador: un segundo clic en el micrófono detiene la escucha. Una variable
isListeningguarda el estado. - Arranque protegido:
start()va dentro detry/catch, porque la especificación lanza unInvalidStateErrorcuando ya hay una sesión en marcha. - Clasificación de errores:
no-speechse ignora,abortedno muestra nada,not-allowedmuestra en el placeholder un aviso traducido de “micrófono bloqueado”, cualquier otro código muestra un error genérico de micrófono, y el placeholder original vuelve a los 3 segundos. - Textos traducidos: los textos de escucha, bloqueo y error existen en los seis idiomas del sitio y llegan al script a través de atributos
data-del botón.
Cómo añadir búsqueda por voz a un tema de WordPress
El mismo script funciona en un tema clásico de WordPress, porque la búsqueda de WordPress es un formulario GET normal. get_search_form() busca primero searchform.php en el tema hijo o en el padre y lo carga; si no existe, imprime el formulario por defecto, cuya versión HTML5 es un <form role="search"> que envía a home_url( '/' ) con un campo llamado s (developer.wordpress.org). Dos hooks lo modifican sin plantilla: el filtro get_search_form para el HTML y search_form_format para el formato.
La integración tiene tres partes:
- Añade un
<button type="button">con etiqueta accesible junto al camposensearchform.php, oculto por defecto. - Apunta el script a ese campo y llama a
form.submit()tras el resultado final. La consulta llega a la página normal de resultados de búsqueda, así que nada cambia en el servidor. - Carga el script con
wp_enqueue_script()y pasaarray( 'strategy' => 'defer', 'in_footer' => true )como quinto argumento. Desde WordPress 6.3 ese argumento acepta un array con la clavestrategyy el valordeferoasync(developer.wordpress.org), así que el código de voz nunca bloquea el renderizado.
Pasa los textos traducidos de “Escuchando…” y de error con wp_localize_script() o con atributos data- generados con esc_attr__(), para que el botón hable el mismo idioma que el tema.
Cómo diseñar la UX de la búsqueda por voz
La voz es invisible. Sin una pantalla, el usuario no tiene “cursor” para saber dónde está. Por lo tanto, el feedback de UI es crítico para cerrar la brecha entre la intención humana y la ejecución de la máquina.
Cómo mostrar que el micrófono está escuchando
Cuando el usuario hace clic en el micrófono, la interfaz debe responder inmediatamente.
- Animación de Pulso: Aplicamos una clase CSS
animate-pulseal icono del micrófono. Un indicador rojo o pulsante es un significante universal para “Grabando”. - Feedback en Placeholder: El texto del input cambia a “Escuchando…”. Esto confirma que el sistema está listo para recibir entrada, evitando que el usuario hable demasiado pronto.
La especificación añade dos requisitos firmes del lado del navegador. Una sesión de reconocimiento solo puede empezar tras un consentimiento explícito e informado del usuario, como un clic en un control de voz claro, y el navegador debe mostrar un indicador evidente mientras graba audio que además permita al usuario detenerlo. Tu icono pulsante complementa ese indicador, no lo sustituye.
Por qué retrasar el envío de la búsqueda reconocida
Implemento un retraso de 500ms entre capturar el texto y enviar el formulario. Esto le da al usuario una fracción de segundo para ver qué escuchó la IA. Si la IA entendió mal “WordPress” como “Word Press”, ver el texto permite al usuario confiar en que el sistema está funcionando, incluso si el resultado es ligeramente incorrecto.
Accesibilidad de la búsqueda por voz
La búsqueda por voz debe complementar, no reemplazar, la búsqueda por texto. Los usuarios con discapacidades auditivas o del habla, o en entornos ruidosos, deben poder usar la búsqueda tradicional sin fricción. El botón de voz solo aparece cuando el navegador soporta la API, lleva un aria-label, y la funcionalidad de búsqueda por texto permanece intacta en todos los casos.
Cómo leer en voz alta las respuestas con síntesis de voz
La segunda mitad de la API cubre la salida. window.speechSynthesis devuelve el controlador SpeechSynthesis, que la especificación define como “la API web programable para controlar una salida de texto a voz” (traducción propia). Pone en cola objetos SpeechSynthesisUtterance y los pronuncia en orden, con speak(), cancel(), pause(), resume() y getVoices(). El soporte es mucho más amplio que el del reconocimiento: Chrome 33, Edge 14, Firefox 49 y Safari 7 según browser-compat-data.
function speak(text: string) {
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = document.documentElement.lang || 'es-ES';
speechSynthesis.cancel(); // descarta lo que siga en cola
speechSynthesis.speak(utterance);
}Una trampa: en Chrome la lista de voces se llena de forma asíncrona. MDN aconseja llamar a getVoices() una vez y de nuevo en el evento voiceschanged, porque los navegadores antiguos devuelven la lista de inmediato mientras que Chrome necesita antes el evento. Un botón de “leer en voz alta el primer resultado” construido así cierra el circuito de voz sin código en el servidor.
Qué soporta realmente Google con speakable schema
Construir esta funcionalidad es, ante todo, una cuestión de experiencia de usuario. En el lado de la búsqueda, el marcado relevante es speakable.
La búsqueda por voz y el E-E-A-T
Implementar APIs actuales del navegador demuestra Expertise técnico (la ‘E’ en E-E-A-T) ante las personas que usan el sitio. Google no documenta la entrada por voz como factor de posicionamiento, así que trátala como una función de usabilidad, no como una palanca SEO.
Cómo combinar la búsqueda por voz con speakable schema
Schema.org define speakable como una propiedad de Article y WebPage que “indica secciones de una página web especialmente ‘pronunciables’” (traducción propia), señaladas con selectores CSS o XPaths dentro de un SpeakableSpecification (schema.org). La documentación de Google reduce bastante su valor práctico:
- La función “está en beta y sujeta a cambios” (traducción propia).
- Funciona para usuarios en EE. UU. con dispositivos Google Home configurados en inglés, y solo para editores que publican contenido en inglés.
- El Asistente de Google la usa para responder consultas de noticias de actualidad en altavoces inteligentes.
- Google recomienda unos 20 a 30 segundos de audio, aproximadamente dos o tres frases, por sección speakable, y
cssSelectoroxPath, nunca ambos (Google Search Central).
Combinamos la entrada por voz con marcado speakable en nuestros artículos porque cuesta un solo bloque de frontmatter, pero no esperamos que Google lea en voz alta un artículo que no es una noticia. La parte SEO completa de la voz, con fragmentos destacados y marcado FAQ, está en nuestra guía de SEO para búsqueda por voz.
Qué viene después de la búsqueda por voz en una web
Esta implementación representa la Etapa Uno de la interacción IA moderna.
- Etapa Uno (Actual): Comando Voz-a-Texto. El usuario habla, el sitio ejecuta una búsqueda basada en texto.
- Etapa Dos (Siguiente): Interfaces Conversacionales. El sitio usa un LLM (como la Realtime API de OpenAI) para entender la intención y “dibujar” una UI personalizada en respuesta.
Por ejemplo, en lugar de buscar “Precios”, un usuario podría decir: “Muéstrame planes para una agencia pequeña.” El sitio entonces renderizaría dinámicamente una tabla comparativa filtrada a esa necesidad específica.
Para llegar a la Etapa Dos, debes dominar la Etapa Uno. La Búsqueda por Voz Nativa que construyo hoy es la base para la Web Multimodal del mañana.
Es rápida, no envía código de terceros y, con processLocally, puede mantener la voz en el dispositivo en los navegadores que lo soportan.
Explora nuestra optimización de velocidad WordPress para llevar tu proyecto más lejos. Consulta también nuestros servicios de desarrollo WordPress para implementar funcionalidades avanzadas en tu sitio.







