whisper-windows-mcp 2.5.0 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,24 +1,24 @@
1
- name: CI
2
-
3
- on:
4
- push:
5
- pull_request:
6
-
7
- permissions:
8
- contents: read
9
-
10
- jobs:
11
- test:
12
- name: build + test
13
- runs-on: windows-latest
14
- strategy:
15
- matrix:
16
- node-version: [20, 22]
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: actions/setup-node@v4
20
- with:
21
- node-version: ${{ matrix.node-version }}
22
- cache: npm
23
- - run: npm ci
24
- - run: npm test
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ test:
12
+ name: build + test
13
+ runs-on: windows-latest
14
+ strategy:
15
+ matrix:
16
+ node-version: [20, 22]
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ - uses: actions/setup-node@v4
20
+ with:
21
+ node-version: ${{ matrix.node-version }}
22
+ cache: npm
23
+ - run: npm ci
24
+ - run: npm test
@@ -2,7 +2,8 @@ name: Publish
2
2
 
3
3
  on:
4
4
  release:
5
- types: [created]
5
+ types: [published]
6
+ workflow_dispatch:
6
7
 
7
8
  permissions:
8
9
  id-token: write
@@ -15,10 +16,10 @@ jobs:
15
16
  - uses: actions/checkout@v4
16
17
  - uses: actions/setup-node@v4
17
18
  with:
18
- node-version: '20'
19
+ node-version: '22'
19
20
  registry-url: 'https://registry.npmjs.org'
20
21
  - run: npm install
21
22
  - run: npm run build
22
- - run: npm publish --provenance
23
+ - run: npm publish
23
24
  env:
24
25
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/ROADMAP.es.md CHANGED
@@ -6,246 +6,288 @@ Versión actual: **v2.5.0**
6
6
 
7
7
  ## Principios de diseño
8
8
 
9
- Estos principios rigen cada decisión en este proyecto y tienen prioridad sobre la velocidad de adición de funcionalidades.
9
+ Estos principios rigen cada decisión de este proyecto y tienen prioridad sobre la velocidad de adición de funcionalidades.
10
10
 
11
- **Minimizar el uso de la API de Claude.** Todo el flujo de trabajo de transcripción — escaneo, análisis, cola, ejecución, validación, cambio de modelos — debe ser ejecutable con el menor número posible de interacciones con Claude. Esta herramienta debe funcionar completamente para usuarios de Claude en el plan gratuito que no pagan por suscripciones Pro o Max. Cada llamada a herramienta consume presupuesto de uso. Diseña en consecuencia.
11
+ **Minimizar el uso de la API de Claude.** Todo el flujo de trabajo de transcripción — escaneo, análisis, encolado, ejecución, validación, cambio de modelos — debe poder ejecutarse con la menor cantidad posible de interacciones con Claude. Esta herramienta debe ser plenamente funcional para los usuarios de Claude del plan gratuito que no pagan una suscripción Pro o Max. Cada llamada a una herramienta consume presupuesto de uso. Diseña en consecuencia.
12
12
 
13
- **Siempre una única instancia de whisper.** Nunca crees un segundo proceso whisper-cli.exe mientras uno esté en ejecución. El bloqueo de proceso es obligatorio e innegociable.
13
+ **Una única instancia de whisper en todo momento.** Nunca crees un segundo proceso whisper-cli.exe mientras haya uno en ejecución. El bloqueo de proceso es obligatorio e innegociable.
14
14
 
15
- **Local primero, privado por defecto.** El audio nunca sale de la máquina. No se necesita ninguna API de nube para la funcionalidad principal. Las integraciones opcionales (ej.: descargas de modelos de Hugging Face) deben estar claramente documentadas como opcionales.
15
+ **Local primero, privado por defecto.** El audio nunca sale de la máquina. No se requiere ninguna API de nube para la funcionalidad principal. Las integraciones opcionales (por ejemplo, las descargas de modelos de Hugging Face) deben documentarse claramente como opcionales.
16
16
 
17
- **Control explícito del usuario.** Sin operaciones masivas silenciosas. Las acciones destructivas o irreversibles requieren confirmación. El usuario debe saber siempre qué va a ocurrir antes de que ocurra.
17
+ **Control explícito del usuario.** Sin operaciones masivas silenciosas. Las acciones destructivas o irreversibles requieren confirmación. El usuario siempre debe saber qué va a ocurrir antes de que ocurra.
18
18
 
19
- **Rutas seguras para Unicode.** Toda E/S de archivo debe manejar correctamente nombres de archivo no-ASCII, incluyendo español, japonés, chino, emoji, corchetes y otros caracteres especiales.
19
+ **Rutas seguras para Unicode.** Toda la E/S de archivos debe manejar correctamente los nombres de archivo no-ASCII, incluidos japonés, chino, emoji, corchetes y otros caracteres especiales.
20
20
 
21
- **Modular y combinable.** Las herramientas son independientes. Los usuarios usan lo que necesitan. Ninguna funcionalidad debe requerir otra, a menos que sea inevitable.
21
+ **Modular y combinable.** Las herramientas son independientes. Los usuarios usan lo que necesitan. Ninguna funcionalidad debe requerir otra para funcionar, a menos que sea inevitable.
22
22
 
23
- **Optimización antes que funcionalidades.** Cuando haya dudas entre agregar una funcionalidad y reducir la carga del sistema o el número de llamadas a la API, reduce la carga. Las sesiones de optimización grandes son costosas. Diseña la arquitectura correctamente desde el principio.
23
+ **Optimización antes que funcionalidades.** Ante la duda entre agregar una funcionalidad y reducir la carga del sistema o el número de llamadas a la API, reduce la carga. Las pasadas intensivas de optimización son costosas. Acierta con la arquitectura desde el primer momento.
24
24
 
25
25
  ---
26
26
 
27
27
  ## Completado
28
28
 
29
29
  ### ✅ v1.3.1 — Bloqueo de proceso
30
- Añadida verificación `isWhisperRunning()` usando `tasklist /FI` antes de crear cualquier proceso de transcripción. Devuelve un error claro con instrucciones del Administrador de Tareas en lugar de crear un proceso concurrente.
30
+ Añadida la verificación `isWhisperRunning()` mediante `tasklist /FI` antes de crear cualquier proceso de transcripción. Devuelve un error claro con instrucciones del Administrador de Tareas en lugar de crear un proceso concurrente.
31
31
 
32
- ### ✅ v1.4.0 — Aceleración GPU Vulkan
33
- Compilado whisper.cpp desde el código fuente con `-DGGML_VULKAN=ON` usando VS Build Tools 2022 y Vulkan SDK. Binarios Vulkan precompilados distribuidos como `whisper-vulkan-win-x64.zip`.
32
+ ### ✅ v1.4.0 — Aceleración GPU con Vulkan
33
+ Compilado whisper.cpp desde el código fuente con `-DGGML_VULKAN=ON` usando VS Build Tools 2022 y el Vulkan SDK. Binarios Vulkan precompilados distribuidos como `whisper-vulkan-win-x64.zip`.
34
34
 
35
- **Resultados en AMD Radeon RX Vega 56:** Utilización media de GPU ~16%. Archivo de 58 minutos completado en ~4,5 minutos en GPU vs. ~88 minutos solo en CPU.
35
+ **Resultados en una AMD Radeon RX Vega 56:** utilización media de GPU de ~16%. Un archivo de 58 minutos se completa en ~4,5 minutos en GPU frente a ~88 minutos solo con CPU.
36
36
 
37
37
  ### ✅ v1.5.0 — Diagnóstico del sistema
38
- Herramienta `check_system`: detección de GPU via `wmic`, verificación de DLL Vulkan, reporte de VRAM, recomendación de tamaño de modelo.
38
+ Herramienta `check_system`: detección de GPU mediante `wmic`, verificación de las DLL de Vulkan, reporte de VRAM y recomendación de tamaño de modelo.
39
39
 
40
- ### ✅ v1.6.0 — Pre-análisis de archivo
41
- Herramienta `analyze_media` via FFprobe: duración, tamaño, códec, estado de transcripción, estimaciones de tiempo de CPU y GPU. Escaneo de archivo único o carpeta con opciones de ordenación.
40
+ ### ✅ v1.6.0 — Pre-análisis de archivos
41
+ Herramienta `analyze_media` mediante FFprobe: duración, tamaño, códec, estado de transcripción y estimaciones de tiempo en CPU y GPU. Escaneo de un solo archivo o de una carpeta con opciones de ordenación.
42
42
 
43
43
  ### ✅ v1.7.0 — Transcripción en segundo plano + Visibilidad del progreso
44
- Arquitectura de proceso desconectado: `transcribe_audio` con `background=true` crea whisper como proceso desconectado y devuelve inmediatamente un ID de tarea. `check_progress` analiza las marcas de tiempo de segmento del stderr de whisper para porcentaje y ETA en tiempo real.
44
+ Arquitectura de proceso desacoplado: `transcribe_audio` con `background=true` crea whisper como proceso desacoplado y devuelve de inmediato un ID de trabajo. `check_progress` analiza las marcas de tiempo de segmento del stderr de whisper para obtener el porcentaje y el ETA en tiempo real.
45
45
 
46
46
  ### ✅ v1.8.0 — Lote secuencial con validación
47
- `start_batch` y `check_batch_progress`: procesamiento secuencial automático, validación de transcripción (detección de salida vacía/corta), avance automático de cola, marcas de tiempo de progreso por archivo.
47
+ `start_batch` y `check_batch_progress`: procesamiento secuencial automatizado, validación de la transcripción (detección de salida vacía o corta), avance automático de la cola y marcas de tiempo de progreso por archivo.
48
48
 
49
49
  ### ✅ v1.9.0 — Soporte multilingüe y traducción
50
- `generate_subtitles` con detección `language=auto` y salida SRT doble `translate_to_english=true`. Añadido soporte para formatos `.3gp` y `.ts`. `language=auto` también disponible en `transcribe_audio`.
50
+ `generate_subtitles` con detección `language=auto` y salida SRT doble mediante `translate_to_english=true`. Añadido soporte para los formatos `.3gp` y `.ts`. `language=auto` también disponible en `transcribe_audio`.
51
51
 
52
- **Limitación conocida:** La traducción integrada de Whisper solo apunta al inglés. Requiere modelo `large-v3` para idiomas que no sean inglés — los modelos solo inglés (`*.en.bin`) generan `[FOREIGN]` en audio que no sea inglés.
52
+ **Limitación conocida:** la traducción integrada de Whisper solo apunta al inglés. Requiere el modelo `large-v3` para idiomas distintos del inglés — los modelos solo en inglés (`*.en.bin`) producen `[FOREIGN]` con audio que no está en inglés.
53
53
 
54
54
  ### ✅ v2.0.0 — Rutas seguras para Unicode + SRT en segundo plano
55
- **Nombres de archivo Unicode:** Los archivos con caracteres no-ASCII en los nombres causaban fallos silenciosos en la transcripción en segundo plano. Corregido enrutando toda la salida a través de una ruta temporal saneada basada en ID de tarea, luego moviendo el resultado al destino correcto tras completarse.
55
+ **Nombres de archivo Unicode:** los archivos con caracteres no-ASCII en el nombre provocaban que la transcripción en segundo plano fallara silenciosamente. Corregido enrutando toda la salida a través de una ruta temporal saneada basada en el ID de trabajo y moviendo después el resultado al destino correcto una vez completado.
56
56
 
57
- **SRT en modo en segundo plano:** `spawnDetached` anteriormente codificaba de forma rígida `-otxt` independientemente del formato solicitado. Corregido añadiendo parámetro `outputFormat` a `spawnDetached`, soportando salida `text` y `srt` en modo en segundo plano.
57
+ **SRT en modo en segundo plano:** `spawnDetached` codificaba antes de forma rígida `-otxt` sin importar el formato solicitado. Corregido añadiendo un parámetro `outputFormat` a `spawnDetached`, con soporte de salida `text` y `srt` en modo en segundo plano.
58
58
 
59
- ### ✅ v2.0.1 — Correcciones de bugs (incluido en v2.2.0)
60
- - `--max-context 0` fijo en `buildArgs` y `spawnDetached` — previene bucles de alucinación en audio largo.
61
- - `--no-speech-thold 0.6` fijo en ambas funciones — segmentos por debajo del umbral de confianza son tratados como silencio en lugar de contenido alucinado.
62
- - Validación de ruta (`validateInputPath`) — rechaza rutas UNC y traversales `..`.
59
+ ### ✅ v2.0.1 — Correcciones de errores (incluidas en v2.2.0)
60
+ - `--max-context 0` fijado tanto en `buildArgs` como en `spawnDetached` — previene los bucles de alucinación en audio de larga duración.
61
+ - `--no-speech-thold 0.6` fijado en ambas funciones — los segmentos por debajo del umbral de confianza se tratan como silencio en lugar de como contenido alucinado.
62
+ - Validación de rutas (`validateInputPath`) — rechaza rutas UNC y el recorrido `..`.
63
63
  - Guarda de tamaño de archivo `MAX_FILE_SIZE_MB = 10240`.
64
- - Comentario de seguridad de inyección de transcripción en `transcribeSingle`.
65
- - Comando CLI de lote corregido en TROUBLESHOOTING.md.
64
+ - Comentario de seguridad sobre inyección de transcripción en `transcribeSingle`.
65
+ - Comando CLI de lote roto corregido en TROUBLESHOOTING.md.
66
66
 
67
- ### ✅ v2.1.0 — Suite de gestión de modelos (incluido en v2.2.0)
67
+ ### ✅ v2.1.0 — Suite de gestión de modelos (incluida en v2.2.0)
68
68
  - `WHISPER_MODEL` cambiado de `const` a `let` (mutable dentro de la sesión).
69
- - `MODEL_REGISTRY` — 16 modelos, variantes de precisión total y cuantizadas, URLs de descarga de Hugging Face.
70
- - `ALLOWED_HF_PREFIXES` — lista de permitidos de URL que limita las descargas a los espacios de nombres `ggerganov/whisper.cpp` y `ggml-org`.
71
- - Herramienta `list_models` — escanea el directorio de modelos, muestra el modelo activo, tamaños, casos de uso, descargas disponibles.
72
- - Herramienta `download_model` — descarga de Hugging Face via `https` integrado de Node.js, renombrado atómico.
73
- - Herramienta `switch_model` — valida extensión `.bin`, restricción de directorio, verificación de bloqueo de proceso.
74
- - `recommendedModel()` actualizado para recomendar `large-v3-turbo` para VRAM de 6GB+.
69
+ - `MODEL_REGISTRY` — 16 modelos, variantes de precisión completa y cuantizadas, URLs de descarga de Hugging Face.
70
+ - `ALLOWED_HF_PREFIXES` — lista de permitidos de URL que restringe las descargas a los espacios de nombres `ggerganov/whisper.cpp` y `ggml-org`.
71
+ - Herramienta `list_models` — escanea el directorio de modelos y muestra el modelo activo, los tamaños, los casos de uso y las descargas disponibles.
72
+ - Herramienta `download_model` — descarga desde Hugging Face mediante el módulo `https` integrado de Node.js, con renombrado atómico.
73
+ - Herramienta `switch_model` — valida la extensión `.bin`, la restricción de directorio y la verificación del bloqueo de proceso.
74
+ - `recommendedModel()` actualizado para recomendar `large-v3-turbo` con 6GB o más de VRAM.
75
75
 
76
76
  ### ✅ v2.2.0 — Expansión de calidad, parámetros y hardware
77
- - Interfaz `WhisperOptions` reemplazando argumentos posicionales en `buildArgs`.
77
+ - Interfaz `WhisperOptions` que reemplaza los argumentos posicionales en `buildArgs`.
78
78
  - Nuevos parámetros en `transcribe_audio`: `temperature`, `prompt`, `condition_on_prev_text`, `no_speech_thold`, `beam_size`, `best_of`, `gpu_device`, `processors`, `word_timestamps`, `max_segment_length`, `split_on_word`, `diarize`, `vad_model`, `offset_t`, `duration`.
79
79
  - Nuevos parámetros en `generate_subtitles`: `temperature`, `prompt`, `beam_size`, `best_of`, `diarize`, `vad_model`.
80
- - `spawnDetached` refactorizado — todos los flags de calidad ahora se aplican en modo en segundo plano/lote.
80
+ - `spawnDetached` refactorizado — todos los flags de calidad se aplican en el modo en segundo plano/por lotes.
81
81
  - Salida de lote corregida — `readBatchProgress` ahora mueve la salida temporal al destino final antes de validar.
82
82
 
83
- **Nota de compatibilidad de flags:** `gpu_device` / `--device` fue añadido en whisper.cpp v1.8.4. Los binarios Vulkan precompilados en los releases son de la generación v1.8.3 — este parámetro es aceptado por la herramienta pero no tendrá efecto hasta que el usuario actualice a binarios v1.8.4+.
83
+ **Nota de compatibilidad de flags:** `gpu_device` / `--device` se añadió en whisper.cpp v1.8.4. El binario Vulkan precompilado de los releases es de la generación v1.8.3 — este parámetro es aceptado por la herramienta, pero no tendrá efecto hasta que el usuario actualice a un binario v1.8.4+.
84
84
 
85
85
  ### ✅ v2.2.2 — Parche
86
- - Corrección de licencia dual — revisión de LICENSE y LICENSE-COMMERCIAL.md.
86
+ - Corrección de la licencia dual — LICENSE y LICENSE-COMMERCIAL.md corregidos.
87
87
  - Correcciones menores de documentación.
88
88
 
89
89
  ### ✅ v2.3.0 — Avance automático de lote, arquitectura de privacidad, expansión de formatos de salida
90
90
 
91
- **Avance automático de lote (corrección de bug crítico):** `start_batch` antes requería polling activo para avanzar la cola. Ahora cada proceso hijo whisper-cli creado tiene un handler `on('exit')` adjunto. Cuando el proceso termina, el lote avanza inmediatamente de forma autónoma a través del callback de salida sin coste de polling ni llamadas a la API. Un mutex previene la creación doble entre el handler de salida y llamadas simultáneas a `check_batch_progress`.
91
+ **Avance automático de lote (corrección de error crítico):** `start_batch` requería antes un sondeo activo para avanzar por la cola. Ahora se adjunta un handler `on('exit')` a cada proceso hijo whisper-cli creado. Cuando el proceso finaliza, el lote avanza de inmediato por sí mismo a través del callback de salida, sin coste de sondeo y sin consumir llamadas a la API. Un mutex previene la doble creación entre el handler de salida concurrente y las llamadas a `check_batch_progress`.
92
92
 
93
93
  **Arquitectura de privacidad:**
94
- - Variable de entorno `WHISPER_PRIVACY_MODE` — cuando se establece en `true`, todas las respuestas de herramientas devuelven solo metadatos (nombre de archivo, conteo de palabras, ruta de guardado). Ningún texto de transcripción es enviado a la API de Claude. Las transcripciones existen solo como archivos locales.
95
- - Variable de entorno `WHISPER_CONSENT_ACKNOWLEDGED` — cuando se establece en `true`, omite la puerta de consentimiento única por sesión para contenido no sensible.
96
- - Parámetro `privacy_mode` por llamada en `transcribe_audio`, `transcribe_batch`, `start_batch`, `check_progress`. Anula la variable de entorno global en ambas direcciones. No requiere reinicio para activar/desactivar.
97
- - Puerta de modo de privacidad (`checkPrivacyGate()`) — se ejecuta antes de cada operación cuando el modo de privacidad efectivo está activo. Primera llamada activa (muestra divulgación), segunda llamada libera (permite). Se reinicia tras cada operación. Completamente independiente de la puerta de consentimiento de sesión.
98
- - Puerta de consentimiento de sesión (`transcriptPolicy()`) — se ejecuta una vez por sesión antes de la primera llamada que devuelva transcripción en modo estándar. Consumida por el flag `sessionConsentGiven`.
99
- - `PRIVACY.md` — documentación de cumplimiento completa que cubre HIPAA, GDPR, privilegio abogado-cliente, FERPA, SOX, PCI-DSS, NDA/secreto comercial.
100
- - Avisos de privacidad en las descripciones de herramientas de todas las herramientas que devuelven texto de transcripción.
94
+ - Variable de entorno `WHISPER_PRIVACY_MODE` — cuando es `true`, todas las respuestas de las herramientas devuelven solo metadatos (nombre de archivo, conteo de palabras, ruta de guardado). Ningún texto de transcripción se transmite jamás a la API de Claude. Las transcripciones existen únicamente como archivos locales.
95
+ - Variable de entorno `WHISPER_CONSENT_ACKNOWLEDGED` — cuando es `true`, suprime la puerta de consentimiento única por sesión para el contenido no sensible.
96
+ - Parámetro `privacy_mode` por llamada en `transcribe_audio`, `transcribe_batch`, `start_batch` y `check_progress`. Anula la variable de entorno global en cualquiera de los dos sentidos. No requiere reinicio para alternarlo por llamada.
97
+ - Puerta de modo de privacidad (`checkPrivacyGate()`) — se dispara antes de cada operación cuando el modo de privacidad efectivo está activo. Se arma en la primera llamada (muestra la divulgación) y se libera en la segunda (permite). Se reinicia tras cada operación. Es completamente independiente de la puerta de consentimiento de sesión.
98
+ - Puerta de consentimiento de sesión (`transcriptPolicy()`) — se dispara una vez por sesión antes de la primera llamada que devuelve transcripción en modo estándar. La consume el flag `sessionConsentGiven`.
99
+ - `PRIVACY.md` — documentación de cumplimiento completa que cubre HIPAA, GDPR, privilegio abogado-cliente, FERPA, SOX, PCI-DSS y NDA/secreto comercial.
100
+ - Avisos de privacidad en la descripción de todas las herramientas que devuelven transcripción.
101
101
 
102
102
  **Expansión de formatos de salida:**
103
- - `vtt` — salida de subtítulos WebVTT via `-ovtt`. Disponible en `transcribe_audio`, `generate_subtitles`, `start_batch` y modo en segundo plano.
104
- - `lrc` — formato de letras/karaoke LRC via `-olrc`. Disponible en `transcribe_audio` y modo en segundo plano.
105
- - `csv` — CSV con marcas de tiempo via `-ocsv`. Disponible en `transcribe_audio` y modo en segundo plano.
106
- - El valor predeterminado de `output_format` cambia de `"text"` a `"timestamps"` en todas las herramientas y rutas de código. El texto plano ahora es opcional.
107
-
108
- **Correcciones de bugs:**
109
- - Bug 1: `output_format` no era pasado a las tareas en segundo plano — se usaba `"text"` predeterminado independientemente del formato solicitado. Corregido cambiando el predeterminado a `"timestamps"` y pasándolo correctamente.
110
- - Bug 2: `catch {}` silencioso en la operación de movimiento de salida de tarea en segundo plano tragaba fallos. Añadida verificación `existsSync` explícita después del movimiento con mensaje de fallo detallado.
111
- - Bug 3: Añadido comentario de diseño en el punto de creación en segundo plano explicando por qué la puerta de consentimiento es diferida intencionalmente a `check_progress` para tareas en segundo plano no privadas.
112
-
113
- **Adiciones:**
114
- - Limpieza automática del directorio temporal — `cleanupOldJobFiles()` se ejecuta al arrancar y elimina archivos `.json` y `.log` con más de 7 días de antigüedad en `%TEMP%\whisper-mcp-jobs\`.
103
+ - `vtt` — salida de subtítulos WebVTT mediante `-ovtt`. Disponible en `transcribe_audio`, `generate_subtitles`, `start_batch` y el modo en segundo plano.
104
+ - `lrc` — formato de letras/karaoke LRC mediante `-olrc`. Disponible en `transcribe_audio` y el modo en segundo plano.
105
+ - `csv` — CSV con marcas de tiempo mediante `-ocsv`. Disponible en `transcribe_audio` y el modo en segundo plano.
106
+ - El valor por defecto de `output_format` cambió de `"text"` a `"timestamps"` en todas las herramientas y rutas de código. El texto plano ahora es opcional.
107
+
108
+ **Correcciones de errores:**
109
+ - Error 1: `output_format` no se reenviaba a los trabajos en segundo plano — se usaba el valor por defecto `"text"` sin importar el formato solicitado. Corregido cambiando el valor por defecto a `"timestamps"` y reenviándolo correctamente.
110
+ - Error 2: un `catch {}` silencioso en la operación de movimiento de la salida del trabajo en segundo plano se tragaba los fallos. Añadida una verificación explícita con `existsSync`, con un mensaje de fallo detallado, tras el movimiento.
111
+ - Error 3: añadido un comentario de diseño en el punto de creación en segundo plano que documenta por qué la puerta de consentimiento se difiere intencionadamente a `check_progress` para los trabajos en segundo plano no privados.
112
+
113
+ **Adicional:**
114
+ - Limpieza automática del directorio temporal — `cleanupOldJobFiles()` se ejecuta al arrancar y elimina los archivos `.json` y `.log` con más de 7 días de antigüedad de `%TEMP%\whisper-mcp-jobs\`.
115
115
  - `check_config` ahora reporta el estado del modo de privacidad.
116
- - El log de arranque reporta modo de privacidad activado/desactivado.
117
- - Campo `privacyMode: boolean` añadido a la interfaz `Job`.
118
- - Campo `privacyMode: boolean` añadido a la interfaz `BatchState`.
119
- - El tipo `BackgroundFormat` excluye `json` (json en modo en segundo plano no está soportado — cae de vuelta a `text`).
116
+ - El log de arranque reporta si el modo de privacidad está activado o desactivado.
117
+ - La interfaz `Job` se amplía con el campo `privacyMode: boolean`.
118
+ - La interfaz `BatchState` se amplía con el campo `privacyMode: boolean`.
119
+ - El tipo `BackgroundFormat` excluye `json` (json en modo en segundo plano sigue sin estar soportado — recurre a `text`).
120
120
 
121
- ### ✅ v2.4.0 — Fortalecimiento, guarda de tiempo de espera en primer plano, conjunto de pruebas y CI
121
+ ### ✅ v2.4.0 — Fortalecimiento, guarda de primer plano, suite de pruebas y CI
122
122
 
123
123
  Una pasada de seguridad/robustez; la migración a Bun planificada se trasladó a v2.5.0.
124
124
 
125
125
  **Seguridad y corrección:**
126
- - Corrección de contención de rutas en `switch_model` — un directorio con prefijo hermano (p. ej. `…\models-evil`) antes podía satisfacer la comprobación de "dentro del directorio de modelos" mediante un `startsWith` ingenuo; reemplazado por contención normalizada basada en `relative()`. Cierra la fuga que describe SECURITY.md.
127
- - Barrera de privacidad/consentimiento vinculada **por operación** (herramienta + argumentos) — confirmar una transcripción ya no puede satisfacer la barrera de una operación diferente.
128
- - `download_model` rechaza descargas truncadas (comprobación de Content-Length) antes de promover un archivo `.part`. (La verificación completa del resumen SHA256 queda pendiente para una pasada posterior.)
129
- - Coerción de entrada — los parámetros numéricos de herramientas que no son números reales se descartan en lugar de entregarse a whisper-cli como `NaN`.
126
+ - Corrección de contención de rutas en `switch_model` — un directorio con prefijo hermano (por ejemplo, `…\models-evil`) podía antes satisfacer la comprobación de "dentro del directorio de modelos" mediante un `startsWith` ingenuo; reemplazado por una contención normalizada basada en `relative()`. Cierra la fuga que describe SECURITY.md.
127
+ - Puerta de privacidad/consentimiento vinculada **por operación** (herramienta + argumentos) — confirmar una transcripción ya no puede satisfacer la puerta de otra operación distinta.
128
+ - `download_model` rechaza las descargas truncadas (comprobación de Content-Length) antes de promover un archivo `.part`. (La verificación completa del hash SHA256 queda registrada para una pasada posterior.)
129
+ - Coerción de entrada — los parámetros numéricos de las herramientas que no son números reales se descartan en lugar de entregarse a whisper-cli como `NaN`.
130
130
 
131
131
  **Robustez:**
132
- - **Guarda de tiempo de espera en primer plano** — un archivo lo bastante largo como para superar el tiempo de espera de herramienta MCP de ~4 minutos de Claude Desktop en modo bloqueante se detecta de antemano y se enruta a segundo plano en lugar de agotar el tiempo silenciosamente. Umbral configurable mediante `WHISPER_FOREGROUND_MAX_SEC`. Estimaciones de tiempo corregidas (la antigua estimación de GPU subestimaba notablemente; ahora se modela el coste dominante de recarga del modelo — medido, no adivinado).
132
+ - **Guarda de tiempo de espera en primer plano** — un archivo lo bastante largo como para superar el tiempo de espera de herramienta MCP de ~4 minutos de Claude Desktop en modo bloqueante se detecta de antemano y se enruta a segundo plano en lugar de agotar el tiempo silenciosamente. Umbral configurable mediante `WHISPER_FOREGROUND_MAX_SEC`. Estimaciones de tiempo corregidas (la antigua estimación de GPU subestimaba gravemente; ahora se modela el coste dominante de recarga del modelo — medido, no adivinado).
133
133
  - Escrituras atómicas del estado de trabajos/lotes (archivo temporal + renombrado) para que un lector concurrente no pueda observar un archivo JSON a medio escribir.
134
134
  - IDs de trabajo/lote/temporales a prueba de colisiones (con sufijo UUID).
135
135
  - Apagado controlado ante SIGINT/SIGTERM que limpia los archivos temporales del modo bloqueante.
136
136
 
137
137
  **Selección de dispositivo GPU:**
138
- - Variable de entorno `WHISPER_GPU_DEVICE`, y `gpu_device` ahora propagado a través de `generate_subtitles` y la pasada de detección de idioma (antes solo `transcribe_audio`). `check_config` informa el dispositivo activo. `check_system` ya no informa erróneamente un problema de controlador cuando `wmic` (obsoleto en Windows 11 24H2+) no devuelve nada.
138
+ - Variable de entorno `WHISPER_GPU_DEVICE`, y `gpu_device` ahora propagado a través de `generate_subtitles` y la pasada de detección de idioma (antes solo en `transcribe_audio`). `check_config` reporta el dispositivo activo. `check_system` ya no reporta erróneamente un problema de controlador cuando `wmic` (obsoleto en Windows 11 24H2+) no devuelve nada.
139
139
 
140
140
  **Calidad:**
141
- - Un conjunto de pruebas unitarias con `node:test` sobre la lógica pura (contención de rutas, clave de barrera, escrituras atómicas, coerción de entrada, la estimación de tiempo de espera), cero dependencias añadidas, además de un flujo de trabajo de CI de GitHub Actions que lo ejecuta en cada push/PR.
141
+ - Una suite de pruebas unitarias con `node:test` sobre la lógica pura (contención de rutas, clave de las puertas, escrituras atómicas, coerción de entrada y la estimación de tiempo de espera), con cero dependencias añadidas, más un flujo de trabajo de CI de GitHub Actions que la ejecuta en cada push/PR.
142
142
 
143
- **Identificado para una versión futura:** una ruta de modelo persistente (p. ej. `whisper-server` de whisper.cpp) para eliminar el coste de recarga del modelo que se paga en cada transcripción — una gran mejora de rendimiento para trabajo por lotes/de archivo.
143
+ **Identificado para una versión futura:** una ruta de modelo persistente (por ejemplo, el `whisper-server` de whisper.cpp) para eliminar el coste de recarga del modelo que se paga en cada transcripción — una gran mejora de rendimiento para el trabajo por lotes/de archivo.
144
144
 
145
- ---
146
-
147
- ## Planificado — v2.5.0: Servidor de modelo persistente
148
-
149
- Mantener el modelo Whisper residente entre transcripciones en lugar de recargarlo en cada invocación.
150
-
151
- Esta es la mayor mejora de rendimiento disponible. whisper-cli es de un solo uso: recarga el modelo completo en cada llamada, y v2.4.0 midió esa recarga en ~110 s en una GPU con memoria limitada — un impuesto fijo pagado por archivo, independiente de la duración del audio. Para cargas de trabajo por lotes y de archivo, domina el tiempo total de ejecución más que la propia transcripción.
145
+ ### ✅ v2.5.0 — Servidor de modelo persistente + TinyDiarize
152
146
 
153
- **Enfoque:** ejecutar el `whisper-server` (HTTP) incluido en whisper.cpp como un único proceso de larga duración con el modelo mantenido en memoria. El servidor MCP envía cada transcripción a él a través de localhost y recupera los resultados sin volver a pagar el coste de recarga.
154
-
155
- **Conciliación con "una única instancia de whisper en todo momento":** el principio se preserva, el mecanismo evoluciona. El servidor residente *se convierte* en la única instancia; el bloqueo de proceso cambia de "nunca crear un segundo whisper-cli" a "serializar las solicitudes contra el único servidor residente". No se introduce concurrencia.
147
+ **Servidor de modelo persistente (Fase 1).** whisper-cli es de un solo uso: recarga el modelo completo en cada llamada — v2.4.0 midió esa recarga en ~110 s en una GPU con memoria limitada, un impuesto fijo por archivo que domina el tiempo total de ejecución en el trabajo por lotes/de archivo. v2.5.0 añade un modo opcional de modelo residente que mantiene el modelo en memoria entre transcripciones.
148
+ - Herramienta `whisper_server` (`start` / `stop` / `status`). El servidor residente *se convierte* en la única instancia, preservando la regla de una única instancia de whisper: las solicitudes se serializan contra él, sin introducir concurrencia.
149
+ - Los `transcribe_audio` y `transcribe_batch` bloqueantes se enrutan a través del servidor residente por localhost (`127.0.0.1`) mediante `POST /inference`, evitando el coste de recarga. La guarda de tiempo de espera en primer plano se omite en modo servidor (no hay recarga que pagar).
150
+ - `switch_model` intercambia en caliente el modelo residente mediante `POST /load` sin reinicio. `check_config` reporta el estado del servidor; el servidor propio se termina al apagar para liberar la VRAM.
151
+ - La regla de un solo motor / VRAM compartida se impone con un respaldo estricto en la ruta de creación desacoplada, más rechazos amistosos: mientras el servidor está activo, los trabajos en segundo plano, `start_batch`, `generate_subtitles`, la salida `lrc`/`csv` y las opciones por solicitud que la API HTTP no respeta (`beam_size`, `best_of`, `word_timestamps`, `diarize`, `tinydiarize`, `vad_model`, `offset_t`, `duration`, etc.) se rechazan con un mensaje de "detén el servidor primero" en lugar de degradarse silenciosamente.
152
+ - Configuración: `WHISPER_SERVER_PATH`, `WHISPER_SERVER_PORT` (por defecto 8571, solo localhost).
156
153
 
157
154
  **Restricciones de diseño:**
158
155
  - Ciclo de vida explícito: start / stop / status, con una verificación de salud. El servidor nunca se inicia silenciosamente como efecto secundario de una llamada no relacionada.
159
- - Vincular solo a localhost — nunca a una interfaz enrutable. Sin exposición de red (coherente con el principio de local primero y el fortalecimiento de v2.4.0).
156
+ - Vincular solo a localhost — nunca a una interfaz enrutable. Sin exposición de red (coherente con el principio de local primero y con el fortalecimiento de v2.4.0).
160
157
  - Reserva elegante: si el servidor no está en ejecución, la transcripción sigue funcionando a través de la ruta existente de whisper-cli de un solo uso. El servidor es una optimización, no una dependencia obligatoria.
161
158
  - `switch_model` recarga el modelo en el servidor residente (aún mucho más barato amortizado que recargar por archivo).
162
159
  - Las puertas de privacidad y consentimiento no cambian — se sitúan por encima del mecanismo de transcripción.
163
160
  - Selección de puerto con manejo de colisiones; apagado limpio ante SIGINT/SIGTERM junto con la limpieza existente de archivos temporales.
164
161
 
165
- **Estado Fase 1 ✅ implementada (pendiente de release):** herramienta `whisper_server` (`start` / `stop` / `status`); `transcribe_audio` y `transcribe_batch` bloqueantes se enrutan a través del servidor residente por localhost (`127.0.0.1`, verificado contra la API HTTP actual del `whisper-server` de whisper.cpp); `switch_model` intercambia en caliente el modelo residente mediante `POST /load` sin reinicio; la guarda de tiempo de espera en primer plano se omite en modo servidor (no hay recarga que pagar); `check_config` reporta el estado del servidor; el servidor propio se termina al apagarse para liberar la VRAM. La regla de un solo motor / VRAM compartida se impone con un respaldo estricto en la ruta de creación de proceso desconectado más rechazos amistosos: mientras el servidor está activo, las tareas en segundo plano, `start_batch`, `generate_subtitles`, salida `lrc`/`csv` y opciones por solicitud que la API HTTP no respeta (`beam_size`, `best_of`, `word_timestamps`, `diarize`, `tinydiarize`, `vad_model`, `offset_t`, `duration`, etc.) son rechazadas con un mensaje de "detén el servidor primero" en lugar de degradarse silenciosamente. Configuración: `WHISPER_SERVER_PATH`, `WHISPER_SERVER_PORT` (predeterminado 8571, solo localhost).
166
-
167
- **Estado Fase 2 (planificada):** enrutar segundo plano/`start_batch` a través del servidor residente. Esta es la mayor mejora de archivo/rendimiento y necesita rehacer la capa de tareas/cola en torno a solicitudes HTTP en lugar de PIDs desconectados (progreso sin un PID, cancelación). Reevaluar tras aterrizar la Fase 1.
162
+ **TinyDiarize.** Soporte de `--tinydiarize` con modelos habilitados para `tdrz`. A diferencia del flag `--diarize` estéreo (v2.2.0), TinyDiarize marca los turnos de hablante en grabaciones **mono** y no necesita nada más allá del archivo de modelo ni Python, ni servicio externo.
163
+ - Parámetro `tinydiarize` en `transcribe_audio` y `generate_subtitles` (modos bloqueante y en segundo plano); `--tinydiarize` propagado a través de ambos constructores de argumentos.
164
+ - `small.en-tdrz` añadido a `MODEL_REGISTRY` para que `download_model` pueda obtenerlo de los espacios de nombres de confianza existentes de Hugging Face.
168
165
 
169
166
  ---
170
167
 
171
- ## Planificado — v2.6.0: TinyDiarize (turnos de hablante en mono, cero dependencias adicionales)
168
+ ## Planificado — v2.6.0: Servidor de modelo persistente Fase 2
172
169
 
173
- Soporte a `--tinydiarize` con variantes de modelo habilitadas para `tdrz` (ej.: `ggml-small.en-tdrz.bin`). A diferencia del flag `--diarize` estéreo (v2.2.0), TinyDiarize marca los turnos de hablante en grabaciones **mono**, y no necesita nada más allá del archivo de modeloni Python, ni servicio externo.
170
+ Enrutar los trabajos en segundo plano y `start_batch` a través del servidor residente. La Fase 1 (v2.5.0) cubre solo la transcripción bloqueante; esta es la mayor mejora de archivo/rendimiento, y requiere rehacer la capa de trabajos/cola en torno a solicitudes HTTP en lugar de PIDs desacoplados seguimiento del progreso sin un PID, y cancelación basada en HTTP.
174
171
 
175
- **Alcance:**
176
- - Añadir la(s) variante(s) de modelo `tdrz` a `MODEL_REGISTRY` para que `download_model` pueda obtenerlas de los espacios de nombres de Hugging Face de confianza existentes.
177
- - Propagar una opción `tinydiarize` a través de `buildArgs` y `spawnDetached` para que funcione en modos bloqueante, en segundo plano y por lotes.
172
+ Las **restricciones de diseño** del servidor residente establecidas en v2.5.0 siguen rigiendo la Fase 2 — vinculación solo a localhost, ciclo de vida explícito, reserva elegante de un solo uso y puertas de privacidad/consentimiento sin cambios. La Fase 2 añade el enrutamiento de trabajos/cola sin relajar ninguna de ellas.
178
173
 
179
- **Estado:** ✅ Implementado (pendiente de release) — parámetro `tinydiarize` en `transcribe_audio` y `generate_subtitles` (funciona en modos bloqueante y en segundo plano), `--tinydiarize` propagado a través de ambos constructores de argumentos, y `small.en-tdrz` añadido a `MODEL_REGISTRY` para `download_model`. Fiel a la filosofía: local primero, cero dependencias adicionales.
174
+ **Estado:** Planificado.
180
175
 
181
176
  ---
182
177
 
183
178
  ## Planificado — v2.7.0: Búsqueda de transcripciones en todo el proyecto
184
179
 
185
- Una herramienta independiente para buscar una frase o patrón en cada transcripción de un directorio de proyecto y devolver las coincidencias con su archivo de origen y timecode. Descompuesta del flujo de trabajo mayor de proyecto de video (ver "Más adelante / En consideración") — esta mitad es útil de forma independiente, de bajo riesgo y ligera en API: la búsqueda se ejecuta localmente, y Claude solo interviene cuando el usuario revisa los resultados.
180
+ Una herramienta independiente para buscar una frase o un patrón en cada transcripción de un directorio de proyecto y devolver las coincidencias con su archivo de origen y su timecode. Descompuesta del flujo de trabajo mayor de proyecto de video (ver "Más adelante / En consideración") — esta mitad es útil de forma independiente, de bajo riesgo y ligera en API: la búsqueda se ejecuta localmente, y Claude solo interviene cuando el usuario revisa los resultados.
181
+
182
+ **Estado:** Planificado.
183
+
184
+ ---
185
+
186
+ ## Planificado — v2.8.0: Salida importable en editores y formatos de integración
187
+
188
+ Convertir las transcripciones en artefactos que un editor de video importa directamente, de modo que la transcripción alimente la edición en lugar de detenerse en un archivo de texto — la motivación central del proyecto: hacer manejable un gran archivo de metraje en bruto para un creador en solitario.
189
+
190
+ - **CSV de marcadores primero** — los inicios de segmento como un CSV de marcadores/capítulos que Premiere, Resolve y YouTube importan de forma nativa. Aporta la mayor parte del valor de "meterlo en mi editor" a una fracción del coste y la fragilidad entre versiones de un formato de línea de tiempo completo.
191
+ - **Datos de tiempo a nivel de palabra** — exponer el JSON de tokens completos de whisper.cpp (`--output-json-full` / `-ojf`) y las marcas de tiempo de palabra alineadas con DTW (`--dtw <preset>`, emparejado automáticamente con el modelo activo; existen presets para todas las familias, incluida `large.v3.turbo`, y se aplican a los modelos cuantizados). Esta es la capa de tiempo preciso sobre la que se asientan el SRT a nivel de palabra, la colocación de marcadores y la alineación de clips; el JSON por token también incluye valores de confianza para quien los quiera. Nota: `--dtw` es un **flag de carga/contexto** (se establece en la inicialización del modelo, no por solicitud), por lo que reside en la ruta CLI de un solo uso — la API `/inference` del `whisper-server` residente no puede aplicarlo por solicitud, coherente con el rechazo del nivel de palabra en modo servidor de v2.5.0.
192
+ - **Cerrar la brecha de JSON en segundo plano** — JSON actualmente recurre a texto en modo en segundo plano.
193
+ - **FCPXML / EDL — diferido:** verbosos, sensibles a la versión y arrastran hacia el alcance de la integración con el editor. Reconsiderar solo si el CSV de marcadores resulta insuficiente.
194
+
195
+ **Límite de alcance:** esto genera archivos que el editor *importa* — no automatiza la interfaz del editor. El intercambio estándar está alineado con la filosofía y es ligero en dependencias; controlar la aplicación es una cuestión aparte.
196
+
197
+ Combina con v2.7.0: busca en el archivo para encontrar el momento y luego entrega al editor un archivo de marcadores para saltar directamente a él.
198
+
199
+ ---
200
+
201
+ ## Planificado — v2.9.0: Calidad y ajuste de la transcripción
202
+
203
+ Profundidad en la precisión y el control de la transcripción — todos son passthroughs de cero dependencias de flags de whisper.cpp que el wrapper aún no expone. Cada opción de aquí es un parámetro de transcripción de un solo uso: sin sobrecarga adicional de llamadas a herramientas, plenamente funcional para los usuarios del plan gratuito.
204
+
205
+ - **Ajuste de VAD** — los controles de detección de actividad de voz (`--vad-threshold`, duración mínima de habla / mínima de silencio / máxima de habla, relleno de habla, solapamiento de muestras). El VAD ya está activo pero no es ajustable; estos corrigen la sobre- y sub-segmentación que hay detrás de la mayoría de las quejas de calidad del mundo real.
206
+ - **Supresión de tokens no de habla** (`--suppress-nst`) — descarta los artefactos de `[music]`/ruido para transcripciones más limpias.
207
+ - **Solo detección de idioma** (`--detect-language`) — una sonda barata de "¿qué idioma es este?" que retorna sin una pasada de transcripción completa. Valiosa para la audiencia multilingüe y para el enrutamiento previo a la transcripción.
208
+ - **Umbrales de robustez / decodificación** — `--entropy-thold`, `--logprob-thold`, `--word-thold`, `--no-fallback`, `--temperature-inc`, `--carry-initial-prompt`, `--suppress-regex` para audio difícil.
209
+ - **Controles de rendimiento** — flash attention (ahora **activo por defecto** en el whisper.cpp actual; exponer la vía de desactivación `--no-flash-attn` / `-nfa` en lugar de tratarlo como opcional), solo CPU (`--no-gpu`), tamaño del contexto de audio (`--audio-ctx`).
186
210
 
187
211
  **Estado:** Planificado.
188
212
 
189
213
  ---
190
214
 
191
- ## Planificado — v2.8.0: Formatos de salida mejorados e integración
215
+ ## Planificado — v3.0.0: Suite de post-procesamiento de subtítulos
216
+
217
+ Una capa de procesamiento por lotes en TypeScript puro sobre el SRT / VTT / JSON que el servidor ya emite — sin re-transcripción, sin nuevas dependencias, con un único parser/serializador compartido. Refleja la cadena de "conversión por lotes" de los editores de subtítulos dedicados (Subtitle Edit, Aegisub), que ningún MCP de transcripción competidor ofrece. La pasada de reparación de tiempos, en particular, apunta a los defectos que exhibe la salida cruda de Whisper — cues en blanco sobre el silencio, segmentos solapados o demasiado cortos, duplicados por bucle de repetición, líneas demasiado largas — de modo que la suite limpia la *propia* salida de este servidor, no solo los archivos importados.
218
+
219
+ - **Reparación y validación de tiempos** — imponer una duración mínima / máxima de cue; corregir los cues solapados; aplicar un intervalo mínimo entre cues; salvar los intervalos por debajo del umbral (extender hasta el siguiente); descartar los cues vacíos; fusionar los cues duplicados (bucles de repetición de whisper); limitar a dos líneas; ordenar y renumerar. Más un **informe de lint** no mutante que señala, por cue, las infracciones de velocidad de lectura (CPS), caracteres por línea y número de líneas frente a un perfil seleccionable (por ejemplo, YouTube 42 CPL / 20 CPS, Netflix 42 / 17) — el entregable que los editores realmente quieren antes de importar.
220
+ - **Re-temporización** — desplazar / ajustar todos los cues; re-temporizar por velocidad de fotogramas (por ejemplo, 23.976 ↔ 25).
221
+ - **Reflujo** — fusionar los cues cortos; dividir las líneas largas hasta un máximo de caracteres por línea / caracteres por segundo, equilibrando las dos líneas en lugar de una división voraz.
222
+ - **Conversión de formato** — convertir archivos existentes entre SRT / VTT / LRC / CSV / Markdown / texto plano, más salida ASS/SSA (con estilo por defecto), sin re-transcribir. Normalización de UTF-8 / fin de línea al escribir (satisface el requisito de UTF-8 de YouTube, evita el mojibake al re-importar).
223
+ - **Limpieza de texto** — buscar/reemplazar (regex opcional), eliminación de muletillas a partir de una lista de palabras estática (no un LLM), normalización de mayúsculas/minúsculas, eliminación de anotaciones para personas con discapacidad auditiva. Estrictamente mecánica — cualquier cosa que requiera juicio (reparación de OCR, inferencia de puntuación) queda fuera; el Claude anfitrión se encarga de eso sobre el texto devuelto.
224
+ - **Formateo de etiquetas de hablante** — formatear los turnos existentes de estéreo / TinyDiarize como bloques con prefijo de hablante.
225
+ - **Estadísticas de resumen** — conteo de palabras, duración, PPM, CPS medio, proporción de silencio.
192
226
 
193
- Salida ampliada para flujos de trabajo de análisis e integración downstream. Una brecha concreta que cerrar: la salida JSON actualmente no está soportada en modo en segundo plano (cae de vuelta a texto). JSON a nivel de palabra para alineación de clips y otros formatos de integración se definirán a partir de los comentarios de usuarios.
227
+ **Restricciones de diseño:**
228
+ - TypeScript puro sobre el SRT / VTT / JSON que el servidor ya emite — sin re-transcripción, sin nuevas dependencias en tiempo de ejecución, con un único parser/serializador compartido.
229
+ - Opera solo sobre archivos de subtítulos/transcripción existentes — nunca invoca whisper ni ffmpeg, nunca toca el audio.
230
+ - Determinista y basada únicamente en reglas — sin LLM, sin nube, sin reparación "inteligente". Cualquier cosa que requiera juicio (correcciones de OCR, inferencia de puntuación) queda fuera; el Claude anfitrión se encarga de eso sobre el texto devuelto.
231
+ - No destructiva — escribe archivos nuevos; nunca sobrescribe un archivo de origen in situ sin la confirmación explícita del usuario.
232
+ - La pasada de lint / validación es no mutante — informa de las infracciones, nunca reescribe silenciosamente.
233
+ - Solo formatos de intercambio estándar — nunca controla la interfaz de un editor.
234
+
235
+ **Estado:** Planificado.
194
236
 
195
237
  ---
196
238
 
197
239
  ## Más adelante / En consideración
198
240
 
199
- No programado, pero fiel a la filosofía y revisado según lo permita la capacidad.
241
+ Sin programar, pero fiel a la filosofía y revisado según lo permita la capacidad.
200
242
 
201
243
  ### Migración a Bun
202
244
  Migrar el runtime de Node.js a [Bun](https://bun.sh) para recortar el tiempo de arranque en frío del servidor MCP y eliminar el paso de compilación `tsc` (el código fuente se ejecuta directamente). Degradada de su antiguo puesto en v2.5.0: dado que el coste de recarga del modelo por invocación es el verdadero cuello de botella (ver v2.5.0 arriba), recortar el arranque de Node es una ganancia marginal, y la madurez de Bun en Windows más un cambio en el modelo de distribución conllevan riesgo. Vale la pena hacerlo eventualmente como una optimización opcional, no como una prioridad.
203
245
 
204
246
  ### Flujo de trabajo de renombrado y coincidencia de proyecto de video
205
- La mitad más pesada de las herramientas de proyecto, una vez que aterrice la Búsqueda de transcripciones en todo el proyecto (v2.7.0): coincidencia aproximada de transcripciones de clips editados con transcripciones fuente para encontrar los puntos de origen, y mostrar nombres de archivo descriptivos sugeridos por Claude.
247
+ La mitad más pesada de las herramientas de proyecto, una vez que aterrice la Búsqueda de transcripciones en todo el proyecto (v2.7.0): coincidencia aproximada de las transcripciones de clips editados con las transcripciones fuente para localizar los puntos de origen, y presentar nombres de archivo descriptivos sugeridos por Claude.
206
248
 
207
249
  **Restricciones de diseño:**
208
- - Los archivos fuente **nunca son renombrados ni modificados**
250
+ - Los archivos fuente **nunca se renombran ni se modifican**
209
251
  - Todos los renombrados requieren **confirmación explícita del usuario**
210
- - El análisis y la coincidencia ocurren localmente — Claude solo es llamado cuando el usuario revisa los resultados, minimizando llamadas a la API
252
+ - El análisis y la coincidencia ocurren localmente — Claude solo se invoca cuando el usuario revisa los resultados, minimizando las llamadas a la API
211
253
 
212
254
  **Estado:** Fase de diseño.
213
255
 
214
256
  ### Limpieza de transcripciones basada en reglas
215
- Post-procesamiento local y determinista — eliminación de muletillas y falsos comienzos, controlado por el usuario. Más valioso para usuarios del modo de privacidad, donde la transcripción nunca llega a Claude para su limpieza. Deliberadamente acotado: los saltos de párrafo y la segmentación por temas son cosas que Claude ya hace bien sobre el texto devuelto, y la exportación a PDF/DOCX es un desbordamiento de alcance hacia la generación de documentos — ambos fuera de alcance aquí.
257
+ Post-procesamiento local y determinista — eliminación de muletillas y falsos comienzos, controlada por el usuario. Más valiosa para los usuarios del modo de privacidad, donde la transcripción nunca llega a Claude para su limpieza. Deliberadamente acotada: los saltos de párrafo y la segmentación por temas son cosas que Claude ya hace bien sobre el texto devuelto, y la exportación a PDF/DOCX es un desbordamiento de alcance hacia la generación de documentos — ambos fuera de alcance aquí.
216
258
 
217
- **Estado:** En consideración.
259
+ **Estado:** Promovida — la limpieza determinista está programada en la Suite de post-procesamiento de subtítulos de v3.0.0; las notas sobre lo fuera de alcance (saltos de párrafo, PDF/DOCX) siguen vigentes.
218
260
 
219
261
  ### Diarización de hablantes (pyannote-audio)
220
- Diarización de hablantes mono completa con etiquetas de ID de hablante a lo largo de toda la grabación. Diferente del flag `--diarize` estéreo integrado (v2.2.0) y TinyDiarize (v2.6.0).
262
+ Diarización de hablantes mono completa con etiquetas de ID de hablante a lo largo de toda la grabación. Distinta del flag `--diarize` estéreo integrado (v2.2.0) y de TinyDiarize (v2.5.0).
221
263
 
222
- **Implementación:** requiere [pyannote-audio](https://github.com/pyannote/pyannote-audio) — una biblioteca de Python con requisito de token de acceso a Hugging Face, un stack de dependencias completamente separado. Despriorizada: choca con la filosofía de local primero / cero dependencias, y TinyDiarize ya cubre el caso mono de cero dependencias. Si se persigue, se distribuiría como un complemento avanzado opcional con su propia documentación de configuración, nunca en el paquete principal.
264
+ **Implementación:** requiere [pyannote-audio](https://github.com/pyannote/pyannote-audio) — una biblioteca de Python con un requisito de token de acceso a Hugging Face, un stack de dependencias completamente aparte. Despriorizada: choca con la filosofía de local primero / cero dependencias, y TinyDiarize ya cubre el caso mono de cero dependencias. Si se persigue, se distribuiría como un complemento avanzado opcional con su propia documentación de configuración, nunca en el paquete principal.
223
265
 
224
266
  **Estado:** Despriorizada / opcional.
225
267
 
226
- ### Traducción a idiomas que no sean inglés
268
+ ### Traducción a idiomas distintos del inglés
227
269
  El flag `--translate` de Whisper solo apunta al inglés. Los idiomas de destino arbitrarios necesitan una API de traducción externa o un modelo de traducción local.
228
270
 
229
- **Opciones bajo consideración:** LibreTranslate (puede ser autoalojado, local primero), traducción LLM local, o documentación explícita como fuera de alcance.
271
+ **Opciones bajo consideración:** LibreTranslate (autoalojable, local primero), traducción con un LLM local, o documentación explícita como fuera de alcance.
230
272
 
231
- **Estado:** Aplazado pendiente de una decisión de local primero vs. dependencia de API.
273
+ **Estado:** Aplazado pendiente de una decisión de local primero frente a dependencia de API.
232
274
 
233
275
  ---
234
276
 
235
277
  ## Fuera de alcance / No planificado
236
278
 
237
- Funcionalidades excluidas intencionalmente, registradas aquí para que la decisión sea explícita y no resurja repetidamente.
279
+ Funcionalidades excluidas intencionadamente, registradas aquí para que la decisión sea explícita y no resurja repetidamente.
238
280
 
239
281
  ### Transcripción de micrófono en vivo — no planificada
240
282
  La transcripción en tiempo real desde un micrófono en vivo estaba antes prevista para v2.7.0. Descartada porque choca con el diseño central del proyecto:
241
- - **Desajuste de arquitectura:** MCP es de solicitud/respuesta, no de streaming. La captura en vivo requeriría o bien polling continuo (consume presupuesto de API) o bien una llamada de larga duración que alcanza la guarda de tiempo de espera en primer plano de v2.4.0.
242
- - **Principios de una única instancia / minimizar API:** devolver segmentos continuos a Claude es una constante rotación de llamadas a herramientas — lo opuesto a "funcional para usuarios del plan gratuito" — y un proceso de streaming de larga duración tensiona el bloqueo de proceso.
243
- - **Dependencia externa:** dependería de una API de streaming estable en whisper.cpp que no está en nuestras manos programar.
283
+ - **Desajuste de arquitectura:** MCP es de solicitud/respuesta, no de streaming. La captura en vivo requeriría o bien un sondeo continuo (que quema presupuesto de API) o bien una llamada de bloqueo prolongado que alcanza la guarda de tiempo de espera en primer plano de v2.4.0.
284
+ - **Principios de una única instancia / minimizar API:** devolver segmentos continuos a Claude es una rotación constante de llamadas a herramientas — lo opuesto a "funcional para los usuarios del plan gratuito" — y un proceso de streaming de larga duración tensiona el bloqueo de proceso.
285
+ - **Dependencia externa:** requeriría una dependencia externa adicional.
244
286
 
245
287
  El subtitulado en vivo es una categoría de producto distinta (baja latencia, gestión de dispositivos, VAD) de una herramienta de transcripción de archivos/lotes. Los usuarios que lo necesiten están mejor servidos por una herramienta dedicada en tiempo real.
246
288
 
247
289
  ### Transcripción de URL de YouTube (yt-dlp) — no planificada como herramienta incluida
248
- La transcripción directa de YouTube a texto via yt-dlp estaba antes planificada. Descartada como funcionalidad de primera clase porque:
290
+ La transcripción directa de YouTube a texto mediante yt-dlp estaba antes planificada. Descartada como funcionalidad de primera clase porque:
249
291
  - **Superficie de seguridad:** añade la obtención de URLs arbitrarias y una llamada a subproceso con entrada controlada por el usuario, revirtiendo el fortalecimiento de v2.4.0 que redujo exactamente esa superficie.
250
292
  - **Mantenimiento:** yt-dlp se rompe con frecuencia a medida que YouTube cambia — un compromiso de mantenimiento continuo.
251
293
  - **Local primero y licencias:** la adquisición de contenido por red se sitúa fuera del alcance de local primero, y empaquetar un descargador en un proyecto con licencia comercial es una zona gris de ToS/responsabilidad.
@@ -257,11 +299,11 @@ La transcripción directa de YouTube a texto via yt-dlp estaba antes planificada
257
299
 
258
300
  ## Licenciamiento
259
301
 
260
- whisper-windows-mcp usa licencia dual.
302
+ whisper-windows-mcp tiene licencia dual.
261
303
 
262
304
  **Uso no comercial:** MIT — gratuito para uso personal, educativo y no comercial. Ver [LICENSE](LICENSE).
263
305
 
264
- **Uso comercial:** Se requiere un acuerdo de licencia comercial separado para cualquier uso empresarial, profesional o que genere ingresos. Ver [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md).
306
+ **Uso comercial:** se requiere una licencia comercial separada para cualquier uso empresarial, profesional o que genere ingresos. Ver [COMMERCIAL-LICENSE.md](COMMERCIAL-LICENSE.md) para los términos y la información de contacto.
265
307
 
266
308
  ---
267
309
 
@@ -273,7 +315,7 @@ Disponible en [npm](https://www.npmjs.com/package/whisper-windows-mcp), [mcpserv
273
315
 
274
316
  ## Documentación multilingüe
275
317
 
276
- Los siguientes archivos deben ser actualizados para coincidir con los documentos en inglés tras cada release:
318
+ Los siguientes archivos deben actualizarse para coincidir con los documentos en inglés tras cada release:
277
319
 
278
320
  **Japonés (`*.ja.md`)** — `README.ja.md` / `TROUBLESHOOTING.ja.md` / `ROADMAP.ja.md` / `PRIVACY.ja.md` / `SECURITY.ja.md`
279
321
 
@@ -285,7 +327,7 @@ Los siguientes archivos deben ser actualizados para coincidir con los documentos
285
327
 
286
328
  **Ucraniano (`*.uk.md`)** — `README.uk.md` / `TROUBLESHOOTING.uk.md` / `ROADMAP.uk.md` / `PRIVACY.uk.md` / `SECURITY.uk.md`
287
329
 
288
- **Portugués Brasileño (`*.pt-BR.md`)** — `README.pt-BR.md` / `TROUBLESHOOTING.pt-BR.md` / `ROADMAP.pt-BR.md` / `PRIVACY.pt-BR.md` / `SECURITY.pt-BR.md`
330
+ **Portugués brasileño (`*.pt-BR.md`)** — `README.pt-BR.md` / `TROUBLESHOOTING.pt-BR.md` / `ROADMAP.pt-BR.md` / `PRIVACY.pt-BR.md` / `SECURITY.pt-BR.md`
289
331
 
290
332
  **Español (`*.es.md`)** — `README.es.md` / `TROUBLESHOOTING.es.md` / `ROADMAP.es.md` / `PRIVACY.es.md` / `SECURITY.es.md`
291
333
 
@@ -299,6 +341,6 @@ Las contribuciones de la comunidad para otros idiomas son bienvenidas.
299
341
 
300
342
  ## Contribuciones
301
343
 
302
- Los pull requests son bienvenidos. Revisa las issues existentes antes de comenzar a trabajar.
344
+ Los pull requests son bienvenidos. Revisa las issues existentes antes de empezar a trabajar.
303
345
 
304
- Si has probado la aceleración por GPU en hardware no listado arriba, abre una issue con el modelo de GPU, VRAM, tamaño de modelo y throughput observado. Esto ayuda a construir una referencia de rendimiento precisa para otros usuarios.
346
+ Si has probado la aceleración por GPU en hardware no listado arriba, abre una issue con el modelo de tu GPU, la VRAM, el tamaño del modelo y el throughput observado. Esto ayuda a construir una referencia de rendimiento precisa para otros usuarios.