Un orquestador local, no un servicio en la nube

PiperRead es un script Bash ligero que se sitúa entre su escritorio y el motor neuronal de texto a voz Piper — no sintetiza voz por sí mismo. Piper se instala una vez, dentro de su propio entorno virtual de Python, por lo que nunca toca los paquetes Python ya presentes en su sistema.

La red interviene exactamente dos veces, cada una una sola vez: pip descarga el motor Piper (unos 75 MB, de 200 a 250 MB una vez descomprimido), y un modelo de voz (un archivo .onnx, de unas decenas de megabytes) se descarga la primera vez que usted elige uno. Después de eso, leer una selección consta de tres pasos locales — capturar el texto, pasarlo por el motor ya presente en el disco, reproducir el audio resultante con aplay — y ninguno de los tres abre una conexión de red. Ningún texto que usted seleccione o copie sale de la máquina para ser leído en voz alta.

Lectura de la selección: Wayland y X11

PiperRead nunca escribe ni pega en otra ventana — solo lee hacia afuera, desde lo que esté seleccionado o copiado, hacia el motor. Esa captura unidireccional es el único punto en el que Wayland y X11 siguen rutas distintas, y la diferencia es una elección de herramienta, no una diferencia de comportamiento:

Fuente leídaWaylandX11
Selección del ratón (primaria)wl-paste --primaryxsel --primary
Portapapeleswl-pastexsel --clipboard

No se comprueba XDG_SESSION_TYPE ni ninguna otra marca de sesión. read.sh prueba primero el comando de Wayland; si falta, o solo devuelve caracteres en blanco, recurre al comando de X11. En Wayland, wl-paste tiene éxito y la ruta de X11 nunca se alcanza; en X11, wl-paste está ausente o solo devuelve caracteres en blanco, por lo que xsel toma el relevo en su lugar. De forma predeterminada, PiperRead prueba primero la selección del ratón y solo lee el portapapeles si no hay nada seleccionado; solicitar explícitamente el modo solo-selección o solo-portapapeles omite esa alternativa y lee únicamente el que usted haya indicado.

La interfaz

PiperRead también incluye una interfaz, en un paquete aparte que la página de descargas instala junto con el lanzador: un icono de bandeja que se inicia con su sesión y mantiene la voz cargada. No sustituye al lanzador, y ninguno dirige al otro. Ejecuta el motor Piper como un programa aparte que responde por HTTP, solo en 127.0.0.1 y nunca en una interfaz de red, y captura el texto como lo hace el lanzador (selección del ratón, luego portapapeles) en Linux, o desde el portapapeles en Windows. Sintetiza la frase siguiente mientras se reproduce la actual, que es lo que muestra la segunda medición de más abajo.

Icono de PiperRead en el panel de KDE Plasma, con su menú abierto: Reproducir, Pausa, Detener, Frase anterior, Frase siguiente, Ajustes…, Reiniciar, Salir Icono de PiperRead en la barra superior de GNOME, con el mismo menú abierto Icono de PiperRead en el área de notificación de Windows 11, con el mismo menú abierto
El icono en la bandeja del sistema, con su menú abierto por un clic derecho: KDE Plasma, GNOME con la extensión AppIndicator y Windows 11.

Tampoco hay eventos de uso

La biblioteca de inferencia que Piper incorpora, onnxruntime, envía eventos de uso a Microsoft de forma predeterminada. PiperRead los desactiva antes de iniciar el motor: strace no muestra ninguna conexión al exterior durante la lectura, ni con el lanzador ni con la interfaz. En Windows la biblioteca notifica sus eventos al sistema en lugar de enviarlos ella misma, por lo que PiperRead utiliza el propio interruptor de la biblioteca; una medición aun así encontró 4 eventos de inicialización, frente a 15 sin el interruptor. El ajuste telemetry=on los vuelve a activar.

Qué significa realmente “latencia cero” y qué se midió

“Latencia cero” expresa primero un hecho arquitectónico: como Piper se ejecuta como un proceso local, no hay ida y vuelta por la red entre seleccionar una frase y el primer sonido — nada que esperar de un servidor remoto. No es una promesa de duración. Se midieron dos duraciones, y se publican aquí con sus condiciones.

RutaMedido
Lanzador: la voz se carga en cada clic1,31 a 1,34 s desde el lanzamiento hasta el primer byte de audio
Interfaz: la voz permanece cargada, la frase siguiente se prepara mientras se reproduce una168 ms desde el clic hasta la apertura del flujo de audio

Medido el 23 de septiembre de 2026, en Linux, en la máquina del mantenedor (32 núcleos), con la voz fr_FR-siwis-medium. En otra máquina o con otra voz las cifras cambian: dan un orden de magnitud, no una garantía. El lanzador cuesta unos 1,3 segundos porque inicia el motor y carga la voz en cada lectura. La interfaz lo paga una vez, al iniciarse, y mantiene la voz en memoria: unos 150 MB, hasta 370 MB tras el uso, y sin tiempo de procesador en reposo.