AudioAlignTool 是用于电子书文本与有声书时间轴对齐的 Windows 桌面编辑器。它也支持完全没有原文的工作流:直接导入音频或 M4B,由所选 ASR 模型生成文本与句段,再人工校正。
- Subtitle Edit 风格的主音频编辑器支持波形、频谱和上下组合三种模式,切换模式时保留播放头、时间选区、缩放范围和当前句。
- 字幕列表与连续文章视图可以分别选择“无图、波形、频谱”,适合在紧凑校对和图文对照之间切换。
- 支持框选时间、拖动句段起止边界或整体移动句段、播放/循环选区、逐句播放、水平滚动、时间轴缩放以及波形振幅或频率轴缩放。
- 播放头居中跟随默认开启;手动浏览后进入暂停跟随状态,可随时回到播放头。总览条显示整章范围、当前窗口和播放位置。
- 播放速度支持
0.25×–3.00×,默认1.00×,可选择恢复上次倍率或每次以正常速度启动。 - 静音候选可以独立显示或隐藏。拖动边界时默认自由调整,按住 Shift 才会吸附到设定范围内的静音边界。
- 支持将时间选区绑定到当前句、平均或按已有时长分配给多句、设置起止点、插入、拆分、合并、清除时间、锁定和删除。
- 删除来源于 EPUB/TXT/MD/HTML/SRT 的句段时只清除时间并保留原文为“未匹配”;只有用户或 ASR 新建的无来源句段才会真正删除。
- “识别 → 清除本章全部时间对应”保留全部文字;“重置本章字幕并重新匹配”则保留原书/SRT、删除自动或用户临时句,并优先复用识别缓存重新匹配。
- 拆分支持“按播放头”“文本框当前光标”“按标点拆成多句”。存在 ASR 或 Forced Aligner 字符锚点时优先用锚点确定文本和时间边界,没有锚点时才按字符比例估算。
- 语言感知分句可处理中文、日文和空格语言,支持省略号、多重标点、直接引语及含多个逗号的长句;自动分句不会因为句子较长就在普通词间空格处硬切,也不会产生只有标点的句段。
- 三种重叠策略可选:限制当前句且不修改相邻句、自动缩放直接相邻句、允许重叠并显示红色冲突。
- 当前句固定编辑区可修改开始、结束、持续时间和多行文本;常用操作同时提供 Unicode 图标、Tooltip、右键菜单和快捷键。
- 普通绑定只更新涉及的数据库行和图形项;隐藏标签页延迟刷新。撤销/重做按“项目+会话+章节”隔离,非结构性撤销会保留句段 ID并原位恢复。
- 工作流分为“识别后对齐”和“已知文本强制对齐”。faster-whisper、WhisperX、Qwen3-ASR 先生成带时间的识别稿,再与原文匹配;Qwen3-ForcedAligner 直接对齐指定原文和音频范围。
- faster-whisper 是默认识别后端。WhisperX 在 Whisper 识别之后使用语言相关声学模型细化词时间,属于组合式识别与对齐 pipeline;Qwen3-ASR 支持 0.6B 和 1.7B。
- 长音频识别采用带重叠的分块窗口,并优先在 VAD 停顿附近分块。相邻块的上下文用于保持接缝稳定,合并时只保留各自核心范围内的 token,避免重复识别内容。
- ASR 识别稿与原文的匹配不是逐句滑动窗口。程序合并整章识别结果后执行全章保序序列匹配:中文、日文、韩文按字符,空格语言按词;允许局部漏读、多读、口误、标题未朗读和版本差异,不让一处短差异强制带偏后续句段。
- 匹配到的词或字符时间用于生成句段边界、置信度和文章锚点。修改原文只需重新运行文本匹配,可以继续使用已有识别缓存;界面也提供强制重新识别和清除当前模型缓存。
- Qwen3-ForcedAligner 可处理当前句、连续所选句与音频选区、从指定句子/时间向后,或整个章节。向后和整章模式使用多句块、相邻块重叠验证与有限回溯;无法可靠继续时保留已确认结果并将问题句标黄。
- 静音候选默认仅显示筛选后的关键灰蓝区域且没有中心竖线;黄色只表示低置信度、漂移或重新同步等需要人工检查的对齐结果。“视图 → 静音显示”可切换隐藏、关键和全部。
- 支持完全没有原文的纯音频转写:媒体管理器会明确询问是否按媒体文件或 M4B 内嵌章节建立空白章节;应用后运行当前章或全书识别,根据 ASR 标点、停顿和最大句长生成可编辑句段。
- 静音检测使用 VAD 判断语音区,再在非语音区寻找低能量边界。检测结果只生成可视候选,不会直接覆盖时间轴。
- “从当前句按静音自动分配”不加载 ASR,以当前句和播放头或选区为起点进行粗排;锁定句段作为硬锚点,置信不足时标记为待检查。
- ASR 对比视图按词锚点把原文句段与识别稿排成成对行,共用一个滚动位置,并恢复空格语言的词间空格;单击识别词只定位播放头,双击则定位并将主音频视图居中。
- “字幕表格”适合逐句检查时间、正文、状态和句旁音频图。
- “文章音频”按窗口宽度连续排版正文,每个视觉行下方显示对应波形或频谱;文字可以跨行选择和复制,不使用逐句列表框。
- “原书”使用 WebEngine 显示 EPUB/HTML 的原始 XHTML、CSS、字体、图片和排版;页面与书籍资源使用受项目目录限制的同源本地地址,TXT、Markdown、SRT 与纯音频项目使用阅读模板。
- 原书文字单击只定位句段和播放头,双击会进一步将主音频视图跳到对应位置;播放时高亮实际文字范围并可自动滚动,同时保留浏览器原生选择、复制与缩放。
- “ASR 对比”独立显示识别差异,不把原文和识别稿混排到同一个文本块中。
- 文本来源支持 TXT、Markdown、HTML、EPUB 和 SRT;媒体支持 MP3、M4A、M4B、AAC、WAV、FLAC、OGG、Opus,以及含音轨的 MP4/MKV/MOV/WebM。
- TXT/MD/HTML/SRT 文件选择器支持多选,多选时每个文件建立一个章节;单个 Markdown/HTML 仍可按一级标题拆章。
- SRT 可以新增为章节、匹配到当前章节或预览后替换当前章节,并保留多行文本、合法重叠和原始文件。
- M4B 内嵌章节作为同一媒体资源中的独立时间切片参与配对,无需拆分或重复复制整本音频。
- 媒体资源与章节配对管理器支持添加、排序、重命名、重新定位、替换、移除引用、重复检查,以及一个文本章节连接多个媒体切片。
- 同一媒体切片可以复用到多个文本章节;规范路径和文件指纹用于防止同一文件被重复导入。所有配对修改在点击“应用”后才以一次事务写入。
- EPUB 的独立
CHAPTER XXX标题页可与后续正文页组成同一逻辑章节,同时保留标题句本身;日文 EPUB 优先使用<head><title>的正式章名,并从匹配文本中排除 ruby 注音的<rt>,避免“夫妻”变成“夫ふ妻さい”而破坏 ASR 匹配。 - 配对管理器的“原文解析”支持 Anki Furigana。启用后,TXT、Markdown、HTML 或 EPUB 中的
漢字[かんじ]会在原书视图中显示为 ruby 上方假名,文本匹配和分句使用汉字正文;用户选择的原始文件不会被改写。
- 项目可以保存为程序目录下的项目文件夹或 ZIP64
.aatproj;项目名就是目录名,不使用随机 UUID。 - SQLite 保存文本、时间轴、锚点、识别结果、静音候选和任务记录,媒体默认可以只保存引用,也可复制到项目中。
- 推理和媒体缓存使用两个独立工作通道。运行全书识别时,当前章节仍可生成波形和频谱;两个模型任务不会同时争抢 GPU。
- 状态栏固定显示任务阶段、总进度、章节、耗时、预计剩余、推理/媒体队列和取消控制,文字变化不会推动各区域来回移动。
- 模型状态显示实际使用的 CPU/GPU、设备名称、计算类型、缓存块进度和回退原因;只有实际完成短推理后才报告 GPU 可用。
- faster-whisper 通过 CTranslate2 使用 CUDA,Qwen 通过 PyTorch 独立检测 CUDA。GPU 不可用时允许回退 CPU并提示速度可能很慢。
- 模型下载完成后可以离线使用;Qwen 模型优先从 Hugging Face 获取,连接失败时可自动切换到 ModelScope,并保留未完成下载供下次继续。
- 支持交互式 HTML、SRT、WebVTT、schema v2 JSON,以及 EPUB 3 Media Overlays;回写原版 XHTML 时允许受控的细微用词差异,同时保持章节内单调映射,避免误配重复文本。
- HTML 阅读包优先复用 EPUB/HTML 的原始标签、CSS、字体和图片;固定播放器支持章节切换、
0.25×–3.0×倍速、上一句/下一句、单句循环、播放高亮,并在浏览器本地记录上次章节、播放位置、倍率和循环状态。 - HTML 还可选择“独立章节”模式:每章输出一个自带播放器和同步逻辑的 HTML,不生成
index.html,也不建立章节之间的链接;音频及原书图片、字体、CSS 仍复用导出目录中的media/与book/资源。 - EPUB 来源项目复制原 EPUB 包结构,保留 CSS、字体、图片、封面、导航、元数据、spine 顺序和原版排版,只注入同步锚点、SMIL 与媒体清单。
- EPUB 正文可选择“保持原书正文”或“尝试应用编辑文字”;后者只替换能够可靠定位且不跨越样式、链接或 ruby 的范围,其余句段保持原文并写入导出报告。
- EPUB 导出可以自动把相邻句之间的短空隙补到前一句
clipEnd,保留自然停顿,避免阅读器在句段边界产生突兀跳变;最大补齐长度可设置,且不会跨越未匹配句、重叠或长空白。 - 自动兼容策略会直接复制 MP3/AAC、把 M4B 或视频中的 AAC 无损重封装为 M4A,并将 Opus、Vorbis、FLAC、WAV 等格式转换为 AAC-LC;也可强制 AAC 或 MP3。
- 转换后的 EPUB 音频保存在项目缓存中,第二次导出相同媒体和参数时直接复用;多个媒体可以并行准备。
- 个别句段无法映射回原 XHTML 时会跳过并列出具体警告,其余内容继续生成;原 EPUB 结构损坏或媒体缺失时则停止导出。
源码运行时,仓库根目录就是程序目录;打包后,可执行文件所在目录就是程序目录。程序必须位于可写位置,不会回退到 LocalAppData。
AudioAlignTool/
projects/<项目名>/
.work/<压缩项目名>/
models/<Whisper 模型名>/
logs/
settings.json
项目目录名就是经过 Windows 文件名校验的项目名,不使用随机 UUID。同名项目不会被覆盖。
项目格式只支持 schema v2:
manifest.json
project.sqlite3
source/
media/
cache/
.aatproj 是 ZIP64 单文件项目;编辑时解压到程序目录下 .work/,保存时使用临时文件原子替换。普通项目文件夹直接事务化保存。
发布和推荐开发环境使用 Python 3.14,同时支持 Python 3.13。首次准备源码环境:
powershell -ExecutionPolicy Bypass -File .\bootstrap.ps1之后始终使用项目自己的解释器启动:
.\start.batWhisper 模型在首次确认下载后写入 models/<模型名>/,之后可离线运行。Qwen 与 WhisperX 通过“选项 → 运行时组件”安装,共用一份 PyTorch。
- 新建以项目名命名的项目,导入 TXT/MD/HTML/EPUB/SRT;也可建立纯媒体项目。
- 在“媒体资源与章节配对管理器”中添加音频或视频并确认文件、切片或 M4B 内嵌章节的对应关系。所有更改在按“应用”前都不会写入项目。
- 选择对齐方式、模型和语言。可选 faster-whisper/WhisperX/Qwen3-ASR 的识别后对齐,或 Qwen ForcedAligner 的已知文本强制对齐。
- 检测静音,在波形或频谱上框选、试听并拖动句段边界;默认自由拖动,按住 Shift 时吸附到附近静音边界。
- 在字幕表格、文章音频或原书视图中检查内容。原书文字可点击定位;播放时同步高亮,同时保留浏览器原生选择、复制与缩放。
- 保存项目并导出所需格式。EPUB 来源可导出 EPUB 3 Media Overlays;默认直接复制 MP3/AAC、将 AAC 容器无损重封装为 M4A,并把其他编码转换为 AAC-LC。
音频图操作:普通滚轮水平滚动,Ctrl+滚轮以鼠标位置为中心缩放时间轴,Alt+滚轮按播放跟随中心缩放,Shift+滚轮缩放波形振幅或频谱频率轴。Escape 清除选区,Delete 删除所选句段,Enter 将选区绑定到当前句。
.\.venv\Scripts\python.exe -m unittest discover -s tests -v项目发布两个免安装 ZIP,不生成安装器,也暂不提供包含 CUDA 的完整包。发布构建 默认使用 Windows x64 Python 3.14,构建脚本也接受 Python 3.13。
精简便携版包含 faster-whisper CPU、VAD、编辑器和全部导入导出功能,不内置 Qwen/PyTorch:
.\build-portable.ps1 -Clean普通版额外内置 Qwen3-ASR、ForcedAligner 和 CPU-only PyTorch,但不包含 CUDA:
.\build-portable.ps1 -Clean -Standard普通版的 Qwen CPU/PyTorch 以可替换运行时层预置在 runtimes/,不嵌入
PyInstaller 的 _internal,因此构建环境已安装的 GPU PyTorch 不会混入发布包。精简版可通过
“选项 → 运行时组件”安装统一 AI 运行时。Qwen、WhisperX 和
faster-whisper 共用同一份 PyTorch/CUDA 库,CPU/GPU 版二选一。组件清单只读取程序自带的
runtime-packages/runtime-index.json,依赖由 pip 从 PyPI 或 PyTorch 官方 wheel
源安装到程序目录的 runtimes/,不会读取 GitHub 索引或从 GitHub Release 下载
运行时包。组件 ABI 按当前 Python 3.13/3.14 解释器生成,不下载或维护第二套 Python 运行时。
每次构建都会先删除旧的
dist/AudioAlignTool 目录,防止旧 ZIP、模型或项目被意外嵌套进新包。
脚本会创建或复用程序目录内的 .venv,安装锁定依赖,运行测试,调用
PyInstaller 生成 onedir 目录,最后输出:
artifacts/AudioAlignTool-<版本>-Windows-x64-portable.zip
artifacts/AudioAlignTool-<版本>-Windows-x64-standard.zip
artifacts/SHA256SUMS.txt
解压 ZIP 后直接运行 AudioAlignTool.exe。不能只复制 EXE,必须保留同目录下的
_internal。项目、模型、日志和设置都会写在解压后的程序目录,因此应解压到用户
有写权限的位置。
常用参数:
# 使用指定的 Python 3.14(也接受 3.13)
.\build-portable.ps1 -Python C:\Python314\python.exe -Clean
# 已经安装依赖时跳过安装;仅在确认环境完整时使用
.\build-portable.ps1 -SkipInstall
# 临时跳过测试
.\build-portable.ps1 -SkipTestsGitHub Actions 配置位于 .github/workflows/windows-portable.yml。推送到 main、
创建针对 main 的拉取请求、推送 v* 标签或手动触发时都会并行构建精简便携版和
CPU Qwen 普通版;v* 标签的 Release 同时上传两个 ZIP 和统一的 SHA-256 校验文件。
CI 与本机均调用同一个 build-portable.ps1,不会调用 Inno Setup,也不会发布 GPU 完整包。