下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/xh-ai--local-speech-to-text.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @xh-ai/local-speech-to-text。- 【本地语音转文字】本地音视频批量转写技能。当用户想把录音/视频转成文字逐字稿、批量处理会议录音或访谈音视频、查某天转了哪些文件、看转写时长统计台账时使用——触发词:语音转文字、音频转文字、视频转文字、逐字稿、转写、录音整理、asr、听写、会议纪要转写、speech to text。工作流:五角色协作——总管只做流程编排与汇总(首次使用询问工作根目录,之后一直…
- 安装员三查三装(FFmpeg、faster-whisper、Whisper 大模型,清华镜像+HF 镜像兜底)
- 音频处理员把视频/音频统一转成 16000Hz/16bit 的 wav
- 文字输出员用本地 Whisper 模型转写生成 asr 逐字稿
- 统计员把全部信息整理成 json 并生成台账日历页(可切换年月、显示总计数与处理总时长、点日期进入当日明细页:源文件/音频/逐字稿三链接 + 音频时长/起止时间/处理时长/状态)。档案按「根目录/日期/raw+audio+asr + statics」组织
- 所有页面底部为一张品牌图片(data URI 内联,不带任何文字)。全程本地处理,不上传任何数据。支持 Windows / macOS / Linux / HarmonyOS。
阅读全文 (展开查看完整说明)
概述
本地语音转文字 · Local Speech to Text
一句话定位:音频视频丢进来,逐字稿和台账长出来——五角色流水线把「装环境 → 转 wav → 出逐字稿 → 记台账」全链路接管,全程本地处理,数据不出本机。
始终使用与用户相同的语言回复。
定位与角色
| 角色 | 代号 | 职责 | 不做什么 |
|---|---|---|---|
| 总管 | LST-ORCHESTRATOR | 只做编排:确认根目录 → 依次派发四个角色 → 验收 → 交付台账与摘要 | 不装环境、不转写、不写逐字稿、不碰 HTML |
| 安装员 | LST-INSTALLER | 三查三装:FFmpeg → faster-whisper → Whisper 模型(缺哪补哪) | 不碰用户音视频文件、不做业务 |
| 音频处理员 | LST-AUDIO | 收料进 raw/,统一转 16000Hz / 16bit / 单声道 wav 进 audio/ | 不转写、不改台账业务字段 |
| 文字输出员 | LST-TRANSCRIBER | faster-whisper 转写 wav,生成 asr/ 逐字稿并回写台账 | 不润色不改写、不碰 raw 与 audio |
| 统计员 | LST-STATS | 信息汇总成 json(day.json),生成台账日历页 + 当日明细页 | 不转写、不手工补数、不改脚本生成的 HTML |
角色卡在 references/ 下(role-orchestrator / role-installer / role-audio / role-transcriber / role-stats),派发时按角色卡首行的声明格式来。
能力矩阵
| 能力 | 说明 | 承载 |
|---|---|---|
| 工作区登记 | 首次问用户要根目录绝对路径,之后所有档案按日期存放其中 | 总管 + lst.py init |
| 环境三查三装 | FFmpeg / faster-whisper / Whisper 模型,清华 PyPI 镜像 + HF 镜像兜底 | 安装员 + doctor.py |
| 格式通吃 | mp4/mov/mkv/mp3/m4a/wav/flac/aac… ffmpeg 认识就行,视频只抽音轨 | 音频处理员 |
| 标准化 wav | 统一 16000Hz、16bit、单声道(ASR 标准口径),时长 ffprobe 探测 | 音频处理员 + lst.py convert |
| 本地逐字稿 | faster-whisper 转写,默认 small 模型、自动检测语言、带段级时间戳(可 --plain) | 文字输出员 + lst.py transcribe |
| 台账日历 | ledger.html:年/月可切换的日历,显示当月总计数与处理总时长 + 累计;点日期进当日页 | 统计员 + lst.py stats |
| 当日明细 | day.html:源文件/处理后音频/逐字稿三链接 + 音频时长、开始/结束时间、处理时长、状态 | 统计员 |
| 响度归一化 | 先测原片 LUFS,偏低才归一到 -16 LUFS(--no-norm 可关)——识别密度明显提升 | 音频处理员 + convert |
| 简体输出 | 中文自动挂 initial_prompt 引导简体;半角标点按中文语境转全角(已实测:多了完整句、断句归位) | 文字输出员 + transcribe |
| 长音频稳 | 超 15 分钟自动按静音点切 240 秒/段,段失败自动降级重试,不再整片崩掉重来 | 文字输出员 + --chunk |
| 品牌页脚 | 所有页面底部为一张品牌图片(data URI 内联,单文件可携带),不带任何文字 | 模板内置 |
| 失败可续 | 单文件失败不拖垮整批;失败原因记台账,修复后重跑自动重试 | 全链路 |
| 隐私 | 全程本地:转写、模型、档案都不出本机 | 架构保证 |
已固化的三个实战坑
| 坑 | 现象 | 脚本内的解法 |
|---|---|---|
| 中文默认出繁体 | 繁体正文 + 半角 ,?,看着别扭 | 语言探测到 zh 自动挂 initial_prompt「以下是普通话的句子,请使用简体中文输出…」;输出再做半角→全角后处理(保护千分位/小数/时间码/网址) |
| 长音频直跑必崩 | 跑到第 9 分 47 秒炸 nan logits,整段白跑 | 音频超 15 分钟自动按静音点切 240 秒/段(也可 --chunk 手动指定),逐段转写、时间戳自动累加;某段失败自动降级重试(beam=1 + 关 VAD),只丢一段不丢整片 |
| 原片响度偏低 | mean -25.7 dB,识别密度低、漏句 | 转换时先测原片 LUFS,偏离目标 >1.5 LU 才做 loudnorm 归一到 -16 LUFS,并把「原片响度 / 是否归一化」写进逐字稿头与台账 |
适用人群与触发场景
- 每天有会议录音、访谈、播客、课程视频要出文字稿,并想按日期沉淀成档案的人。
- 触发场景:用户说「把这个录音转成文字」「帮我把这批视频转写一下」「看看这个月转了多少」「把昨天的会议纪要出个逐字稿」;或直接丢文件过来。
平台支持
| 平台 | 支持 | 调用命令 | 说明 |
|---|---|---|---|
| macOS / Linux | ✅ | python3 scripts/lst.py … | 转写主力平台 |
| Windows | ✅ | py -3 scriptslst.py … | 命令是 py -3 不是 python3 |
| HarmonyOS | ⚠️ 兼容层 | 视环境 | 有 Python + ffmpeg 的鸿蒙环境可跑;跑不了按零脚本模式人工归档 |
首次拿到本技能(换机器/换平台)先跑安装员体检:
python3 scripts/doctor.py --check-only # Windows: py -3 scriptsdoctor.py --check-only安装 / 卸载(可选,默认装到用户技能目录):
python3 scripts/install.py # 安装
python3 scripts/install.py --check # 检查是否已装
python3 scripts/install.py --uninstall # 卸载快速开始
- 首次使用:请用户给一个工作根目录的绝对路径(如
~/Documents/asr-archive),然后登记:
python3 scripts/lst.py init --root <用户指定的绝对路径>以后所有档案、台账都放在该目录;每次会话先跑 lst.py root 复述确认(未登记时先问,不要猜)。
- 首次(或换机器):派安装员
doctor.py三查三装,全绿再开工。 - 日常转写:走「总管编排 → 音频处理员 → 文字输出员 → 统计员」四步(见下),或总管直接一键:
python3 scripts/lst.py run <文件1> <文件2> --date 2026-10-07协作流程(总管按此编排)
第一步 · 总管编排
- 确认根目录(首次必问)→
init;环境没验过先派安装员。 - 收齐三件事:文件路径清单 + 业务日期(默认今天)+ 模型偏好(默认 small)。
- 依次派发下面三个角色;每步验收退出码,失败按排障处理,不静默重试超过 2 次。
第二步 · 音频处理员
python3 scripts/lst.py ingest <文件…> --date 2026-10-07 # 收料复制进 raw/
python3 scripts/lst.py convert --date 2026-10-07 # 转标准 wav 进 audio/- 相同文件自动跳过,同名不同内容自动
-2后缀;失败记failed不拖垮整批。 - 默认带响度归一化:先测原片 LUFS,偏离 -16 LUFS 超过 1.5 LU 才归一化(已知合格的原片不折腾,
--no-norm可关,--lufs换目标)。 - 产出:
audio/<名称>.16000hz.wav+ 台账里的时长、原片响度、是否归一化。
第三步 · 文字输出员
python3 scripts/lst.py transcribe --date 2026-10-07 [--model small] [--language zh]- 只转
converted状态的文件;产出asr/<名称>.txt(头部元信息 +[00:01:23] 段落时间戳,--plain出纯文本)。 - 简体:未指定语言时先做 30 秒探测,是中文就自动挂 initial_prompt 引导简体(
--prompt自定义、--no-prompt关闭)。 - 标点:输出自动做半角→全角修正(千分位/小数/时间码/网址受保护,
--keep-ascii-punct保留原样)。 - 长音频:超 15 分钟自动按静音点切 240 秒/段(也可
--chunk 240手动),段失败自动降级重试,只丢一段不丢整片。 - 台账自动回写:asr 路径、状态
done、开始/结束时间、处理耗时、字数、处理备注。
第四步 · 统计员
python3 scripts/lst.py stats --date 2026-10-07 # 当日明细页 + 台账(不带 --date 重建全部)- 产出
statics/2026-10-07/day.html与statics/ledger.html;有素材没统计的日期在日历上标「待统计」(不给死链)。 - 两条命令都退出码 0 才算完成。
目录约定(根目录由用户首次指定)
ROOT/
2026-10-07/
raw/ 用户提供的原始文件(复制进来,原件不动)
audio/ 16000Hz/16bit wav
asr/ 逐字稿 txt
statics/
2026-10-07/ day.json(唯一数据源)+ day.html(当日明细页)
ledger.html 台账日历页(年月切换、总计数、处理总时长)命令速查
| 命令 | 作用 |
|---|---|
init --root DIR | 登记工作根目录(首次必跑,幂等) |
root | 查看当前登记的根目录 |
ingest <文件…> [--date D] | 收料:复制进当日 raw/(相同文件自动跳过) |
convert [--date D] [--source 词] [--no-norm] [--lufs -16] [--force] | 转 16000Hz/16bit wav(默认含响度归一化);失败项修复后重跑自动重试 |
transcribe [--date D] [--model m] [--language zh] [--chunk N] [--prompt P] [--no-prompt] [--keep-ascii-punct] [--plain] [--force] | 转写:简体引导 + 全角标点 + 长音频静音点分段(段失败自动降级) |
stats [--date D] | 重建日期页 + 台账日历页(幂等,可反复跑) |
run <文件…> [--date D] | 总管一键:ingest → convert → transcribe → stats |
selftest | 自检(含阴性测试,不依赖 ffmpeg/whisper) |
doctor.py [--check-only] [--model m] | 安装员:三查三装 |
install.py [--check] [--uninstall] | 技能安装 / 卸载 |
行为契约(总管监督)
- 先定目录:用户未给根目录绝对路径时,第一步永远是问,禁止默认塞到临时目录;登记后一直沿用,每次会话先
root复述确认。 - 先装后跑:没验证过环境不派业务角色;安装员复查全绿才算就绪。
- 原件不动:用户文件只复制进
raw/,永不移动/删除原件;raw/副本也不手删(重做靠--force)。 - 数据是唯一真相:day.json 是台账唯一数据源,页面全部由脚本生成;禁止手改 HTML、禁止手写逐字稿、禁止手工补统计数来"补交差"。
- 逐字稿不加工:模型原样输出,不润色、不摘要;要加工是用户后续的事。
- 失败如实记录:报错写进台账
error字段并如实上报,绝不静默重试超过 2 次、绝不生成空壳页面。 - 日期归日期:
--date是业务日期,用户没指定就默认今天,不自作主张归到别的日期。 - 待统计不装死:有素材没 day.json 的日期,日历标「待统计」不可点击;补跑流程后标记自动消失。
- 页脚不可删改:所有页面底部固定一张品牌图片(data URI 内联),不带任何品牌文字;改模板时不要把文字加回去。
- 日历格子尺寸一律相同:台账日历用
table-layout:fixed七列等宽 + 每格定高容器(td > .cell定高 + overflow:hidden),改样式不要去掉这两条。 - 各角色不越界:总管不碰业务、安装员不碰文件、音频处理员不转写、文字输出员不改音、统计员不补数。
排障
| 症状 | 处理 |
|---|---|
root 显示未设置 | 跑 init --root <绝对路径>;用户没给路径就先问 |
| 找不到 ffmpeg | 跑 doctor.py 自动装;Windows 装完重开终端 |
| 未安装 faster-whisper | 跑 doctor.py;或手动 python3 -m pip install faster-whisper -i https://pypi.tuna.tsinghua.edu.cn/simple |
| 模型下载失败/很慢 | 先 export HF_ENDPOINT=https://hf-mirror.com 再重跑(Windows 用 set) |
| 模型加载失败 | 内存不足换小模型(--model base);确认磁盘空间 |
| convert 报「找不到 ffmpeg」 | 安装员还没装好,先跑 doctor.py |
| convert 某文件失败 | 看台账 error 字段的原因(多半是格式损坏/无音轨),修复后重跑 convert 自动重试 |
| transcribe 全跳过([SKIP]) | 没有 converted 状态的文件——先 convert;要重做已完成的加 --force |
转写报 open() got an unexpected keyword argument 'metadata_errors' | PyAV 19 与 faster-whisper 不兼容:跑 doctor.py 自动把 av 钉回 19 以下 |
| 转写结果是空的 | 确认音频里有人声;试 --language zh;不行换大模型 |
| 日历某天标「待统计」 | 该天有素材没 day.json:补跑 run(或 ingest→convert→transcribe)再 stats |
| 重复导入会不会覆盖 | 不会:相同内容自动跳过,不同内容自动 -2 后缀 |
| 想重做某个文件 | convert/transcribe --source <文件名关键词> --force |
| 想换模型 | transcribe --model <名>,或改根目录 lst.config.json 的 model 字段 |
| 长音频跑到一半崩了 | 默认已自动分段(>15 分钟按静音点切 240 秒/段);短音频也想切就加 --chunk 240;某段失败会自动降级重试,备注写进逐字稿头 |
| 逐字稿是繁体 / 半角标点 | 中文会自动挂简体引导并做全角修正;仍有问题用 --prompt 自己写引导语;要保留原样用 --no-prompt --keep-ascii-punct |
| 音频声音太小、漏句多 | 转换默认已做 loudnorm 归一到 -16 LUFS(台账 normalized 字段可查);不需要就 --no-norm |
| 想查原片响度 | 看当日 day.json 的 source_lufs / normalized,或逐字稿头的「音频处理」行 |
| 页脚图片不显示 | 检查 assets/brand/we_pro.b64.txt 是否在包内;页面会降级为文字提示 |
| Windows 提示找不到 python3 | 用 py -3 scriptslst.py … |
FAQ
见 references/faq.md(含模型选择、镜像加速、失败重试、页面外发、零脚本模式等常见问题)。
English Summary
Local Speech to Text — a five-role, fully local audio/video transcription pipeline with a calendar ledger. Roles: an Orchestrator (scheduling and reporting only; asks the user for a workspace root directory on first use and keeps using it), an Installer (checks & installs FFmpeg, faster-whisper, and the Whisper model via Tsinghua PyPI mirror with HF-mirror fallback), an Audio Operator (copies sources into raw/ and converts everything to standard 16000 Hz / 16-bit mono WAV via FFmpeg), a Transcriber (faster-whisper transcription into timestamped plain-text transcripts under asr/), and a Statistician (writes per-day day.json and builds two self-contained HTML pages). Archive layout: ROOT/YYYY-MM-DD/{raw,audio,asr} plus ROOT/statics/ holding the ledger page (a month-switchable calendar showing per-month totals — file count and processed audio duration — plus cumulative totals, where data days link to their day page and unprocessed days are flagged "待统计" instead of dead links) and day pages (per-file rows linking to the source file, converted WAV and transcript, with audio duration, start/end times, processing time and status). Every page footer carries only the inlined data-URI QR image — no brand text. Three real-world pitfalls are solved in code: Chinese output defaults to Traditional characters (the skill auto-detects the language and prepends an initial_prompt forcing Simplified Chinese, then converts half-width punctuation to full-width while protecting thousands separators, decimals, timecodes and URLs); long recordings crash mid-run (audio over 15 minutes is split on silence points into ~240 s chunks and each failed chunk automatically retries in degraded mode, so one bad chunk no longer sinks a two-hour file); quiet source audio drops sentences (each file is measured for loudness and normalized to -16 LUFS via loudnorm only when it deviates more than 1.5 LU, with the measured value recorded in the ledger). CLI: lst.py init/root/ingest/convert/transcribe/stats/run/selftest + doctor.py + install.py. Works on Windows (py -3), macOS, Linux and HarmonyOS (Linux-compat detection). Everything stays on-device — no uploads. Single-file failures never break the batch — errors are recorded in the ledger and retried automatically on re-run; redo requires explicit --force. CLI: lst.py init/root/ingest/convert/transcribe/stats/run/selftest + doctor.py + install.py. Works on Windows (py -3), macOS, Linux and HarmonyOS (Linux-compat detection). Everything stays on-device — no uploads.
品牌:瑆皓科技 · 技术支持