Saltar al contenido
← Todo Open Source y Labs
PROYECTO DE LABORATORIO

HermesVoice

Habla con un LLM local o remoto usando tu voz. macOS nativo, voz en el dispositivo, cero dependencias.

Open source · MIT2026
0 DependenciasEn el dispositivo VozCompatible con OpenAI Backends

HermesVoice es una app nativa de macOS, con una interfaz al estilo del HUD de J.A.R.V.I.S., que sostiene una conversación hablada con cualquier backend compatible con OpenAI: una instancia de Hermes Agent de Nous Research, OpenAI, Ollama o LM Studio. El reconocimiento y la síntesis de voz corren en el dispositivo con los frameworks Speech y AVFoundation de Apple, así que el audio nunca sale de la Mac: solo se envía al modelo el texto transcrito. Está escrita en Swift y SwiftUI sin ninguna dependencia de terceros: sin paquetes SPM, sin CocoaPods, sin nada que vendorizar.

Lenguaje
Swift
Corre en
macOS 14+
Licencia
MIT
Estado
Open source · MIT
Año
2026
EL PIPELINE

Cómo funciona

  1. MicrófonoTap de un AVAudioEngine compartido
  2. ReconocimientoSFSpeechRecognizer, en el dispositivo
  3. ModeloPOST /v1/chat/completions, SSE
  4. Buffer de frasesHabla en la primera frase completa
  5. SíntesisAVSpeechSynthesizer, en el dispositivo
EL LOOP DE VOZ

Los cinco estados

  • ListoRespiración lenta, azul tenue
  • EscuchandoLos filamentos siguen al micrófono
  • ProcesandoPulso rápido, arco que barre
  • HablandoOndas que siguen a la voz
  • ErrorContraído, parpadeando
INGENIERÍA

Lo interesante por dentro

01

Voz en el dispositivo, en los dos sentidos

SFSpeechRecognizer transcribe y AVSpeechSynthesizer habla, usando las voces de Siri ya instaladas en la máquina. El selector de idioma solo lista los idiomas que la Mac puede oír y hablar, y marca los que tendrían que salir del dispositivo para transcribirse.

02

Responde mientras el modelo piensa

La respuesta llega como server-sent events y pasa por un buffer de frases, así que la app empieza a hablar en la primera frase completa en lugar de esperar la respuesta entera. Si hablas encima, se detiene a media frase: la interrupción lee los mismos buffers de audio que el reconocedor.

03

Un solo motor de audio para todo

Un único AVAudioEngine compartido atiende el tap del micrófono, la reproducción y la medición. Eso es lo que hace que la forma de onda sea una FFT real del audio en vivo (el micrófono mientras hablas, la voz sintetizada mientras responde) y que detenerla sea instantáneo.

04

Cualquier idioma, cambiable a mitad de conversación

Un solo ajuste controla el reconocimiento, la síntesis y el idioma en que responde el modelo. El system prompt se mantiene en un idioma y añade una directiva que nombra el idioma de respuesta, así que agregar un idioma no cuesta más que una voz que la Mac ya tiene.

05

Spec-first, un pull request por tarea

La arquitectura, el contrato de la API y la UI se escribieron en SPEC.md antes que el código, y luego se construyeron como 15 tareas con criterios de aceptación, un PR cada una. Las capturas del README se renderizan desde las vistas SwiftUI reales con ImageRenderer dentro de los tests, así que no pueden quedar desactualizadas frente a la UI.

Construido con

Construido con

SwiftSwiftUIAVFoundationAVAudioEngineSFSpeechRecognizerAVSpeechSynthesizerAccelerate (FFT)KeychainServer-Sent EventsOpenAI-compatible APIXCTest
POR QUÉ EXISTE

Quería saber hasta dónde llega un agente de voz sin servicios de voz en la nube y sin dependencias. La respuesta: el loop completo, en una laptop, con el modelo como único costo. La máquina de estados, el manejo de interrupciones y el buffer de frases son las partes que se trasladan directo al trabajo con clientes.

CONSULTORÍA
13+ años · Web, Mobile, IA · ES / EN

Cuando necesitas criterio,
no solo código.

Más de una década enviando producto en web, mobile e IA me dejó algo más valioso que stack: criterio. Si tu equipo está atascado en una decisión técnica, evaluando un stack, o necesita una segunda opinión antes de invertir meses en una dirección, conversemos.

WhatsAppLinkedInUpwork