Skip to content

Releases: Superce1l/STTMiniTool

v2.2.7 — 说话者工作台:自动人数修复 + 逐行编辑 + 循环播放校对

Choose a tag to compare

@Superce1l Superce1l released this 24 Oct 11:12

STTMiniTool v2.2.7

本版聚焦「说话者工作台」:修复「人数 自动」在真实音频上恒判 1 人的问题,并给识别结果补齐说话者编辑能力(逐行切换 / 改名 / 拆分 / 合并),外加校对友好的「选中区间 + 循环播放」交互。全套改动有 98 例单元测试兜底。

👥 「人数 自动」判定修复

此前自动模式在真实音频上经常只识别出 1 个说话者(手动指定 2 人却完全正确)。定位到两层原因:声纹相似度矩阵的第一个特征值被「全局公共成分」占据(同语言 + 共享伴奏让所有窗口两两都有基础相似度),特征值间隙据此恒判 1 人;而 silhouette 校验门槛按 TTS 干净人声校准,会把带伴奏的真实双人误杀。

新算法:在层次聚类树上自深而浅搜索,先把关窗残响/间奏产生的碎群吸收进最近大群,取「所有群中心两两距离 ≥ 0.38」的最深切割作为人数;没有任何切割达标 → 整档 1 人。群心距离是全部实测样本中唯一界限分明的量(同一人被拆 ≤0.37 / 真正不同人 ≥0.39)。实测:真实男女对唱歌曲自动=2(与指定 2 人逐秒一致)、TTS 单人=1、双人=2。

🔁 逐行切换说话者

点字幕行上的说话者标签弹出菜单:现有说话者(当前项打勾)即点即换——卡片色条、波形区块、标签栏、导出前缀、合并判定全部同步;「+ 新说话者」可在自动分离并错一人时手工补救;「重命名说话者…」保留一步改名(Enter 存 / Esc 取消,四种导出同步新名)。

✂️🔗 单句拆分 + 同说话者合并

  • 拆分:剪刀进入拆分模式,点文本放置光标,点亮的 √(或 Ctrl+Enter)在光标处一分为二,切点自动吸附最近字边界;拆分模式下文字锁定。
  • 合并:「合并段落」选择模式点卡片多选,一键合并文本与时间轴;仅允许相邻且同一说话者的段落(跨说话者 / 不相邻会明确拒绝并提示)。合并按钮与操作栏并入波形面板,滚动时随面板钉顶。
  • 编辑(笔)与拆分(剪刀)两种模式互斥,进入后按钮变 √。

🎯 选中区间 · 循环播放

校对时点字幕行不再突然出声:点行改为选中该句区间(波形亮出遮罩);播放键从片段头起循环播放当前句(句尾自动回卷),停止键回到片段头,点波形仅移动播放头。

🆕 其他

  • 状态点五态:左下角状态点对齐模型下载/热切换语义——「已选≠已加载」显示琥珀「待切换」(此前转录跑旧模型状态点仍绿灯)、「模型未下载」与「尚未加载」区分、加载失败琥珀提醒;tooltip 显示实际加载/已选模型,点击直达模型页
  • 最近转录删除:历史条目 hover 显形垃圾桶按钮,确认后字幕文件移入回收站(可恢复)
  • 随包 CrispASR 核心 0.8.44
  • 测试增至 98 例:合成声纹改用真实相似度量级(旧测试「过干净」曾放过两版人数判定缺陷),新增同人子群不拆、碎群吸收等回归

升级:下载 STTMiniTool-v2.2.7-windows.zip 解压即用(单文件 exe + crispasr 核心),旧版直接覆盖解压目录即可;模型与设置互不影响。首次运行如遇 SmartScreen,点「更多信息 → 仍要运行」,或右键 exe → 属性 → 解除锁定。

v2.2.6 — 设置自动化 + 正确性修复 + ASS/LRC 导出

Choose a tag to compare

@Superce1l Superce1l released this 22 Oct 09:32

STTMiniTool v2.2.6

本版是一次集中修复与体验升级:两个「玄学」设置项移出设置页改为自动判断(VAD 灵敏度、每段最长秒数),三处正确性修复(CPU 转录取消、长音频说话者标签、GPU 识别提示),并新增 ASS 卡拉OK / LRC 导出、最近转录列表与真实更新检查。全套改动有 75 例单元测试兜底。

✋ OpenVINO 转录可随时取消

此前用 CPU 核心转录长音频时点「取消」,程序会把剩余段落全部跑完才在收尾时报「已取消」——结果被丢弃,时间全浪费。现转录循环在段间检查取消事件(与 CrispASR 引擎同一契约),点击取消立即停止。

👥 长音频说话者标签不再跨片错乱

超过 2 小时的音频走切片转录 + 说话者分离时,每一片独立聚类会导致同一人在片 1 是「说话者1」、片 2 变成「说话者2」。现改由调度层统一分离:逐片提取声纹中心,按 cosine 相似度映射到全局编号,整份字幕同一人始终同一编号。

💬 GPU 引擎的「识别提示」生效了

「识别提示」输入框此前在 CrispASR 引擎下被静默忽略——贴了歌词/关键词毫无效果也不提示。现 whisper / qwen3 两个后端统一传入 --prompt 初始提示(截 500 字,两后端实测接受且不回显)。

🎛️ 设置页精简:两项改自动判断

  • 语音检测灵敏度(VAD)→ 自动重试:默认门槛(0.50)没检出人声、但全段最高人声概率达到可信下限(0.18)时,自动逐级降低门槛(0.35 → 0.22)重试——覆盖「说话轻/远场录音被挡掉」这一手动调低设置的主因;真静音/纯音乐不浪费重试,直接给出明确诊断。
  • 每段最长秒数 → 任务自适应:勾选「时间轴对齐」时段上限自动压到 10 秒(抑制长段歌词的「段尾字级跑掉」漂移);不勾则用模型上限(0.6B 30 秒),段更少、吞吐更高。

老用户 settings.json 里的旧键会被忽略,无需手动清理。

🆕 新功能

  • 导出格式菜单:保存字幕现支持 SRT / ASS 卡拉OK(字级时间轴 → \k 逐字拍点,播放器直接逐字高亮)/ LRC 歌词 / 纯文本
  • 最近转录列表:首页列出 subtitles/ 最近产出(50 条),点击回填波形视图,可再校对、另存
  • 真实更新检查:「检查更新」现通过 GitHub API 比对最新版本,有新版直接打开下载页
  • 录制真实时间轴:录制转换导出的 SRT 改用录音内的真实秒数(此前每段固定 5 秒顺排,无法用于同步)
  • 卡拉OK逐字弹跳:补完「放大跳动」曲线——字被唱到的瞬间弹起回落、开唱前微抬蓄力(Apple Music 动态歌词风)

⚡ 性能

  • VAD 长音频批量推理:时间轴连续分块沿 batch 维并行,60 秒音频 0.37s → 0.11s;阈值判定与逐窗顺序推理完全一致
  • 大文件上传流式落盘:转录请求增量解析、音频边收边写盘——拖入几 GB 的视频不再把整份文件读进内存(此前内存峰值 ≥ 2 倍文件大小)
  • 前端播放优化:播放/卡拉OK循环去掉全量 DOM 扫描,数千段字幕的长音频不再卡顿

🧱 工程

  • 75 例单元测试(tests/,unittest):字幕分行、切片合并、SRT 解析、设置存储、流式解析、说话者映射、VAD 等价性等
  • settings.json 收敛为单点读写:线程锁 + 临时文件原子替换,修复并发写丢更新、进程被杀留半截文件两类隐患
  • 引擎转录改返回结构化结果(TranscribeResult),移除实例侧通道
  • 界面补全 English 翻译覆盖

打包内容:STTMiniTool.exe(onefile,WebView2 界面)+ CrispASR 核心二进制。模型文件不随包附带,首次使用时按需下载。

全部改动经 75 例单元测试与真实语音端到端回归验证:正常音量/6% 音量/噪声混合音频的 VAD 自动重试路径、冻结 EXE 无头自检(status --json)、切片说话者映射、流式上传边界情况,全部通过。

v2.2.5 — 模型下载「CERTIFICATE_VERIFY_FAILED」修复

Choose a tag to compare

@Superce1l Superce1l released this 15 Oct 03:50

STTMiniTool v2.2.5

本版修复用户反馈的**「下载并加载模型」失败**。两张截图两个报错(CERTIFICATE_VERIFY_FAILED 与 'gbk' codec can't encode '\u26a0'),实为同一条链:

企业/校园网络里的 HTTPS 代理(深信服等)会用自己的根证书重签 TLS 连接。Python 的 ssl 模块不认代理的根证书 → 到 HuggingFace 的所有模型下载直接证书验证失败。

🔐 SSL 证书验证失败自动降级

下载遇证书验证错误时自动降级为不验证重试一次:

  • 模型来源全为固定可信主机(huggingface.co / github.com),风险可控
  • 降级时写入运行日志(logs/app-年月.log)留痕
  • 只针对证书错误——超时、DNS 失败等其他网络错误仍走原有的镜像/备援逻辑,行为不变

🖥️ GBK 控制台安全输出

第二张截图的 'gbk' codec can't encode character '\u26a0' 是这样来的:下载备援逻辑的提示 print 里有 ⚠✅❌ 等字符,简体中文 Windows 的 GBK 控制台打不出来,抛出的编码错误反而取代了原始的 SSL 错误——界面「加载失败」显示的正是这个编码错误。现改用安全输出:编码不了的字符替换为 ?,保证提示能出去、真实错误能上抛。


打包内容:STTMiniTool.exe(onefile,WebView2 界面)+ CrispASR 核心二进制。模型文件不随包附带,首次使用时按需下载。

受企业代理影响的用户升级后可直接下载模型;若你的网络有额外的白名单限制,也可在「设置 → HuggingFace 镜像」填 https://hf-mirror.com 走镜像站。

全部修复经 mock 与真实网络双重验证:SSL 降级重试、非证书错误不降级、GBK 控制台输出、真实下载回归、404 错误路径,全部通过。

v2.2.4 — CrispASR(Qwen3-ASR)转录「进度卡 0%」修复

Choose a tag to compare

@Superce1l Superce1l released this 09 Oct 04:00

STTMiniTool v2.2.4

本版修复用户反馈的 CrispASR(Qwen3-ASR-1.7B)转录时进度条永远 0%、疑似卡死 的问题。经本机实测定位,该问题与显卡无关(Vulkan / CUDA / CPU 均一致),由三个叠加问题造成。

📊 进度条卡 0% 修复(本版核心)

根源:CrispASR 的 -pp 进度输出(progress = NN%)只有 whisper 后端实现了,qwen3 后端完全没有(0.8.38 与最新 0.8.42 实测一致)。而界面进度条唯一的数据来源就是这行输出——于是 qwen3 模型从转录第一秒到最后,进度永远是 0%,模型其实在正常工作。

  • 现改以「行活跃度」回报:每收到一行子进程输出就推进模拟进度(状态文字注明「模型运行中,暂无精确进度」),进度条不再静止
  • whisper 后端的真实进度解析不受影响

⏱️ qwen3 启动的 44 秒静默等待消除

qwen3 后端启动需要一个 ggml-tiny.bin 做语言识别(LID);目录里没有时 crispasr 会自己联网下载,下载失败要干等约 44 秒(WinHTTP + curl + wget 逐个尝试)才继续转录,期间零输出。现在程序自动加 --lid-model 指向本地已有的 whisper ggml(base 随包附带),这段等待彻底消失。

🐕 停滞看门狗

流式读取新增保护:180 秒无任何输出才判定挂死,杀掉子进程并给出可读的错误提示(此前真挂死会无限期持有引擎锁)。真实的长时间转录不受影响。

🚫 GitHub 限流不再导致重复下载

CrispASR 版本查询被 GitHub 限流(HTTP 403)时,此前回退到硬编码的保底版本 0.8.33——已装 0.8.38 的机器每次加载模型都被判定「核心过期」,重新下载 35MB 的 zip。现在限流时回退到本机已安装版本,不再重复下载。


打包内容:STTMiniTool.exe(onefile,WebView2 界面)+ CrispASR 核心二进制。模型文件不随包附带,首次使用时按需下载。

全部修复均在本机实测验证:qwen3 全流程转录、whisper 后端回归、取消功能、看门狗、中文文件名路径、403 降级场景。

v2.2.3 — 断句质量修复(声学停顿切行)

Choose a tag to compare

@Superce1l Superce1l released this 29 Sep 06:20

STTMiniTool v2.2.3

本版聚焦断句质量:修复「一行字幕里混有上一句的下半段和下一句的上半段」的问题,让字幕断句更贴合语义边界。

✂️ 断句修复(本版核心)

问题根源:ASR 模型偶尔在两句之间漏打标点时,唯一的换行依据只剩「每行最多 20 字」的强制保护——切点与语句毫无关系,于是上一句的尾巴和下一句的开头被拼进同一行。

  • 新增「声学停顿切行」:字级时间轴上本就记录着字与字之间的空隙。句间停顿普遍 ≥0.35 秒、短语内部几乎不留空隙,现在把足够长的停顿当作「看不见的逗号」主动切行——模型漏打标点也能正确断开
  • 兜底换行不再机械:行超长必须切时,回退到行内最长的可信停顿处切开,断点尽量贴近语义边界,而不是硬数到第 20 个字

🎵 长语音段切分修复

  • 切点吸附停顿:连续说话超过模型上限时,音频不再按固定秒数硬切(此前会把字词劈成两半,片段首尾各带半句),改为等分片数后在 ±1.5 秒范围内吸附到能量最低的停顿处
  • 不再产生超长片:新增可行窗约束,保证每片都不超过模型输入上限、不产生被丢弃的碎片——修掉了「末段可能超长被静默截断掉字」的隐患

🔗 长音频切片合并修复

  • 保留更完整的版本:超 2 小时音频的切片重叠区里,同一句话在前一片和后一片各有一个版本——跨片首的句子完整版在前片、跨片尾的完整版在后片。去重时按完整度择优保留,不再无条件取某一侧导致丢字或残句

打包内容:STTMiniTool.exe(onefile,WebView2 界面)+ CrispASR 核心二进制。模型文件不随包附带,首次使用时按需下载。

本版修复经 OCR 代码审查复核,2 项审查意见均已采纳(切片合并的丢字风险、末段超限风险)。

v2.2.2 — 长音频切片修复与取消支持

Choose a tag to compare

@Superce1l Superce1l released this 28 Sep 04:06

STTMiniTool v2.2.2

本版聚焦长音频切片转录的可靠性:修复了两个导致超长音频转录必然失败的 bug,并让「取消」真正即时生效。建议所有用户升级。

🎵 长音频切片修复(本版核心)

  • 修复切片转录崩溃:超 2 小时音频切片转录完成前最后一步,写出 SRT 时对字典按四元组解包导致 too many values to unpack (expected 4) 崩溃——此前任何长音频转录都会在最后一步失败
  • 修复 ffmpeg 切片参数语义错误:-ss 放在 -i 前时输入时间戳被重置,-to <全局终点> 被误读成重置后时间轴的终点——第 2 片起每片严重超长、重叠区去重失效。改用 -t <片长> 显式指定时长

✋ 取消真正即时

  • 转录取消不再需要等待:CrispASR 子进程可被随时终止(独立 watch 线程杀进程),此前只能在切片边界退出,单片转录中无法中断
  • 取消事件每次运行后自动复位——修复了残留置位状态会让切片转录第 2 片被误杀的回归(代码审查抓出)

📤 上传修复

  • 修复 multipart 解析把文件内容尾部 \r\n 一并剥掉的问题——音频数据不再静默截断

🧨 错误处理改进

  • 转录失败时回结构化的 500 JSON 错误(此前连接直接中断,前端只能显示网络错误)
  • 运行日志的 ERROR 记录现在附完整调用栈(缩进格式,按行检索不混入独立事件)
  • 切片转录全静音时给出明确诊断(多少片无内容、可能原因),不再笼统报「未检测到人声」

🧹 清理

  • 删除已被共享断句模块取代的旧实现(约 150 行)及其残留导入

打包内容:STTMiniTool.exe(onefile,WebView2 界面)+ CrispASR 核心二进制。模型文件不随包附带,首次使用时按需下载。

v2.2.1 — 代码审查健壮性修复

Choose a tag to compare

@Superce1l Superce1l released this 23 Sep 04:03

STTMiniTool v2.2.1

本版为 v2.2.0 的健壮性修复:三批代码审查(30 条意见,采纳修复 19 项)。功能与 2.2.0 一致(模型热切换 / 运行日志 / 下载完整性校验),建议所有用户升级。

🔁 热切换修复

  • 加载失败回退真正可用:修复旧引擎被提前释放、回退分支不可达的问题——现在新引擎就绪才释放旧的,加载失败自动换回原引擎继续转录
  • 模型加载与转录的忙碌判定改原子 check-and-set:并发请求不再双通过守卫(此前会导致双加载线程、转录忙碌状态被错误清除、关窗确认失效)
  • 模型成功加载后清空上次失败的错误残留

🏷️ 字幕修正

  • 文件名标签改用「实际加载」的引擎与模型(忙碌期间改选择不再误标)
  • 标签内 . 换 ·,无扩展名文件不再产生残缺文件名

⬇️ 下载修复

  • 断点续传遇忽略 Range 的服务器时,不再误删刚下载完的完整文件
  • Qwen GGUF(q4/q8/日语动漫)与 ForcedAligner .bin 的下载跳过 guard 补大小下限——残档不再被当「已存在」跳过下载
  • CrispASR 版本查询失败回退保底版本时记录日志

🎵 非 ASCII 路径三连修

  • 临时副本在异常路径不再泄漏
  • 路径检查从「文件名」扩展到「完整路径」(目录含中文同样处理)
  • 临时目录改用保证 ASCII 的位置 + 唯一文件名
  • 说话者分离改用原路径(此前对非 ASCII 文件名会静默失效)

🖥️ 其他

  • 多显示器(外接主屏 / 任务栏停靠左上)下窗口不再开到错误屏幕
  • CLI:显卡探测失败不再误报为「没有显卡」;profiles 命令 WMI 探测 4 次 → 1 次

📦 安装

  1. 下载 STTMiniTool-v2.2.1-windows.zip 并解压
  2. 右键 STTMiniTool.exe → 属性 → 如有「解除锁定」勾选后确定
  3. 双击运行;首次使用在「模型」页选引擎与模型,点「下载并加载模型」

从 v2.2.0 升级:直接覆盖 exe 即可,模型与设置自动沿用。

v2.2.0 — 模型热切换 / 运行日志 / 下载完整性校验

Choose a tag to compare

@Superce1l Superce1l released this 22 Sep 10:15

STTMiniTool v2.2.0

本地语音识别字幕生成工具 —— 数据不离开你的电脑。

✨ 新特性

  • 🔁 模型热切换:引擎(OpenVINO / CrispASR)、模型、加速版本切换不再需要重启——模型页选好后点「下载并加载模型」就地生效;转录进行中自动禁用切换;加载失败自动回退原引擎
  • 🏷️ 字幕文件名带引擎标识:输出字幕自动拼接所用引擎与模型,如 唯一 [CrispASR · Whisper Base].srt,多模型对比不混淆
  • 📜 运行日志:转录(耗时/段数)、模型加载、下载事件自动记录到 logs/app-年月.log,问题可回溯
  • 🎛️ 模型页改版:检测到的设备 → 推理引擎(两列并排直选)→ 选择模型,去掉「基础/高级」双模式

🐛 修复

  • CrispASR 打不开含中文/非 ASCII 字符的音频路径(自动转 ASCII 临时副本转录)
  • OpenVINO 路径 VAD 崩溃(Unable to handle object of type int)
  • crispasr.exe 异常退出时,错误消息带上子进程真实报错(不再只有笼统提示)
  • 长视频(>2 小时,如 .mov)转录报 TypeError: missing 1 required positional argument
  • 打包补齐缺失的 scipy 依赖(说话者分离必需)

✅ 可靠性

  • 下载完成即对账 Content-Length:中断残档立即删除、提示重下(此前会静默留下半截模型导致加载失败)
  • GGUF 模型加 100MB 大小下限,残档不再被当成完整模型
  • 长音频切片时长依可用物理内存自适应(5–30 分钟),小内存机器不再 OOM

📦 安装

  1. 下载 STTMiniTool-v2.2.0-windows.zip 并解压
  2. 右键 STTMiniTool.exe → 属性 → 如有「解除锁定」勾选后确定(单文件 exe 仅此一处)
  3. 双击运行;首次使用在「模型」页选引擎与模型,点「下载并加载模型」

需要 Windows 10+ 与 WebView2 Runtime(Win10/11 一般自带)。
所有模型按需自动下载(HF/GitHub),音频数据全程本地处理。