用途:把博客 Markdown 转成适合演讲的逐行披露 HTML,右方向键逐行出现,左方向键退回;进入新 ## 标题时清空上一节,仅保留标题与当前节。带预录音版支持 Shift 静音、Ctrl 重读当前行。
两种模式:
- 预览 HTML:用浏览器 SpeechSynthesis 朗读,无预录音,体积小,适合快速验证排版或现场讲解 fallback。
- TTS HTML:用 edge-tts 预录音,base64 内嵌,work_dir/audio/N.mp3 为分段源,体积大,适合离线演讲、音色稳定。
两种产物均为自包含单文件,带 voice 面板。不明确模式时必须先用 Ask 询问用户。
依赖:pip install esflow edge-tts;解码音频需系统 ffmpeg(macOS: brew install ffmpeg;Debian/Ubuntu: sudo apt install ffmpeg)。match 备选对齐需 onnxruntime、numpy,模型首次下载到 scripts/models/。图片路径 (/pics/...) 相对 cwd,可用 BLOG_NARRATOR_IMAGE_BASE 覆盖。
快速使用: 预览:python3 scripts/run.py preview input.md output.html [--rate 1.15] [--open] TTS:python3 scripts/run.py tts input.md work_dir [--voice xiaoxiao|xiaoyi] [--rate 1.175] [--open] 默认预览写 output.html;TTS 写 work_dir/{stem}_voice.html,--open 自动打开浏览器。
Flow:esflow DAG 编排,parse_md 后分 preview(export_preview)或 tts(split→gen→match→merge)。单 flow 双路径。调试单节点:esflow run scripts/ --node <节点 id>。仅跑 match+merge 需 --from match --job-dir <上次 job 目录>。
异常:输入不存在、--voice 非法、--rate 非数字、--from 未配 --job-dir 均退出码 3;edge-tts 单段失败跳过日志不中断;match 缺 onnxruntime 退出码 1。
限制:未提供收费、价格、平台、效果等信息。