Communitygithub.com

Meeting Scribe — Transcripción, Corrección, Canvas, Resumen

Transcripción local y multiplataforma de reuniones -> transcripción corregida + canvas HTML de precisión + resumen con insights de IA. Un skill para Claude Code.

¿Qué es Meeting Scribe — Transcripción, Corrección, Canvas, Resumen?

Meeting Scribe es un skill para agents de IA (como Claude Code) que automatiza el flujo de trabajo completo de una reunión: desde un archivo de audio o una transcripción ya existente, genera tres artefactos clave: una transcripción corregida con limpieza ligera pero preservando los rasgos del habla, un canvas visual HTML autónomo que muestra la reunión de un vistazo, y un resumen en Markdown con una sección de insights de IA. La transcripción se ejecuta localmente mediante motores como Whisper (faster-whisper, whisperkit-cli o whisper.cpp), sin depender de servicios externos. Los artefactos se escriben directamente en una carpeta de salida o en una bóveda de Obsidian, y nunca se muestran completos en el chat para evitar duplicar tokens de salida. El skill es altamente configurable mediante un archivo JSON por usuario, lo que permite adaptar rutas, modelo de Whisper, idioma, diarización opcional y más. Soporta múltiples plataformas (macOS, Linux, Windows/WSL) y está diseñado para ser portable: la lógica de orquestación está separada de la configuración específica de cada máquina.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add breakthrough-edu/meeting-scribe

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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:

  1. Una transcripción corregida (limpieza ligera, se preservan los rasgos del habla)
  2. Un canvas visual (HTML autónomo, toda la reunión de un vistazo)
  3. 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 con faster-whisper instalado, compute_type ajusta la precisión.
    • whisper.cpp — binario multiplataforma opcional (Metal / CUDA / CPU, sin Python). model_path = un archivo GGML .bin, engine_bin = el binario whisper-cli si no está en PATH.
  • model — qué modelo de Whisper ejecutar. Por defecto large-v3 para 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 .bin GGML) 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 (ver engine arriba).
  • engine_bin — ruta absoluta opcional al binario del motor (whisperkit-cli o whisper-cli); null = encontrado en PATH.
  • python_bin — (solo faster-whisper) ruta absoluta al Python dentro del venv donde está instalado faster-whisper.
  • compute_type — (solo faster-whisper) auto (int8 en CPU, float16 en CUDA) o forzar uno de int8, 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 de auto: 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ó que auto añ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ó auto inofensivo 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. Usa auto solo 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 en folder_path mediante el sistema de archivos) o obsidian (escribe en una bóveda de Obsidian a través de las herramientas mcp-obsidian; usa vault_path, landing_folder, baseline_context_file opcional).
  • language.* — idioma de salida por artefacto. transcript: as-spoken mantiene los idiomas hablados tal cual. register es 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). Cuando enabled: true, la Fase 0 produce una transcripción etiquetada por hablante en el formato unificado [mm:ss] Hablante A: <texto>; establece num_speakers en el número conocido de participantes (o déjalo en null para detección automática). seg_model / emb_model son las rutas locales del modelo ONNX para el complemento de diarización de faster-whisper (se establecen durante la configuración opcional de diarización a continuación; no se usan en whisperkit-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 arbitrarias A / 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-cli nativo; faster-whisper mediante el complemento local; whisper.cpp no 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.

  1. Detectar plataforma + elegir un motor predeterminado. Lee uname -s (Darwin / Linux) y uname -m (arm64 / x86_64); en Windows (sin uname, o $OS = Windows_NT) recomienda ejecutar bajo WSL, o usar faster-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.cpp para un binario Metal/CUDA sin Python).
  2. 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. Prefiere uv si está presente:
      uv venv "$HOME/.config/meeting-transcripts/venv"
      VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install faster-whisper
      
      de lo contrario python3 -m venv "$HOME/.config/meeting-transcripts/venv" && "$HOME/.config/meeting-transcripts/venv/bin/pip" install faster-whisper. Establece python_bin = $HOME/.config/meeting-transcripts/venv/bin/python, compute_type = auto.
    • whisper.cpp -- command -v whisper-cli; si falta, en mac brew install whisper-cpp, en Linux usa el paquete de la distribución o compila desde fuente (necesita cmake), en Windows usa un binario de versión o WSL. Establece engine_bin si no está en PATH.
  3. 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) — el whisperkit-cli actual (ahora se identifica como argmax-cli) no tiene un comando de descarga independiente, y transcribe falla (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):
      SILENCE="<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"
      
      El modelo aterriza ANIDADO en <dir>/models/argmaxinc/whisperkit-coreml/<model-name>/. Establece model_path en esa carpeta (la que realmente contiene los paquetes .mlmodelc), NO en <dir> en sí misma — localízalo con find "<dir>" -maxdepth 7 -name AudioEncoder.mlmodelc | grep -v '/.cache/' (el grep -v omite la copia de preparación incompleta de Hugging Face bajo .cache/huggingface/download/), luego toma su dirname y valida los paquetes.
    • faster-whisper (CT2) — calienta el wrapper incluido una vez para descargar en model_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 ejemplo curl -L -o "<dir>/ggml-large-v3.bin" https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3.bin (~3 GB); establece model_path en ese archivo y confirma que existe.
  4. Destino de salida. Pregunta: carpeta simple (predeterminado) o bóveda de Obsidian. Recopila las rutas (folder_path, o vault_path + landing_folder + baseline_context_file opcional).

  5. Carpetas de audio. Pregunta por audio_dropzone y audio_archive (ofrece valores predeterminados sensatos; mkdir -p para crearlas).

  6. Idioma. transcribe_language (por defecto auto, pero establece el idioma DOMINANTE para audio con cambio de idioma — ver la nota de campo) y los language.* de salida (por defecto english, transcript = as-spoken); register opcional.

  7. Escribe ~/.config/meeting-transcripts/config.json (mkdir -p ~/.config/meeting-transcripts primero), 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):
    1. Instala en el mismo venv: VIRTUAL_ENV="$HOME/.config/meeting-transcripts/venv" uv pip install sherpa-onnx numpy (o usa el pip del venv).
    2. 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.onnx interno).
      • 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á escrita speaker-recongition-models).
    3. Establece config.diarization.seg_model y config.diarization.emb_model en esas dos rutas.
  • 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 .txt adyacente al audio.
  • Bash — lee la configuración; lista archivos de audio / .txt en 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 -p y mv para archivar la fuente después del éxito.
  • Write / Edit — escribe los tres artefactos (en modo de salida folder) 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 herramienta Edit del 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:

ArtefactoIdioma
Transcripción corregidalanguage.transcript (por defecto as-spoken: preserva los idiomas hablados y el cambio de código intacto)
Canvas visuallanguage.canvas
Documento de resumenlanguage.summary
Tus respuestas conversacionaleslanguage.replies

…

[truncado para traducción]

Skills relacionados