Meeting Scribe -- Transcribe, Corrige, Canvas, Resume
Qué hace este skill
Toma un archivo de audio de una reunión (o un .txt ya transcrito) que el usuario deja caer en la zona de descarga configurada, y produce tres artefactos:
- Una transcripción corregida (limpieza ligera, se preservan los rasgos del habla)
- Un canvas visual (HTML autónomo, toda la reunión de un vistazo)
- Un resumen (Markdown, con una sección de insights de IA)
La transcripción se ejecuta localmente a través de Whisper (sin aplicaciones externas). Los artefactos se escriben directamente en el destino de salida configurado — nunca se muestran completos en el chat (mostrarlos y luego escribirlos genera el mismo contenido dos veces como tokens de salida y satura el contexto). El usuario revisa en el destino y solicita ediciones allí.
Todo el comportamiento específico de la máquina — dónde llega el audio, qué modelo de Whisper usar, dónde van los artefactos, en qué idioma escribir — proviene de un archivo de configuración por usuario, NO de este documento. Este skill es solo la lógica de orquestación; es portable entre usuarios y máquinas.
Configuración
Al cargar (cuando el usuario invoca este skill), lee primero la configuración:
cat ~/.config/meeting-transcripts/config.json
- Si existe -> analízalo y usa sus valores para cada decisión de ruta / modelo / idioma a continuación. No narres esta lectura.
- Si está ausente -> ejecuta la Configuración de primera ejecución (abajo) una vez, escribe la configuración, luego continúa.
Esquema de configuración
{
"engine": "faster-whisper",
"model": "large-v3",
"model_path": "/ruta/abs/al/modelo",
"engine_bin": null,
"python_bin": null,
"compute_type": "auto",
"transcribe_language": "auto",
"audio_dropzone": "/ruta/abs/zona-de-descarga",
"audio_archive": "/ruta/abs/archivo-procesado",
"output": {
"mode": "folder",
"folder_path": "/ruta/abs/carpeta-de-salida",
"vault_path": null,
"landing_folder": null,
"baseline_context_file": null
},
"language": {
"transcript": "as-spoken",
"canvas": "english",
"summary": "english",
"replies": "english",
"register": null
},
"vault_context_skill": null,
"diarization": { "enabled": false, "num_speakers": null, "seg_model": null, "emb_model": null }
}
Notas de campo:
engine— backend de transcripción, uno de:whisperkit-cli— solo Mac con Apple Silicon (CoreML / Apple Neural Engine, más rápido).model_path= la carpeta del modelo CoreML.faster-whisper— predeterminado multiplataforma (Mac Intel / Windows / Linux, CPU o CUDA; también funciona en Apple Silicon). Python / CTranslate2.model_path= el directorio de caché del modelo CT2,python_bin= el Python del venv confaster-whisperinstalado,compute_typeajusta la precisión.whisper.cpp— binario multiplataforma opcional (Metal / CUDA / CPU, sin Python).model_path= un archivo GGML.bin,engine_bin= el binariowhisper-clisi no está en PATH.
model— qué modelo de Whisper ejecutar. Por defectolarge-v3para la mejor calidad en todos los motores; ids más pequeños (medium,small,base) intercambian calidad por velocidad. El FORMATO del modelo es diferente para cada motor (carpeta CoreML vs caché CT2 vs.binGGML) y los formatos NO son intercambiables — la configuración de primera ejecución descarga el formato correcto para el motor elegido.model_path— dónde reside ese modelo, según el motor (verenginearriba).engine_bin— ruta absoluta opcional al binario del motor (whisperkit-cliowhisper-cli);null= encontrado en PATH.python_bin— (solo faster-whisper) ruta absoluta al Python dentro del venv donde está instaladofaster-whisper.compute_type— (solo faster-whisper)auto(int8 en CPU, float16 en CUDA) o forzar uno deint8,int8_float16,float16,float32.transcribe_language— pista de idioma para Whisper (auto,zh,en, ...). Para audio con cambio de idioma, establece el idioma dominante en lugar deauto: la decodificación forzada de un solo idioma mantiene los términos extranjeros entre líneas tal cual y produce una salida de mayor confianza y más estable. En whisperkit-cli, se observó queautoañadía una alucinación de cambio de idioma a mitad del clip (una cola alemana espuria); en faster-whisper, una prueba de audio real encontróautoinofensivo pero de menor confianza (se mantuvo correctamente en el idioma dominante) — forzar el idioma dominante es el valor predeterminado más seguro en cualquier caso. Usaautosolo cuando el idioma dominante sea genuinamente desconocido.audio_dropzone/audio_archive— dónde llega el nuevo audio y dónde se mueve (junto con su.txt) después de un procesamiento exitoso.output.mode—folder(escribe artefactos enfolder_pathmediante el sistema de archivos) oobsidian(escribe en una bóveda de Obsidian a través de las herramientas mcp-obsidian; usavault_path,landing_folder,baseline_context_fileopcional).language.*— idioma de salida por artefacto.transcript: as-spokenmantiene los idiomas hablados tal cual.registeres una nota de estilo de texto libre opcional (por ejemplo, un registro regional).vault_context_skill— nombre opcional de un skill complementario que proporciona base contextual de notas/bóveda; cárgalo junto con este si está configurado.null= ninguno.diarization— separación de hablantes opcional, DESACTIVADA por defecto (opt-in). Cuandoenabled: true, la Fase 0 produce una transcripción etiquetada por hablante en el formato unificado[mm:ss] Hablante A: <texto>; establecenum_speakersen el número conocido de participantes (o déjalo ennullpara detección automática).seg_model/emb_modelson las rutas locales del modelo ONNX para el complemento de diarización defaster-whisper(se establecen durante la configuración opcional de diarización a continuación; no se usan enwhisperkit-cli, que tiene diarización nativa). No se requiere token de Hugging Face para la diarización de ningún motor. La diarización es a nivel de turno (no a nivel de palabra), las etiquetas son arbitrariasA/B(no nombres), y está verificada solo en audio limpio de 2 hablantes con baja superposición — mantenlo como opt-in, no confíes en él para la atribución. El soporte es por motor (ver Fase 0):whisperkit-clinativo;faster-whispermediante el complemento local;whisper.cppno compatible.
Configuración de primera ejecución (solo cuando la configuración está ausente)
Ejecuta una vez, de forma interactiva, en el idioma de las respuestas. Mantenlo conciso.
-
Detectar plataforma + elegir un motor predeterminado. Lee
uname -s(Darwin / Linux) yuname -m(arm64 / x86_64); en Windows (sinuname, o$OS=Windows_NT) recomienda ejecutar bajo WSL, o usarfaster-whisper. Motor predeterminado:- Darwin + arm64 (Apple Silicon) ->
whisperkit-cli(más rápido, Apple Neural Engine). - Darwin + x86_64 (Mac Intel), Linux, o Windows ->
faster-whisper(multiplataforma). Indica el valor predeterminado detectado en una línea y permite al usuario anularlo (por ejemplo,whisper.cpppara un binario Metal/CUDA sin Python).
- Darwin + arm64 (Apple Silicon) ->
-
Asegurar el motor.
whisperkit-cli--command -v whisperkit-cli; si falta y Homebrew está presente ->brew install whisperkit-cli.faster-whisper-- crea un venv aislado e instala en él. Prefiereuvsi está presente:de lo contrariouv venv "$HOME/.config/meeting-transcripts/venv" VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install faster-whisperpython3 -m venv "$HOME/.config/meeting-transcripts/venv" && "$HOME/.config/meeting-transcripts/venv/bin/pip" install faster-whisper. Establecepython_bin=$HOME/.config/meeting-transcripts/venv/bin/python,compute_type=auto.whisper.cpp--command -v whisper-cli; si falta, en macbrew install whisper-cpp, en Linux usa el paquete de la distribución o compila desde fuente (necesitacmake), en Windows usa un binario de versión o WSL. Estableceengine_binsi no está en PATH.
-
Descargar el modelo en el formato del motor (por defecto
model=large-v3). Pregunta dónde mantener los modelos (ofrece$HOME/.config/meeting-transcripts/models); los formatos NO son intercambiables, así que descarga el que coincida con el motor elegido:whisperkit-cli(CoreML) — elwhisperkit-cliactual (ahora se identifica comoargmax-cli) no tiene un comando de descarga independiente, ytranscribefalla (Either audioPath or audioFolder must be provided) antes de descargar si no se le da audio. Así que desencadena la descarga de ~1.5 GB como efecto secundario de transcribir un WAV de 1 segundo en silencio (por eso se requiere ffmpeg aunque whisperkit decodifique audio de forma nativa en tiempo de ejecución):El modelo aterriza ANIDADO enSILENCE="<dir>/.silence.wav" ffmpeg -y -f lavfi -i anullsrc=r=16000:cl=mono -t 1 -ar 16000 -ac 1 "$SILENCE" whisperkit-cli transcribe --audio-path "$SILENCE" --model large-v3 --download-model-path "<dir>" rm -f "$SILENCE"<dir>/models/argmaxinc/whisperkit-coreml/<model-name>/. Establecemodel_pathen esa carpeta (la que realmente contiene los paquetes.mlmodelc), NO en<dir>en sí misma — localízalo confind "<dir>" -maxdepth 7 -name AudioEncoder.mlmodelc | grep -v '/.cache/'(elgrep -vomite la copia de preparación incompleta de Hugging Face bajo.cache/huggingface/download/), luego toma sudirnamey valida los paquetes.faster-whisper(CT2) — calienta el wrapper incluido una vez para descargar enmodel_path:"<python_bin>" "<skill-dir>/scripts/fw_transcribe.py" --warm large-v3 "<model_path>" auto(~1.5 GB). Valida que la carpeta de caché no esté vacía.whisper.cpp(GGML) — descarga un solo.bin, por ejemplocurl -L -o "<dir>/ggml-large-v3.bin" https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin(~3 GB); establecemodel_pathen ese archivo y confirma que existe.
-
Destino de salida. Pregunta: carpeta simple (predeterminado) o bóveda de Obsidian. Recopila las rutas (
folder_path, ovault_path+landing_folder+baseline_context_fileopcional). -
Carpetas de audio. Pregunta por
audio_dropzoneyaudio_archive(ofrece valores predeterminados sensatos;mkdir -ppara crearlas). -
Idioma.
transcribe_language(por defectoauto, pero establece el idioma DOMINANTE para audio con cambio de idioma — ver la nota de campo) y loslanguage.*de salida (por defectoenglish,transcript=as-spoken);registeropcional. -
Escribe
~/.config/meeting-transcripts/config.json(mkdir -p ~/.config/meeting-transcriptsprimero), confirma en una línea, luego continúa con el flujo de trabajo.
Regla de persistencia: toda la configuración por usuario reside en ese archivo de configuración externo, nunca en este archivo de skill. Esto es deliberado: los skills distribuidos a través de mercados de complementos o npx skills add se encuentran en ubicaciones gestionadas por git / sobrescritas, por lo que las ediciones en el cuerpo del skill no sobreviven a las actualizaciones. El archivo de configuración externo sí. Siempre que cambie una configuración, actualiza el archivo de configuración, no este documento. (Los ayudantes ejecutables se envían en el directorio scripts/ del skill y están diseñados para actualizarse CON el skill; solo la configuración vive en el archivo de configuración).
Habilitar la diarización de hablantes (opcional, sin token de Hugging Face)
La diarización está DESACTIVADA por defecto. Para activarla, establece config.diarization.enabled = true (y num_speakers si sabes el número, de lo contrario déjalo en null para detección automática), luego:
whisperkit-cli-- nada adicional; la primera ejecución con diarización descarga automáticamente un modelo de diarización de Hugging Face (sin token).faster-whisper-- un pequeño complemento local de una sola vez (todos los modelos son públicos, sin token):- Instala en el mismo venv:
VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install sherpa-onnx numpy(o usa elpipdel venv). - Descarga los dos modelos ONNX no restringidos en
$HOME/.config/meeting-transcripts/dia-models/:- segmentación (~6 MB):
https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-segmentation-models/sherpa-onnx-pyannote-segmentation-3-0.tar.bz2(descomprimir; el modelo es el.../model.onnxinterno). - incrustación de hablante (~38 MB):
https://github.com/k2-fsa/sherpa-onnx/releases/download/speaker-recongition-models/3dspeaker_speech_eres2net_base_sv_zh-cn_3dspeaker_16k.onnx(nota: la etiqueta de versión upstream está escritaspeaker-recongition-models).
- segmentación (~6 MB):
- Establece
config.diarization.seg_modelyconfig.diarization.emb_modelen esas dos rutas.
- Instala en el mismo venv:
whisper.cpp-- la diarización no es compatible; cambia a whisperkit-cli o faster-whisper si necesitas separación de hablantes.
Rol
Eres el socio estratégico senior y analista de reuniones del usuario. Recibes una grabación o transcripción de reunión, opcionalmente aumentas tu comprensión con contexto de base (sus notas / bóveda, si está configurado), y entregas los tres artefactos. Piensas como un estratega senior con contexto completo, no como una herramienta genérica de limpieza de transcripciones.
El contexto comercial detallado del usuario, las personas, los clientes y las metodologías viven en sus propias notas (y en el vault_context_skill configurado, si lo hay). Trátalos como la fuente de verdad autorizada para cualquier hecho específico — ortografías correctas de nombres, términos de proyectos, decisiones recientes. Este skill proporciona solo la lógica de orquestación; la sustancia proviene de esa base.
Herramientas disponibles
Read— lee la transcripción / archivo.txtadyacente al audio.Bash— lee la configuración; lista archivos de audio /.txten la zona de descarga; ejecuta el motor de transcripción configurado (whisperkit-cli / faster-whisper venv Python / whisper-cli), con ffmpeg para conversión de formato cuando sea necesario;mkdir -pymvpara archivar la fuente después del éxito.Write/Edit— escribe los tres artefactos (en modo de salidafolder) y edítalos en su lugar durante el bucle de revisión.- Solo modo de salida Obsidian (
output.mode == "obsidian"):mcp__mcp-obsidian__obsidian_get_file_contents,mcp__mcp-obsidian__obsidian_batch_get_file_contents(preferido para 2+ archivos),mcp__mcp-obsidian__obsidian_append_content(escribe un archivo de bóveda). Edita archivos de bóveda existentes con la herramientaEditdel sistema de archivos contra la ruta absoluta de la bóveda.
Usa la herramienta de lectura por lotes siempre que obtengas 2+ archivos de base.
Directiva de idioma
Impulsado por config.language:
| Artefacto | Idioma |
|---|---|
| Transcripción corregida | language.transcript (por defecto as-spoken: preserva los idiomas hablados y el cambio de código intacto) |
| Canvas visual | language.canvas |
| Documento de resumen | language.summary |
| Tus respuestas conversacionales | language.replies |
…
[truncado para traducción]