Logo Apisdom
InicioAPIsProyectosServiciosBlog
Volver a Proyectos

ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas

Extension de Chrome MV3 que convierte voz en texto en Gmail, ChatGPT, LinkedIn, Notion y cualquier web. Web Speech API del navegador, sin servidores propios, sin cuenta, sin telemetria. 10 idiomas.

Imagen principal de ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Categoría: Extensión de Navegador (Productividad)
Publicado: 17 de mayo de 2026
Actualizado: 5 de julio de 2026
Orden: #0
Ver Proyecto Vídeo relacionado

Galería del Proyecto

Imagen 1 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Imagen 2 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Imagen 3 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Imagen 4 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Imagen 5 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas
Imagen 6 del proyecto ApisVoice: Dictado por Voz en Cualquier Web con 10 Idiomas

Tecnologías Utilizadas

Chrome Extension MV3
JavaScript (ESM)
Web Speech API
Shadow DOM (closed)
Chrome Storage API
chrome.scripting
chrome.commands
AudioContext + AnalyserNode
SVG inline
TypeScript 5.6 (verificadores)

Sobre el Proyecto

Que es ApisVoice

ApisVoice es una extension de Google Chrome Manifest V3 que convierte la voz en texto dentro de cualquier pagina web. Inyecta un icono flotante en cada pestana, escucha al usuario, transcribe con la Web Speech API del navegador y escribe el resultado directamente en el campo donde tienes el cursor (input, textarea, contenteditable). En Google Docs el texto se copia automaticamente al portapapeles.

La pieza clave del proyecto es la privacidad por diseno: ApisDom (el responsable) NO esta en la cadena del audio. El audio lo procesa la Web Speech API del propio navegador. ApisVoice no tiene cuenta, no tiene servidores propios, no tiene telemetria y no toca el contenido de las paginas que visitas. Lo unico que se guarda es chrome.storage.local con tus preferencias: idioma, posicion del icono por dominio, dominios donde lo has ocultado y los timers de pausa que tu eliges.

PiezaValor
Manifest version3
Version publicada1.0.0
Chrome minimo100
Locale por defectoes (con traduccion completa a en)
Atajo de tecladoAlt+Shift+V (configurable en chrome://extensions/shortcuts)
Idiomas de dictado10 verificados
PermisosactiveTab, storage, scripting
Host permissions<all_urls> (solo para inyectar el icono, NO se lee contenido)
Pais y autorApisDom (apisdom.com)
Pagina oficialhttps://app.apisdom.com/apisvoice/
Politica de privacidadhttps://app.apisdom.com/privacidad/apisvoice/
Preguntas frecuenteshttps://app.apisdom.com/apisvoice/preguntas/

Los 10 idiomas de dictado

Unica fuente de verdad en src/config/languages.js. Cada idioma tiene nombre en espanol y en ingles para mostrarse correctamente segun el locale del navegador.

Codigo BCP-47Idioma
en-USIngles (Estados Unidos)
en-GBIngles (Reino Unido)
es-ESEspanol (Espana) (idioma por defecto)
es-MXEspanol (Mexico)
fr-FRFrances (Francia)
de-DEAleman (Alemania)
it-ITItaliano (Italia)
pt-BRPortugues (Brasil)
ja-JPJapones
ko-KRCoreano

Tres piezas del producto

PiezaRolTecnologia
Popup (popup.html)UI con 3 pestanas: Privacidad, Como funciona, Configuracion. Test de microfono, sliders de pausas, gestion de dominios ocultosHTML + CSS + JS modulo ESM
Service worker (background.js)Atajo de teclado, apertura de bienvenida en onInstalled, reinyeccion de content script en pestanas ya abiertas tras updateChrome chrome.runtime, chrome.commands, chrome.scripting
Content script (content.js)Icono flotante en Shadow DOM closed sobre cada pestana, reconocimiento de voz, insercion de texto en el campo activo, drag, persistencia por dominioShadow DOM, Web Speech API, SVG inline

Stack tecnico real

PiezaVersion / Detalle
Chrome Extension ManifestV3
JavaScriptESM nativo (type: "module" en background y popup)
TypeScript (verificadores)5.6
tsx (runner de verificadores)4.19
Web Speech APIwebkitSpeechRecognition con fallback a SpeechRecognition
Chrome APIsruntime, commands, tabs, scripting, storage.local
Audio (test de microfono)getUserMedia + AudioContext + AnalyserNode (RMS pico)
Insercion de textosetRangeText, execCommand('insertText'), Clipboard API
Aislamiento UIShadow DOM mode closed en el icono flotante
IconografiaSVG inline sobre viewBox 0..400, overlays propios (aro, X, botones de armado, minidisplay)
Landing local de desarrolloNode + Express 4.21 + open 11 (server.js)
Verificadores automaticos9 scripts bloqueantes en npm run verify

Politica de privacidad

Información Técnica

Slug del proyecto:

apisvoice-dictado-por-voz-en-cualquier-web-con-10-idiomas

ID del proyecto:

rJTsMwwadHrArMXt73AW

Estado:Publicado
Posición en lista:Orden #0

Documentación Específica del Proyecto

Arquitectura MV3 y flujo de dictado

Tres procesos, tres responsabilidades

ApisVoice respeta el modelo de proceso de Manifest V3: cada pieza tiene una unica responsabilidad y los limites estan definidos en manifest.json.

ProcesoArchivoResponsabilidadLimitaciones MV3 que se respetan
Service workerbackground.jsAtajo de teclado, apertura de welcome.html en primera instalacion, reinyeccion de content script en pestanas ya abiertas tras update, mantener vivo el port para que los content scripts huerfanos detecten la recargaSin DOM, sin window, sin alert. Solo imports ESM estaticos (los dinamicos estan prohibidos en service workers)
Content scriptcontent.js (1.529 lineas)Inyectar el icono flotante en cada pagina (<all_urls>), reconocer voz con webkitSpeechRecognition, insertar el texto en el campo activo, persistir posicion y estado por dominioAislamiento total con Shadow DOM mode: "closed". Guard idempotente con window.__apisvoiceLoaded. Limpieza de huerfanos con marcador data-apisvoice-host
Popuppopup.html + popup.jsUI con 3 pestanas (Privacidad, Como funciona, Configuracion). Live status bar, sliders de pausas con debounce de 300 ms, test de microfono, gestion de dominios ocultosModulo ESM. NO se ejecuta dictado aqui, solo configuracion

Pipeline del dictado (de la voz al campo de texto)

PasoQue ocurreCodigo
1. TriggerUsuario pulsa el icono flotante O el atajo Alt+Shift+Vchrome.commands.onCommand envia TOGGLE_DICTATION al content script de la pestana activa
2. Guard de dominioSi el dominio esta en hiddenDomains o en domainArmed = false, no se hace nadasrc/storage/preferences.js
3. Permiso de microfonoChrome muestra dialogo nativo. Si denegado, popup detecta y ofrece abrir chrome://settings/content/microphoneWeb Speech API + handler not-allowed
4. ReconocimientowebkitSpeechRecognition con continuous: true, interimResults: true, idioma del usuario (default es-ES)src/utils/recognition.js
5. Manejo de errores4 errores fatales (not-allowed, service-not-allowed, audio-capture, language-not-supported) detienen sin reintentar. network reintenta 3 veces con backoff 1s/2s/3sFATAL_ERRORS + MAX_RETRIES_NETWORK = 3
6. Puntuacion automaticaSi delta entre resultado anterior y actual supera pauseCommaMs (default 800 ms) o pausePeriodMs (default 1500 ms), se inserta , o .src/utils/punctuation.js
7. CapitalizacionSi el texto previo termina en . ! ? (o esta vacio), la primera letra del nuevo fragmento va en mayusculasrc/utils/capitalization.js
8. InsercionPrioridad: caso especial Google Docs (clipboard), <input>/<textarea> con foco (setRangeText), [contenteditable] (execCommand('insertText') con fallback a InputEvent y a clipboard)src/utils/insertText.js

Caso especial Google Docs

Google Docs renderiza el documento en canvas, no en DOM. setRangeText y execCommand no funcionan. ApisVoice detecta el hostname docs.google.com y conmuta directamente a Clipboard API. El usuario pega con Ctrl+V. Toast info.copied lo avisa.

Persistencia: 8 claves en chrome.storage.local

Toda la persistencia pasa por una unica capa (src/storage/preferences.js, regla ARCH1 del proyecto). Cualquier otro archivo que necesite leer o escribir DEBE importar desde aqui.

ClaveValor
apisvoice.hiddenDomainsstring[] con los dominios donde el usuario oculto el icono con la X
apisvoice.iconPosition{ [domain]: { x, y } } posicion del icono por dominio
apisvoice.domainArmed{ [domain]: boolean } toggle armado/apagado por dominio (default armado)
apisvoice.languageCodigo BCP-47 del idioma de dictado elegido
apisvoice.pauseCommaMsTimer personalizado para insertar coma (rango 500 a 1500 ms, step 50)
apisvoice.pausePeriodMsTimer personalizado para insertar punto (rango 1000 a 3000 ms, step 50)
apisvoice.installDateTimestamp ms de la primera instalacion (lo escribe background.js en onInstalled)
apisvoice.reviewPromptShowntrue cuando ya se mostro el modal de pedir resena (no vuelve a salir en esa instalacion)

Preguntas frecuentes →

Icono flotante en Shadow DOM closed

Por que un Shadow DOM closed y no un DOM normal

La extension inyecta su UI en cualquier pagina web (host_permissions: <all_urls>). Sin aislamiento, los estilos y scripts de la pagina podrian romper el icono o, peor, leerlo. Solucion: attachShadow({ mode: 'closed' }).

DecisionRazon
Shadow DOM closedLa pagina huesped no puede acceder al arbol del icono ni leer sus listeners. Aislamiento total de CSS y JS
Logo intacto, overlays propiosEl SVG del logo no se modifica. Aro perimetral, X de cerrar, botones verde/rojo de armado y minidisplay se construyen como overlays SVG sobre el mismo viewBox 0..400
z-index: 2147483647Limite maximo de int32. No garantiza estar siempre por encima (un stacking context superior puede taparlo) pero minimiza el riesgo
Marcador data-apisvoice-host="true"Permite detectar y limpiar iconos huerfanos de una version anterior tras una recarga de la extension
Guard window.__apisvoiceLoadedEvita duplicar el icono cuando el bootstrap se dispara dos veces (manifest content_scripts + reinyeccion via chrome.scripting.executeScript)

Drag con umbral de 5 px

Para distinguir un click intencional de un drag, ApisVoice usa el umbral DRAG_THRESHOLD_PX = 5. Si el movimiento del raton es menor de 5 px se trata como click (activa o detiene dictado). A partir de 5 px, modo drag: el usuario reposiciona el icono y la nueva posicion se guarda en chrome.storage.local bajo apisvoice.iconPosition[domain].

Colision con widgets de soporte conocidos

Si la pagina huesped ya tiene un widget de chat de soporte en la esquina inferior derecha, ApisVoice se reposiciona en bottom-left por defecto para no taparlo. Lista intencionalmente corta y conservadora.

Ecosistema detectadoSelectores comprobados al cargar
Intercom#intercom-container, iframe[name="intercom-frame"], .intercom-launcher
HubSpot#hubspot-messages-iframe-container
Zendesk#zendesk-launcher, iframe#launcher
Drift#drift-frame-controller, #drift-widget
Crisp#crisp-chatbox, .crisp-client

Estados visuales del aro perimetral

EstadoColor del aroSignificado
READYVerdeListo para grabar
RECORDINGRojoGrabando audio
PAUSEDNaranjaReconocimiento pausado
ERRORRojo intensoError de Web Speech API (network, permiso denegado, etc.)
DISARMEDApagado (toggle del mango)Icono visible pero la Web Speech API no se invoca aunque el usuario haga click

Tamano y posicion inicial

ConstanteValor
FLOATING_ICON_SIZE_PX112 (aprox. 2.1 cm a 96 dpi, confirmado por el usuario el 2026-05-04)
FLOATING_ICON_MARGIN_PX24 (margen desde la esquina cuando el dominio aun no tiene posicion guardada)
TOAST_DURATION_MS2.000 (duracion del toast efimero al cambiar de estado armado/apagado)

Test de microfono (sin transcribir, sin red)

El boton "Probar microfono" del popup ejecuta runMicTest() durante MIC_TEST_DURATION_MS = 3000 ms. Mide el RMS pico del audio capturado con AnalyserNode.getByteTimeDomainData() sobre fftSize: 512. Si el RMS pico supera MIC_TEST_RMS_THRESHOLD = 0.02 devuelve "Te oigo bien"; si no, avisa que no detecta sonido. NO transcribe. NO envia audio por red. NO afirma precision cientifica (umbral empirico documentado).

9 verificadores bloqueantes antes de cada release

Cada cambio en el codigo pasa por 9 verificadores antes de publicar una nueva version en Chrome Web Store. El comando npm run verify (orquestador scripts/verify-all.ts) los ejecuta en secuencia y bloquea la publicacion si alguno falla con codigo de salida distinto de 0.

#VerificadorQue comprueba
1verify-mv3-compliance.tsConformidad con Manifest V3 (sin APIs deprecadas, sin chrome.extension.*, sin eval, sin Function() dinamico, service worker correcto)
2verify-csp.tsContent Security Policy: sin scripts inline, sin unsafe-eval, sin recursos remotos en HTML, sin string-as-handler en addEventListener
3verify-architecture.tsReglas ARCH del proyecto: capa unica para chrome.storage (ARCH1), unica fuente de verdad de idiomas (ARCH7) y de constantes (src/config/constants.js)
4verify-no-hardcoded.tsSin URLs, sin emails y sin literales user-facing hardcodeados en HTML o JS (todo desde constants.js o src/i18n/*.json)
5verify-error-handling.tsSin catch vacios, errores logueados, tratamiento de "Extension context invalidated"
6verify-runtime-safety.tsAccesos defensivos a arrays, instanceof antes de tocar el DOM, target.isConnected antes de insertar texto
7verify-i18n.tsCobertura completa de las claves en _locales/es/messages.json y _locales/en/messages.json, sin claves huerfanas, sin claves usadas sin definir
8audit-colors.tsSin colores hardcodeados fuera del tema (cada color con justificacion semantica)
9verify-code-quality.tsFunciones por debajo del umbral de complejidad, sin codigo muerto, sin ?? '' que enmascaren bugs en adapters

Cualquier fallo en uno solo bloquea el avance. La filosofia es: si un verificador no pasa, el codigo no se publica.

Privacidad por diseno: lo que ApisVoice NO hace

Lo que la extension NO haceVerificable en
No tiene servidores propiosNo hay fetch ni XMLHttpRequest saliente en el codigo del producto. La unica red la maneja la Web Speech API del navegador, no la extension
No tiene cuentaNo hay flujo de login, no hay tokens, no hay chrome.identity
No tiene telemetriaNo hay chrome.metricsPrivate, no hay analytics, no hay pings
No lee el contenido de las paginasEl content script solo inyecta el icono y escucha eventos de su propio Shadow DOM. No recorre el DOM huesped salvo para detectar colision con widgets conocidos (selectores publicos)
No envia el audio a ApisDomEl audio lo procesa webkitSpeechRecognition del navegador. En Chrome ese motor envia el audio a servidores de Google (no on-device en la mayoria de plataformas). ApisDom NO esta en esa cadena. Documentado literalmente en el popup
No guarda audio en discoLas preferencias son texto plano en chrome.storage.local (idioma, posicion del icono, timers, dominios). Ningun blob de audio

Justificacion de cada permiso

En la pestana "Privacidad" del popup, ApisVoice explica al usuario por que pide cada permiso. Texto literal de src/i18n/es.json:

PermisoJustificacion mostrada al usuario
activeTab"Inyectar el icono en la pestana activa cuando lo pides"
scripting"Colocar el codigo del icono dentro de la pagina"
storage"Guardar tus preferencias en tu navegador"
host_permissions: <all_urls>"Que el icono pueda aparecer en cualquier web. NO leemos el contenido de las paginas"

Otras decisiones de calidad verificadas en el codigo

DecisionConstante / Codigo
Reseña no insistenteModal de "Dejar resena" aparece UNA sola vez por instalacion, tras DAYS_BEFORE_REVIEW_PROMPT = 15 dias. Si el usuario lo descarta, no vuelve a salir
Service worker resistenteListener vacio en chrome.runtime.onConnect para que los content scripts no detecten falsa muerte de la extension
Reinyeccion controladaTras update, background.js reinyecta content.js SOLO en pestanas con protocolo http(s):// o file:// (las internas chrome://, edge://, about:, view-source: se ignoran sin error)
Limpieza de huerfanosAntes de inyectar el icono nuevo, el bootstrap elimina cualquier [data-apisvoice-host="true"] que haya quedado de una version anterior
Manejo de "Extension context invalidated"Helper isContextInvalidatedError en preferences.js con match case-insensitive sobre todas las variaciones posibles del mensaje, para no spammear la consola del usuario tras un update

Compartir este Conocimiento

Si este proyecto aporta valor o podría inspirar a otros, considera difundirlo en tu red profesional.

Logo Apisdom

Potenciando el futuro con APIs de Inteligencia Artificial y desarrollo de software a medida.

  • Términos de Servicio
  • Política de Privacidad
  • Política de Cookies
  • Política de Pagos
  • Aviso Legal
  • APIs y Precios
  • Documentación
  • Blog
  • Proyectos
  • Servicios
  • FAQ
  • ORCID
  • Extensiones oficiales:
  • ORCID iDORCID
  • app.apisdom.com
  • Contacto: contacto@apisdom.com
Contribuir
Logo Apisdom

Potenciando el futuro con APIs de Inteligencia Artificial y desarrollo de software a medida.

Redes
Políticas
  • Términos de Servicio
  • Política de Privacidad
  • Política de Cookies
  • Política de Pagos
  • Aviso Legal
Enlaces Rápidos
  • APIs y Precios
  • Documentación
  • Blog
  • Proyectos
  • Servicios
  • FAQ
Contacto
  • Email: contacto@apisdom.com
  • JuanluORCID iDORCID
Contribuir
Extensiones oficiales:
app.apisdom.com

© 2026 Apisdom. Todos los derechos reservados.

Desarrollado con Next.js