语音备忘录转待办
用户随口录一段语音备忘录(或一段口述视频),交付一份带复选框的待办清单 md:每条事项是"可勾选 + 可执行 + 带截止/优先级"的待办项。全程本地 CPU 转录,语音不上传,适合把"脑子里一闪而过的提醒"、"边走边说的一串任务"、"微信里给自己发的语音"沉淀成能落地的清单。
与"录音转会议纪要""播客转笔记"同底座、不同输出物:那个交付议题/结论/待办的会议纪要或内容提纲/要点/金句的学习笔记;本技能只交付待办清单,面向的是"我说了一件要做的事,帮我记下来别忘"的需求,输出物是能直接勾选的 todo。
功能
- 音视频通吃:mp3/wav/m4a/flac 等音频、mp4/mov/mkv 等视频直接传入,视频自动抽音轨
- 本地转写:faster-whisper 本地推理,语音不出机器;输出分段逐字稿 txt + SRT 字幕
- 口语意图抽取:agent 从转录文字里识别"要/得/记得/别忘/明天/周五/下周"等意图与时间词,拆成一条条待办
- 带复选框的交付物:标准 md 待办清单,
- [ ] 事项(截止/优先级),可直接勾选、可存进笔记 - 含糊就补问:口语没说清时间/优先级时向用户确认,不臆造截止时间
- 纯文字也能用:用户已把口述内容打出来时,
--text跳过转录直接出草稿模板
工作流程(agent SOP)
- 探测时长并预告等待:先用 ffprobe 探时长,告知用户预计等待。CPU 转录速度约为音频时长的 1/5~1/10(几分钟的短音频因模型加载固定开销,实际会偏慢,更接近 1/3)。
bash ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 语音.m4a - 调脚本转录成文字:
bash python3 <技能目录>/scripts/voice_todo.py /path/to/语音.m4a -o /tmp/todo
有专有名词/人名/项目名时追加--initial-prompt "以下是普通话的句子,内容涉及张三、A 项目。";输出/tmp/todo_transcript.txt(逐字稿)、/tmp/todo_transcript.srt(字幕)。脚本会打印时长/字数/转录耗时。
(若用户已直接给出文字,用voice_todo.py --text "…" -o /tmp/todo跳过转录。) - 从口语中抽取待办项:完整读一遍逐字稿。识别意图词:
要 / 得 / 需要 / 记得 / 别忘(了) / 提醒我 / 回头 / 顺便 + 明天 / 后天 / 周X / 周五前 / X 号 / 上午X点等,把口语里"要做的事"拆成一条条独立、可执行的待办。注意:
- 一句话里含多个任务("开会 + 买牛奶 + 交报告")要拆成多条;
- 时间词归一到截止(如"周五之前"→ 截止 周五;只有一个"明天"没具体点→ 截止 明天);
- 出现"很重要/一定要/尽快/优先"等→ 标优先级(高);无则留空或标"普通";
- 人名/数字/时间务必与逐字稿核对(转录可能有同音字,如"李军/李俊");口语含糊(没说是哪天、给谁、做什么)→ 向用户确认后再定。 - 必要的话补问:若关键待办缺时间或优先级,一句话问清(如"报告是周五几点的截止?"),不要自己编一个时间。
- 交付:输出待办清单 md(主交付物)。用 2~3 句话向用户口头总览"抽出了 N 条待办,其中 X 条有明确截止"。逐字稿 txt/srt 作为存档一并给出。
输出格式
标准 Markdown,每条待办一个复选框,截止与优先级放在括号里:
# 待办清单
> 来源:语音备忘录 <文件名>|整理时间:<YYYY-MM-DD>|共 N 条
## 待办
- [ ] 明天上午 10 点开会(截止:明天 10:00;优先级:高)
- [ ] 买牛奶(截止:无;优先级:普通)
- [ ] 把报告交给老板(截止:本周五;优先级:高)
## 备注
- 不确定的时间/人名:<逐条列出待确认项>
- 原始口述:<可选,附逐字稿或一句话来源>
要点:
- - [ ] 是标准任务列表语法,勾选后即成 - [x],可直接在支持 TODO 的编辑器/笔记里点选;
- 截止写能落地的时间(日期/星期/钟点),没有就别硬填,写"无"或列入"待确认";
- 优先级用 高/普通/低 或 ⭐⭐/⭐(用户没要求可不强制三级,按口述有无强调标);
- 转录里的同音错字、对照上下文修正后再落到清单里。
命令参考
| 命令 | 说明 |
|---|---|
python3 scripts/voice_todo.py 语音.m4a |
基础用法,输出 语音_transcript.txt + 语音_transcript.srt |
-o /tmp/todo |
指定输出前缀 → /tmp/todo_transcript.txt、/tmp/todo_transcript.srt |
--language zh |
识别语言,默认中文,可换 en/ja 等 |
--initial-prompt "以下是普通话的句子,内容涉及张三、A 项目。" |
术语提示,人名/项目名识别不准时加上重跑(务必保留"以下是普通话的句子,"开头,否则会丢标点) |
--no-srt |
只要逐字稿,不输出 SRT 字幕 |
--text "记得明天上午十点开会,还要买牛奶。" |
用户已给文字:跳过转录,直接输出 /tmp/todo_draft.md 待办草稿模板 |
| 视频文件(mp4/mov/mkv…) | 直接传入,自动抽 16k 单声道音轨 |
示例对话
用户:(发来一段 40 秒的语音备忘录)"帮我记一下要做的事。"
agent:先探测时长——约 40 秒,转录预计十几秒,现在开始。(调脚本)
转录完成,识别出 32 字。从口述里抽出 3 条待办:①明天上午 10 点开会(高);②买牛奶;③周五前把报告交给老板(高)。已整理成 todo.md。逐字稿里"报告"没听清是哪个报告,你是指上次那份季度报告吗?
用户:对,季度报告。
agent:已补上,第 3 条改为"把季度报告交给老板(截止:本周五;优先级:高)"。清单在 todo.md,可直接勾选。
运行环境
- 脚本:
scripts/voice_todo.py(相对技能根目录) - Python:3.9+
- 第三方库:
faster-whisper(pip install faster-whisper)、numpy(pip install numpy) - 外部命令:
ffmpeg、ffprobe
开工前先跑一次自检,缺什么当场补,别等跑到一半报错:
python3 -c "import faster_whisper" 2>/dev/null || echo "缺 faster-whisper,请执行 pip install faster-whisper"
python3 -c "import numpy" 2>/dev/null || echo "缺 numpy,请执行 pip install numpy"
command -v ffmpeg >/dev/null 2>&1 || echo "缺 ffmpeg,请先安装再重试"
command -v ffprobe >/dev/null 2>&1 || echo "缺 ffprobe,请先安装再重试"
> 缺依赖时用中文告诉用户缺什么、装完就能用,不要把 Python 的英文 traceback 原样贴给用户。
注意事项
- 同音字要核对:转录由本地模型完成,可能出现同音字错(人名、地名、数字、专业词尤其常见)。涉及人名、金额、时间、数字的待办,务必对照逐字稿人工复核,不确定的标"待确认"或直接问用户,不要想当然。
- 口语含糊时向用户确认,不臆造:"改天弄一下""抽空看看那个"这类没有明确对象/时间的句子,不要自己补一个"截止"。能确认就问一句;无法联系上下文时,把它作为一条"待澄清"列出,而不是编造细节。
- 拆得够细才可执行:口语常把多件事缝在一句里("开会顺路把快递取了"),要拆成两条独立待办;一条待办只做一件事。
- 长语音先预告耗时:转录速度约为音频时长的 1/5~1/10(CPU),1 小时音频约需 6~12 分钟,先告知用户再开跑;几分钟的短语音因模型加载固定开销(约 5 秒),实际更接近 1/3,不要以为卡死。
- 时间归一要保守:"明天""周五"等相对时间,输出时可保留原词(如"截止:明天")或换算成具体日期,但换算前确认"今天"是哪天,避免算错。
- 隐私边界:语音全程本地转写不上传,但待办清单由 agent 整理生成;涉密内容请用户自行评估使用场景。