podcast2md — Enlace de episodio de podcast → Transcripción por capítulos
Orientación
- Entrada: página de episodio de podcast compatible con yt-dlp o enlace directo de audio
- Salida:
<out-dir>\<slug>\chapters.md — transcripción completa dividida según los capítulos existentes del programa; no es un resumen, no inventa contenido
- Motor: CapsWriter-Offline local (fun_asr_nano), el script inicia automáticamente el servidor/cliente
Ejecución (usar la copia desplegada, debe estar en el mismo directorio que start_server.exe)
python "D:\iStall\CapsWriter-Offline\podcast2md.py" "URL_del_episodio"
python "D:\iStall\CapsWriter-Offline\podcast2md.py" "URL_del_episodio" --transcribe-timeout 10800
- Repositorio fuente:
D:\iStall\podcast2md\ (podcast2md.py + README.md + PODCAST2MD.md). Modificar solo la versión del repositorio, luego copiar a D:\iStall\CapsWriter-Offline\ para desplegar.
- Tabla completa de parámetros, detalles del pipeline, códigos de salida: leer
D:\iStall\podcast2md\PODCAST2MD.md según sea necesario, no leer todo por defecto.
Parámetros clave
| Parámetro | Valor por defecto | Descripción |
|---|
--out-dir | <directorio_del_script>\work | El resultado final está en work\<slug>\chapters.md |
--force | Desactivado | Elimina el directorio del episodio existente y vuelve a ejecutar; perderá modificaciones manuales |
--polish | off | basic solo elimina muletillas mediante reglas, no es un pulido con modelo; usar off para transcripción fiel |
--server-timeout | 600s | Tiempo de espera para iniciar el servidor |
--transcribe-timeout | 7200s | Tiempo de espera para la transcripción; aumentar para programas largos (ej. 10800) |
Advertencias (leer antes de ejecutar)
- Audio largo (>1h): la transcripción puede tardar decenas de minutos: ejecutar como proceso en segundo plano + consultar registros, no esperar en primer plano y chocar con el tiempo de espera de la herramienta.
- El servidor permanece en ejecución después de transcribir (acelera la siguiente ejecución); detenerlo desde la bandeja del sistema.
- Códigos de salida: 3=fallo de descarga, 4=fallo del servidor, 5=fallo de transcripción, 6=resultado ya existe/ocupado, 7=fallo de división o verificación.
- Registros:
<out-dir>\_podcast2md_server.log y <slug>\logs\.
- ffmpeg debe estar en PATH, de lo contrario la transcripción del cliente falla.
- No se realiza diarización de hablantes; las transcripciones con múltiples hablantes requieren postprocesamiento.
Hechos verificados localmente (verificado el 2026-10-19, citar directamente sin necesidad de volver a detectar)
- ffmpeg 8.1.2 ya está en PATH — el requisito previo para la transcripción de archivos por parte del cliente está cumplido; en caso de duda, probar con
ffmpeg -version antes de hacer suposiciones
- No hay GPU NVIDIA dedicada, la transcripción usa CPU: programas de 30–60 minutos tardan aproximadamente 10–30 minutos en generar el texto, más de 1 hora tarda 40–90 minutos; FunASR-Naro probado con una grabación de 95 minutos: transcripción pura ~46 minutos (aproximadamente 0.5x tiempo real, incluyendo carga del modelo, ver work\full.out.log 2026-10-17)
- Características observadas del script de referencia FunASR-Nano: segmentos de 15 segundos (segmentos completos de 60s repiten "嗯"), escritura JSONL por segmento para reanudación tras interrupción, segmentos silenciosos saltados según umbral de energía
- Cobertura de subtítulos de Bilibili: los subtítulos CC oficiales/del UP no están disponibles en todos los videos, los subtítulos AI son más comunes — primero detectar con
yt-dlp --list-subs antes de decidir la ruta, no asumir cobertura basándose en suposiciones
Audio local / División de escenarios adyacentes
- Archivos de audio locales (grabaciones, mp3/wav ya descargados, sin enlace): no usar este CLI. Usar FunASR-Nano: venv
D:\iStall\FunASR-Nano\.venv, pesos D:\iStall\model-cache\huggingface\local\Fun-ASR-Nano-2512-hf; el audio largo debe segmentarse y transcribirse por partes (segmentos completos de 60s repiten "嗯"), referencia D:\iStall\FunASR-Nano\work\full_transcribe.py.
- Videos con subtítulos (Bilibili, etc.): primero detectar subtítulos (
yt-dlp --list-subs), si hay subtítulos CC/AI, extraerlos directamente como texto, sin necesidad de transcripción de voz.
- Convertir subtítulos a texto (eliminar marcas de tiempo, dar formato): ese es el flujo de trabajo de srt-translator, no de este CLI.