Electron 转写¶
历史背景: 本页面编写时 Electron 与 Tauri 应用并存。文中提到的 Tauri 辅助工具、页面、测试和回归结果描述的是那一迁移时期的情况;此后 Tauri 外壳已移除,共享代码现位于
electron/src/shared/。现有 Tauri 安装用户请参阅 迁移指南。
在引擎列表上方打开“转写”,或通过命令搜索打开。上传音频文件或开始听写,然后停止录音以进行转写。工作区会在录音/上传前以及转写前分别检查听写就绪状态。当没有模型激活时,工作区会优先提供已安装模型,或在用户明确点击后提供后端推荐的模型供下载。它会显示安装进度,支持取消,并在就绪后解锁录音/上传。如果听写引擎不可用,请使用“设置 > 模型 > 听写”来恢复。
结果使用现有 Tauri omni_transcriptions 历史格式,以及共享的读取器和写入器,并采用相同的“最新在前、200 条上限”的约束。Electron 与 Tauri 拥有独立的浏览器存储源;共享格式并不会在应用之间迁移旧数据。你可以搜索结果、查看可用的片段时间信息、复制或导出文本、删除条目,以及将文本发送到克隆脚本。副面板标记为 历史记录,因此其保存结果列表与“转写”工作区及其录音操作保持区分。
空工作区现在以“开始听写”和“上传音频”为首要操作。仅历史记录的搜索/导出/清除控件在存在转写之前保持隐藏,后端故障会显示一次,并带有直接的“重试”和“关闭”操作。
录音使用现有的采集/清理辅助函数。播放使用 Vidstack。文件转写在你离开工作区后仍会继续运行:只有“取消”会中止它,结果始终保存到“历史记录”,当你在其他页面时若转写完成或失败,会有 toast 提示并附上返回链接。渲染器重新加载仍会结束转写。
在精确模式中,识别说话人(默认关闭)会请求 /transcribe 为每个片段标注说话人(API 调用者也可以传递 num_speakers)。它使用与配音相同的说话人模型。标签会出现在片段列表和导出中;导出若包含清理后的文本,会保留该文本并在其下方添加带标签的片段。如果说话人模型缺失或失败,转录文本仍会保存(不带标签),并附有警告说明原因。精调设置、原生听写和目标应用投递将在下文介绍。跨应用历史记录迁移仍是单独的并行工作。
Electron 会在主窗口或录音器加载前安装 Chromium 权限检查和请求处理器。只有受信任的 VoiceStudio 顶级来源才能接收音频采集;摄像头、嵌入式框架和跨来源请求均被拒绝。操作系统级的麦克风权限仍具有最终决定权。
听写模型设置现在提供可选的 LLM 清理、语气词移除、自我纠正和技术术语保留。在没有 LLM 的情况下,每个听写结果在输入前都会在本地确定性地清理:犹豫词("uh"、"umm",英语中的 "um"/"er")和英语短词重复("the the")会被移除;流式模型输出的全大写文本会按句首大写处理;英文 "i" 变为 "I";标点前的多余空格会被删除(法语在 ? ! ; : 前保留空格);中文或日文听写的片段之间不加空格。文本清理 → 口述标点(默认关闭,英语)会将 "comma"、"period"、"full stop"、"question mark"、"exclamation mark"、"colon"、"semicolon"、"new line" 和 "new paragraph" 转换为对应符号;使用流式模型时,在停顿后单独说出的命令会被丢弃而不会输入。文件转写、MCP/CLI 调用和语音克隆参考转录文本会保留实际说出的词语;只有快捷键听写会被清理。上传/录音转写会读取已保存的主设置;如果设置不可用,它会安全地保留原始转写。原始文本保留在历史记录中,任何精调后的文本单独存储,并可在带“复制”按钮的可展开区域中查看。参考音频 ASR 继续使用原始转写。清理失败说明复用共享的 Tauri 状态映射。
“转写”现在使用与参考录音完全相同的 RecordingInputs 组件,提供麦克风及单声道/立体声选择。在采集/处理期间控件会被禁用,并接入现有的录音器约束条件。浏览器检查通过模拟设备列表覆盖设备/声道选择;物理设备录音仍是原生 macOS/Linux 验证门禁。Windows 快捷键和目标插入的覆盖情况如下所述。
录音器生命周期守卫现在会释放导航后获得的麦克风权限,并在卸载时取消挂起的清理操作。迟到的清理结果无法在已关闭视图中启动转写或加载参考。两个“失败在前/通过在后”的回归测试覆盖了延迟权限和延迟清理场景。
转写时间标签和文本导出格式与 Tauri 共享。导出会保留日期/语言上下文,使用相同的带日期文件名,并确认保存成功;片段标签在可用时显示时间上下界,而不会凭空捏造缺失值。共享的 Tauri 测试以及对下载文件的浏览器检查会验证这一行为。
“历史记录”支持“全部清除”,并带有内联确认和取消。存储写入失败时会保留可见和已存储的历史记录,并让确认状态保持打开以供重试。单条删除在写入前会读取最新存储的条目。浏览器检查覆盖取消、存储失败和成功确认清除的情况。
实时听写现在通过共享的 Tauri AudioWorklet 和抗混叠采集图传输单声道 16 kHz PCM。录音仍是独立的片段预览工作流。听写会在请求麦克风前检查所选模型是否已启用并安装;暂停、停止和取消会保留明确的会话边界。实时话语只会进入历史记录一次,包括重复的语音;EOF 汇总可避免重复条目。旧的回退终结结果也会正常完成。历史记录写入失败时会保留可见文本以供复制。离开页面会释放采集。
验证包括八项控制器测试、模拟的浏览器控件,以及使用 Chromium 预录制测试输入(非物理麦克风)的真实已安装 Parakeet 会话。后端成功返回实时语音和最终历史记录。真实的 Faster-Whisper 上传检查还针对运行中的本地后端验证了时间分段、文本导出、Clone 交接、持久化历史记录和删除。生产构建会输出完全相同的共享 worklet 资源。录制器控件、全局快捷键和目标投递均已实现;原生 Windows 验收通过,而物理麦克风及 macOS/Linux 交互仍是发布门禁。
托盘现在提供本地化的“开始听写”和“停止录制”操作,由专用的非激活录制器窗口支持。它在显示录制器之前捕获输出目标,将启动/停止事件排队直至注册完成,并使用共享的原生投递辅助工具。主应用框架无法调用仅限录制器的输出 IPC。取消/导航/崩溃会使待处理的工作失效;序列号会拒绝重复投递。剪贴板回退会保留完整转录文本,并标记为“已复制”而非“已插入”。
原生 Windows 冒烟检查涵盖辅助工具验收、暂停/恢复、无语音、取消/重新打开、主框架输出拒绝以及已保存的转录历史。一个独立的可丢弃目标应用冒烟测试验证了实际的有序插入和剪贴板恢复。原生 macOS 录制器/插入以及带物理麦克风的 Linux portal 快捷键行为仍未验证;WSLg 在无桌面 portal 的环境下验证了托盘/监视行为及剪贴板回退。
Windows 跨应用插入现在通过一个可丢弃的第二个 Electron 进程进行验证:两条语音按顺序到达,并且剪贴板被恢复。该测试使用确定性 ASR 和假麦克风,但走的是真实的原生目标、激活和粘贴路径。它发现了一个 Tauri/Electron 共有的竞争条件,位于排队的粘贴消费与下一条语音之间。原生操作现在在整个现有的 300 毫秒剪贴板消费窗口内持有其锁。该集成在修复前失败,之后两次通过;19 个辅助工具测试和 16 个 Tauri 测试通过。macOS/Linux 插入及全局快捷键/按住/portal 行为仍是原生验收门禁。
全局听写现在遵循已保存的共享后端模式:按住模式在按键释放时停止(包括在麦克风启动前释放),而切换模式在下次按下时停止。设置 > 模型 > 听写提供模式、按键录制、保存和重置功能。按键录制复用了 Tauri 的解析器及修饰键/取消行为。加速键以原子方式存储在 Electron userData 中;保存失败会恢复之前的原生绑定。禁用听写会注销该快捷键。重复刷新偏好设置不会重新打开已拒绝的 portal 权限请求。
Windows 原生集成验证了设置录制/保存路径、持久化加速键、真实全局按键、提前按住释放、切换和禁用。它使用假麦克风和无语音响应,因此不会向任意应用输入文本。原生会话与设置回归测试共 19 项;Tauri 现有的七项按键录制测试仍然通过。原生 macOS/Wayland 交互以及在前一会话仍在转录时重启采集,仍是原生验证工作。Windows 行为对等性通过确定性 ASR 和假麦克风验证。
采集重启现在符合 Tauri 的实际状态规则:转录保持独占,而可见的已完成/无语音/错误结果会立即接受下一条快捷键。带会话标签的阶段报告使主进程能够做出该决策。替换操作会在旧输出清理完成期间保留提前按住释放;过期的取消无法关闭新会话。Windows 重启集成在此更改之前失败,之后通过,同时还有 17 项会话回归测试通过。
Electron 开发模式现在使用渲染器的同源 WebSocket 代理,即使 preload 提供了后端 URL;打包应用方案仍然直接使用可信的后端 URL。两条路径都有针对性的覆盖。一次真实的原生 Electron 开发运行,使用预录制的麦克风输入和已安装的 Parakeet,通过代理成功返回了实时文本并保存了转录内容。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio