Teleprompter transparente para cantar: reconoce la canción que suena y muestra la letra sincronizada con karaoke en tiempo real.
Repositorio: https://github.com/Grizaceo/Singevery
Widget de escritorio transparente para cantar con la letra sincronizada: reconoce la canción que suena, muestra la letra con karaoke (palabra a palabra) y ofrece ayudas de lectura por idioma (furigana, romaji, ruby, romanización) más traducción línea a línea opcional.
App activa: apps/desktop — Electron + React 19 + TypeScript.
Página del proyecto: grizaceo.github.io/Singevery — qué hace, capturas y descarga directa.
Descarga el instalador de Windows desde GitHub Releases (Singevery-Setup-x.y.z.exe).
SmartScreen: el instalador no está firmado con certificado de código. Windows puede mostrar "Windows protegió tu PC". Pulsa Más información → Ejecutar de todos modos para continuar.
En la grabación:
- Pill SING o atajo Ctrl+Alt+S con música sonando (Spotify / navegador).
- Letra sincronizada sobre el escritorio (overlay transparente + click-through).
- Modos de lectura (原 / ふ / か / A / T) y ajustes (⚙).
- Reconoce música desde el audio del sistema o el micrófono (Shazam gratuito en modo auto, con fallback a AudD).
- Sincroniza la letra en tiempo real con resaltado karaoke y corrección de deriva.
- Overlay transparente sobre el escritorio: modo pill (SING), click-through mientras cantas, arrastrable.
- Windows: integración con el reproductor del SO vía SMTC (Spotify, navegador, etc.) como reloj maestro cuando está disponible.
La app detecta el script del texto y genera lecturas sin destruir la letra original. El render <ruby> sirve igual para furigana japonés que para pinyin o romanización sobre cirílico.
| Idioma / script | Qué genera |
|---|---|
| Japonés | Furigana (kana sobre kanji), romaji Hepburn, modo kana (todo en hiragana) |
| Coreano | Romanización Revisada + ruby por palabra |
| Chino | Pinyin por carácter + ruby (tonos opcionales en Ajustes) |
| Cirílico (ruso, etc.) | Romanización latina por palabra + ruby (el “romaji” del cirílico) |
| Español · italiano · francés · alemán | Transcripción IPA (fonética real, no aproximación de teclado) |
| Otros | Transliteración latina + ruby por token cuando hay espacios |
El romaji te dice qué teclas pulsar; el IPA te dice qué hacer con la boca. En
japonés し es /ɕi/, no “shi”. En alemán ich es /ʔɪç/ y Nacht es /naxt/:
la misma ⟨ch⟩ escrita, dos sonidos distintos según la vocal anterior. En italiano
notte es /notːe/ con la consonante larga que ocupa tiempo musical.
Para las cuatro lenguas de alfabeto latino la app identifica el idioma sola a partir de la letra completa (palabras funcionales, diacríticos y secuencias ortográficas). Si no hay evidencia suficiente, o la canción está en un idioma sin motor —inglés, portugués—, no anota nada: es preferible no responder a transcribir con las reglas equivocadas.
| Idioma | Precisión | Qué queda fuera |
|---|---|---|
| Español | Exacta | Sin acento tónico ni encadenamiento entre palabras. Norma seseo/distinción configurable en Ajustes |
| Italiano | Exacta | e/o abiertas o cerradas solo con tilde; z se transcribe sorda |
| Alemán | Aproximada | La cantidad de la vocal ante ⟨ch⟩ es léxica y se resuelve breve |
| Francés | Aproximada | Sin liaison; el final -ent verbal y algunos timbres son aproximados |
| Japonés | Exacta | Tabla kana→IPA exhaustiva (ver docs/PLAN_IPA_2026-08-03.md) |
Detalle de las reglas y de cada límite: docs/IPA_LENGUAS_LATINAS_2026-08-04.md.
| Control | Función |
|---|---|
| 原 / Orig | Texto original |
| ふ / Ruby | Lectura encima (furigana, pinyin, romanización…) |
| か | Solo hiragana (japonés; ideal si aún no lees kanji/katakana) |
| A | Romanización latina |
| ふ+A / R+A | Ruby + romanización debajo de la línea actual |
| IPA | Transcripción fonética (japonés, español, italiano, francés, alemán) |
| ふ+IPA | Furigana arriba + IPA debajo (japonés) |
| T | Traducción de la línea actual |
| ? | Ayuda con ejemplos por idioma (+ enlace a Tofugu Hiragana en japonés) |
Las etiquetas se adaptan al idioma de la canción (p. ej. 原/ふ/A en japonés, Orig/Ruby/A en el resto).
En Ajustes (⚙) → Color de letra puedes personalizar cómo se ve el texto del teleprompter:
| Opción | Descripción |
|---|---|
| Presets | Blanco, amarillo, cian, verde, rosa, negro |
| Color personalizado | Selector libre (#hex) |
| Ajuste automático (experimental) | Mide el brillo del fondo bajo el widget y elige texto claro u oscuro para mantener contraste |
El color elegido se aplica a toda la jerarquía visual (línea actual, adyacentes, lejanas, karaoke cantado, romaji y traducción). En modo automático se conserva tu color preferido mientras contraste con el fondo; si no, cae a blanco u oscuro puro.
Experimental: el ajuste automático captura una miniatura de pantalla cada ~3 s (procesada en memoria, sin almacenar ni enviar). Puede producir un ligero parpadeo en Windows. Mientras está activo, el widget no aparece en grabaciones ni en compartir pantalla (
setContentProtection).
Al activar T se traduce la canción completa y el resultado se cachea en disco. El botón cicla entre tres vistas: sin traducción → bajo la línea actual → texto paralelo (letra y traducción en columnas, iluminándose a la par).
Funciona sin configurar nada. El proveedor por defecto es MyMemory, que no pide registro ni clave. Su cuota gratuita es de ~5.000 caracteres al día (unas 3 canciones); poniendo un email en Ajustes sube a 50.000 (~30 canciones).
Configura en Ajustes (⚙) → Traducción:
| Campo | Descripción |
|---|---|
| Proveedor | MyMemory (default, sin clave) · Modelo local · DeepL o Google con tu clave |
| Email / API key | En MyMemory, email opcional para subir la cuota. En DeepL/Google, tu clave |
| Idioma destino | Código ISO (default es) |
Traduce con un modelo en tu propio equipo: sin cuota diaria, sin conexión y sin mandar las letras a un tercero. Necesitas un runtime con API compatible con OpenAI; el más simple es Ollama:
ollama pull translategemma:4b # ~3 GB, Gemma 3 afinado para traducir, 55 idiomasLuego en Ajustes → Traducción → Modelo local. Por defecto apunta a
http://localhost:11434/v1/chat/completions con translategemma:4b; ambos
campos son configurables, así que también sirven LM Studio, llama.cpp server o
Jan, y cualquier otro modelo (translategemma:12b, gemma3, etc.).
Con un 4B la canción tarda unos segundos en CPU y es casi instantánea con GPU.
DeepL y Google dan buena calidad sin instalar nada, pero requieren que consigas una credencial.
apps/desktop/ App Electron (main + renderer React)
native/smtc/ Sidecar C# (.NET 8) — metadata del reproductor Windows
native/wakeword/ Referencia para activación por voz (opt-in)
legacy/ Código archivado (Python/kiosk) — no se mantiene
cd apps/desktop
npm install
npm run dev:electron # Windows: GPU on · Linux: GPU off (auto)
npm run dev:electron:win # Windows explícito
npm run dev:kill # Si no abre tras Ctrl+C: mata Electron + puerto 5173-
Compila el sidecar SMTC (sincronización precisa con Spotify, etc.):
.\native\smtc\build.ps1
-
Opcional: crea
apps/desktop/.envcon tu token de AudD (fallback):AUDD_API_TOKEN=tu_token
-
Opcional: en Ajustes → Traducción, pon tu email (sube la cuota gratuita) o una clave de DeepL/Google para mejor calidad.
-
Atajo global Ctrl+Alt+S o clic en la pill SING para expandir e identificar.
Guía completa: apps/desktop/WINDOWS.md.
| Modo | Descripción |
|---|---|
| Auto (default) | Shazam (gratis, sin API key) → AudD si hay token y Shazam no reconoce |
| Shazam | Solo cliente no oficial |
| AudD | Requiere AUDD_API_TOKEN en .env |
Selector en Ajustes (⚙) del widget. También ahí: opacidad, color de letra, fuente, traducción (MyMemory sin clave, o DeepL/Google) y pinyin con/sin tonos.
npm test # Vitest (456 tests)
npm run build # Build producción
npm run package # Instalador Windows (electron-builder)Desde apps/desktop, con Node y el SDK de .NET 8 instalados:
npm run package:fullEsto (1) publica el sidecar SMTC autocontenido (npm run build:smtc — el
equipo destino no necesita .NET instalado), (2) hace el build de producción,
(3) regenera build/THIRD-PARTY-NOTICES.txt con las licencias de las
dependencias y (4) produce release/Singevery-Setup-<version>.exe.
El instalador muestra la licencia (build/license.txt) y deja junto al
ejecutable GUIA_DE_USO.md, AVISO_LEGAL.md, LICENSE.txt y
THIRD-PARTY-NOTICES.txt. Si solo cambiaste código de la app (no el sidecar),
basta npm run package.
El instalador no va firmado con certificado de código (SmartScreen avisará la primera vez). Para distribución seria, considerar un certificado OV/EV más adelante.
- Guía de uso — instalación y uso paso a paso, sin conocimientos técnicos.
- Aviso legal — licencia, letras y servicios de terceros, marcas y privacidad.
MIT — Copyright © 2026 Gris. Licencias de terceros: se generan en
apps/desktop/build/THIRD-PARTY-NOTICES.txt y se instalan con la app.
