skill
av-to-transcript-and-minutes
音视频 → 转写文稿 / 结构化总结:一条命令完成拆轨、人声分离、说话人分离转写与规范 docx;支持字幕、热词纠错、断点续跑与批量;默认离线,可选云端 ASR,纪要/总结由 AI Agent 按技能模板提炼。 | One-command AV → transcript & structured summary: demux, source separation, diarization, ASR
Set up
Skills are installed by placing their folder where your agent loads skills.
The download comes from github.com/ADC1920/av-to-transcript-and-minutes itself, not from our server, so what you get is exactly what its author published.
Install instructions come from the README
README
synced Oct 28, 2026音视频 → 转写文稿 / 结构化总结(av-to-transcript-and-minutes)
一套默认完全离线、本地运行的「音视频 → 转写文稿 / 结构化总结」全流程工具箱(亦可选接阿里云百炼云端 ASR 引擎):
视频 / 音频(mp4/mkv/mp3/m4a/wav/…)
│
├─ ① 拆轨(视频输入) 无声视频 + 完整音轨(无损,FFmpeg)
│
├─ ② 人声 / 背景音分离 人声.wav + 背景音.wav(Demucs htdemucs,GPU)
│
├─ ③ 噪声门清理 人声_转写用.wav(消除分离模型的静音伪影,保 VAD 可用)
│
├─ ④ 说话人分离 + 转写 Qwen3-ASR-1.7B(本地)/ aed / cloud 云端 × (pyannote / cam++),带时间戳与说话人
│
└─ ⑤ 组稿 + 排版规范 docx 转写文稿(普通) 或 会议原文(带标签,供提炼总结)
正式总结由 AI Agent 按 meeting-notes-expert 模板提炼
一条命令跑完 ①→⑤:
python av_to_transcript_and_minutes.py <视频/音频文件或文件夹> [-o 输出目录] [--meeting] [--srt] …
当前版本:v2.4 | License: MIT | 环境:Windows / Linux / macOS,需 FFmpeg 与 Python 3.10+
✨ 特性
- 完全离线:模型全部本地运行,无 API 密钥、无网络依赖(首次运行自动下载模型后)
- 一条命令全自动:拆轨 → 分离 → 说话人分离 → 转写 → 排版成 docx
- 双产出模式:
转写文稿-<名>.docx(普通音视频)/会议原文-<名>.docx(会议,带[分:秒] 说话人N:标签) - 说话人分离双引擎:
pyannote(community-1,会议场景默认)——分割模型原生处理重叠语音,实测真实 28 分钟会议从 35 个假说话人收敛到 2 个campp(VAD + cam++ 声纹聚类)——轻量,单人/访谈素材够用
- 字幕与纠错:
--srt出字级时间戳字幕;--replace确定性专名纠错(比--hotwords偏置可靠);--replace-file/--replace-save纠错词典读取与回写(本次纠错条目自动并入词典,下次自动带上);--names说话人真名映射;--asr-extra透传其余引擎参数 - 断点续跑:转写(最贵环节)结果按参数指纹缓存——阈值 / 热词 / 人名 / 字幕 / 识别引擎 / 额外 ASR 参数任一不同即互不复用,切换识别引擎不会误用旧结果
- 完成判定与补排版:md 与 docx 齐备才算完成;首次运行缺
article-format时只出 md,补装后重跑自动只补 docx,无需--force全量重跑 - 批量容错与可观测:单个文件失败只计一次失败并继续(素材损坏、缺 ffmpeg/demucs 都不中断整批);无音轨素材单独归类提示;批量打印
[i/N]计数与每个素材用时,收尾给总耗时与均值;--log把运行输出落到<输出目录>/run.log - 跑前自检与提示:跑前查显存,可用量低于 4 GB 时提示先停占卡程序或用
--no-separate;转写只得到 1 个说话人且用的是默认 campp 时,提示可改用--meeting或 pyannote 重跑 - 磁盘可控:
--clean完成后删除中间件(三份 wav 与转写缓存 json),只留成稿,长素材不再动辄留下上 GB 的中间 wav - 平铺输出(v2.4):
--flat把成稿 docx(及字幕)直接放到素材同目录,删除整个工作子目录(含中间件、md 底稿、.demucs_model标记与拆轨产物)——素材目录最终只有「原始音视频 + 成稿」;重跑时成稿在素材目录即视为已完成,自动跳过 - 模型层可选与增强:
--asr-engine auto按语言路由(中/英/粤走 FireRedASR2-AED,其余走 Qwen3-ASR);--vad firered用误报更低的 FireRedVAD 切段;--demucs-model可选 htdemucs / htdemucs_ft / mdx_extra 等分离模型(换模型自动重跑) - 云端可选引擎(v2.3):
--asr-engine cloud免显存调用阿里云百炼(默认qwen-audio-3.1-asr-message,WebSocket 整文件直出句级+字级时间戳;--srt直接用云端时间戳,无需本地 fa-zh;驱动说话人分离字幕时逐段 4 线程并发);可选子模型omni(qwen3.8-omni-flash 全模态)与filetrans(异步长音频,仅公网 URL);--hotwords走即时热词表生效。需DASHSCOPE_API_KEY(环境变量)与pip install dashscope - 专名质量机制(v2.4):管线根目录放
hotwords.txt(热词表,每行一个词,# 注释)与replace_dict.txt(纠错词典,每行「错=>对」)即自动加载、无需任何参数——热词走识别阶段偏置、词典走识别后确定性替换,两者内容都进转写缓存指纹(改动后旧缓存自动不复用);模板见*.example.txt。--replace-save把本次纠错条目合并写回词典,专名修正可跨次积累。--flat平铺模式不会删除这两个文件(固定放管线根目录) - 输出规范化:
--itn中文逆文本正则化(三百二十万元 → 320万元、二零二六年十月十五日 → 2026年10月15日),零依赖自写规则 - 双人分声道素材:
--split-channels按声道分轨转写,声道号直接当说话人,省掉声纹聚类、也不会把两人混在一起 - 情绪与声纹:
--emotion出 8 类情绪打分(写入 json 的emotions字段;不做笑声/掌声等音频事件检测);--speaker-db声纹库跨文件复用说话人身份(首次用--speaker-db-save建库) - 单人素材提速(v2.3):
--no-diarize跳过说话人分离直接整段转写(云端 message 引擎将走整文件一次调用),与--meeting互斥、缓存独立 - 批量处理:输入文件夹时递归处理其中所有音视频
🚀 快速开始
1. 环境准备
# 系统依赖:FFmpeg(须在 PATH 中)
winget install ffmpeg # Windows
# apt install ffmpeg # Linux
# brew install ffmpeg # macOS
# Python 依赖
pip install -r requirements.txt
# GPU 加速:先按 https://pytorch.org 安装对应 CUDA 版本的 torch
# 若报 libtorchcodec 加载失败(pyannote 引入的库与静态 FFmpeg 不兼容):
pip uninstall torchcodec
2. 模型准备(首次,自动下载)
| 用途 | 模型 | 来源 |
|---|---|---|
| 转写识别 | Qwen3-ASR-1.7B | ModelScope Qwen/Qwen3-ASR-1.7B-hf |
| 说话人分离(会议) | pyannote community-1 | ModelScope pyannote/speaker-diarization-community-1 |
| 说话人分离(轻量) | fsmn-vad + cam++ | 随 FunASR 自动下载 |
| 人声分离 | htdemucs | 随 Demucs 自动下载 |
pyannote 官方模型在 HuggingFace 为门控资源(需申请权限);ModelScope 有官方镜像且无需门控,推荐:
python -c "from modelscope import snapshot_download; snapshot_download('pyannote/speaker-diarization-community-1')"
3. 跑起来
# 普通音视频 → 转写文稿(自动说话人分离)
python av_to_transcript_and_minutes.py 我的视频.mp4
# 会议录音 → 会议原文(带时间戳与说话人标签,供后续提炼纪要)
python av_to_transcript_and_minutes.py 会议录音.m4a --meeting
# 批量 + 字幕 + 人名映射 + 热词
python av_to_transcript_and_minutes.py ./素材目录 --meeting --srt \
--names "0=张三,1=李四" --hotwords "产品名,行业术语"
4. 常用参数
| 参数 | 说明 |
|---|---|
--meeting | 产出会议原文(带时间戳+说话人标签)而非普通转写文稿 |
--srt | 额外产出 .srt 字幕(字级时间戳) |
--diarize-engine auto|pyannote|campp | 说话人分离引擎(auto=会议用 pyannote,其余 campp) |
--asr-engine qwen|aed|auto|cloud | 识别引擎:qwen(默认,多语言)/aed(中英粤更准)/auto 按语言路由/cloud 阿里云百炼云端引擎;换引擎自动用新缓存重转 |
--no-diarize | 单人素材跳过说话人分离直接整段转写(更快;云端 message 引擎走整文件一次调用);与 --meeting 互斥 |
--replace "错=>对,错2=>对2" | 识别后确定性替换,专名纠错比 --hotwords 可靠(同音异字配 --asr-extra "--fuzzy") |
--denoise | 转写前 ZipEnhancer 降噪(仅真实含 BGM/强噪素材;干净素材不加更好) |
--vad fsmn|firered | VAD 切段后端(默认 fsmn;firered 误报更低) |
--language zh|en|yue|… | 强制语言,默认自动检测 |
--max-line N / --merge-gap N | 单条字幕最大字数(默认 28)/相邻同说话人合并间隔 ms(默认 800,0 关闭) |
--asr-extra "--fuzzy --min-seg 300" | 其余 qwen_asr.py 参数原样透传(同样计入缓存指纹) |
--names "0=张三,1=李四" | 说话人真名映射 |
--hotwords "词1,词2" | 热词偏置,提升专名识别率;未指定时自动加载根目录 hotwords.txt |
--no-separate | 跳过人声分离(纯人声音频可直接转写) |
--no-asr | 只做拆轨/分离,不转写 |
--verbose | 实时透传各子进程输出,排查卡顿与失败原因 |
--clean | 完成后删除中间件(三份 wav 与转写缓存 json),只留成稿;对已完成素材也生效 |
--flat | 平铺输出(v2.4):成稿直接放素材同目录,删工作子目录与 md 底稿(含中间件、拆轨产物) |
--log | 本次运行输出追加写入 <输出目录>/run.log |
--replace-file [词典.txt] | 纠错词典文件(每行 错=>对);未指定时自动加载根目录 replace_dict.txt(存在即加载);裸写=根目录 replace_dict.txt |
--replace-save [词典.txt] | 把本次 --replace 纠错条目合并写回词典(裸写=根目录 replace_dict.txt),下次 --replace-file 裸写即自动带上 |
--itn | 中文逆文本正则化:三百二十万元 → 320万元、百分之八十 → 80%、二零二六年十月十五日 → 2026年10月15日 |
--asr-engine auto | 按 --language 路由识别引擎(中/英/粤走 AED,其余走 Qwen) |
--asr-engine cloud | 云端识别(默认 message 通道);换子模型加 --asr-extra "--cloud-model omni|filetrans";filetrans 需配 --asr-extra "--cloud-url 公网URL" |
--demucs-model NAME | 分离模型:htdemucs(默认)/htdemucs_ft(质量更好、慢约 4 倍)/mdx_extra 等;换模型自动重跑分离 |
--split-channels | 双人分声道素材按声道分轨转写,声道号即说话人;自动跳过 Demucs 与声纹聚类 |
--emotion | emotion2vec 输出 8 类情绪打分(写 json 的 emotions;不做笑声/掌声等事件检测) |
--speaker-db db.json | 声纹库:跨文件复用说话人身份(仅 campp 引擎);建库加 --asr-extra "--speaker-db-save" |
--force | 重跑已处理过的素材 |
-o 输出目录 | 指定输出目录(默认输入旁 separated_out/) |
📦 产物说明
每个输入在输出目录下生成同名子目录:
| 文件 | 说明 |
|---|---|
无声视频.mp4 | 去掉声音的视频(仅视频输入,画面无损) |
完整音轨.m4a | 从视频无损提取的完整音频(仅视频输入) |
人声.wav / 背景音.wav | Demucs 分离出的人声与背景音 |
人声_转写用.wav | 经噪声门清理后供转写的版本(可复现中间件) |
转写结果*.json | 结构化转写结果(说话人分段/文本/时间戳),按参数指纹缓存 |
转写文稿-<名>.md/.docx | 普通模式成稿(如有 article-format 技能则套用排版规范) |
会议原文-<名>.md/.docx | 会议模式成稿([00:00] 说话人N:文本) |
会议原文-<名>.srt | 字幕(--srt,含说话人标记) |
结构化总结由 AI Agent 读取「会议原文」后按 meeting-notes-expert 模板提炼成七节式总结(基本信息 / 结论 / 关键决策或要点 / 行动事项 / 待定与开放问题 / 上期回顾 / 内容详情)——这一步是理解性工作,交给会话内的 AI 完成。会议场景产出 会议纪要-<名>.docx,讲座、访谈、播客等其他场景产出 总结-<名>.docx。
🧩 项目结构
av-to-transcript-and-minutes/
├── av_to_transcript_and_minutes.py # 全自动链路主脚本(①→⑤)
├── test_pipeline_e2e.py # 端到端回归(自动合成素材,17 项断言)
├── hotwords.example.txt # 热词表示例(复制为 hotwords.txt 自动加载)
├── replace_dict.example.txt # 纠错词典示例(复制为 replace_dict.txt 自动加载)
├── requirements.txt
├── skills/
│ ├── funasr-transcribe/
│ │ ├── SKILL.md # 转写技能(Agent 调用规范)
│ │ └── scripts/
│ │ ├── qwen_asr.py # 转写引擎:Qwen3-ASR + pyannote/cam++ + 字幕/纠错
│ │ ├── firered_mem_patch.py # AED 引擎分块注意力与显存补丁(v2.1)
│ │ ├── transcribe.py # 简化入口
│ │ ├── diarize.py # 说话人分离(FunASR 路线)
│ │ ├── test_qwen_asr_units.py # 引擎单元测试
│ │ └── test_firered_mem_patch.py # AED 显存补丁单测
│ └── meeting-notes-expert/
│ └── SKILL.md # 总结整理技能(七节模板,会议/通用双场景)
└── LICENSE
✅ 验证
# 端到端回归(自动合成 TTS 测试素材,断言全链路产物)
python test_pipeline_e2e.py
# 引擎单元测试(切句/时间戳/碎段合并/超长切分/小簇吸收等纯逻辑)
python skills/funasr-transcribe/scripts/test_qwen_asr_units.py
2026-10-01 健壮性改动后实测:test_pipeline_e2e.py 17 项断言 ALL PASS(自动合成 TTS 视频走完整链路,37 秒)。
2026-10-01 可用性完善后复测(同一套断言仍全绿,41 秒),另做专项验证:--clean 后目录只剩成稿、
--log 产出 26 行运行日志、无音轨视频归为「无音轨」而非抛 ffmpeg 原始输出、--replace-file 词典替换生效、
批量输出 [i/N] 与总耗时均值。
2026-10-08 v2.4 回流批次复测:--flat 平铺输出(成稿落素材目录、工作子目录全清、幂等跳过)、
根目录 hotwords.txt/replace_dict.txt 零参数自动加载、词典内容进缓存指纹(改词典自动重转)、
Demucs 子进程 HF_HUB_OFFLINE=1(离线环境省约 30 秒 HuggingFace 重试等待);
单测新增 cloud 引擎离线用例组(§14),CI 工作流纳入 py_compile + 全量离线单测。
实测性能参考(RTX 5070 Ti 16GB,28 分钟中文会议):
| 环节 | 耗时 |
|---|---|
| 人声分离(Demucs) | ~1 分钟 |
| 说话人分离(pyannote) | ~40 秒 |
| 转写(Qwen3-ASR) | ~87 秒 |
| 全流程 | 约 4 分钟 |
🔧 技术要点与已知限制
关键设计
- 噪声门(必需):Demucs 在静音段输出低电平伪影,会让下游 VAD 失效(整段连成一块、说话人分离报废)。链路在分离与转写之间插入
agate噪声门恢复段间真静音。 - 三层声纹防护(cam++ 引擎):碎段合并(<400ms)→ 超长段切分(>60s,保批量转写吞吐)→ 小簇吸收(<5s 的碎簇并入最相似大簇)。
- pyannote 优先:实测真实会议抢话交叠场景,pyannote 分离质量显著优于声纹聚类路线。
- torchcodec 规避:pyannote 引入的 torchcodec 与静态 FFmpeg 不兼容;链路用 soundfile 预载波形绕过,建议
pip uninstall torchcodec。 - AED 显存三层防护(v2.1):FireRedASR2-AED 引擎经
firered_mem_patch.py分块注意力(softmax 按行独立,数学等价)+ 时长感知分批(AED_BATCH_BUDGET_S)+ OOM 拆批/静音点二分兜底,再配 bf16(use_half=True)与 decoder 三角 mask 缓存;实测 4×107s 批量峰值显存 11.8GB → 3.5GB、推理提速 3 倍(不改官方源码,monkey-patch 可还原)。
已知限制
- 会议抢话极严重时说话人分离仍可能过切(实测 35 簇 → 2 簇已大幅改善,但不保证 100% 准确)
- 说话人编号在不同次运行间可能互换(可用
--names固定映射) - FireRedASR2-AED 为可选备选引擎,需另行下载模型与代码(v2.1 起长音频已优化,见上)
- 输出 docx 的排版规范依赖
article-format技能(未安装时产出标准 docx,无规范排版)