Administrator
发布于 2025-12-29 / 16 阅读
0
0

19.【教程】 Windows 效率神器:利用 AHK v2 实现右键一键 CapsWriter 离线语音转文字


本期魔改软件链接(只有30天有效期,随缘取之):

【【瑟谷智学魔改】CapsWriter-Offline-Windows-64bit.zip】

https://t3.znas.cn/glSKXd0bxD5

提取码:9677

到期了@瑟谷智学小助手:我再续期

前言:为什么要折腾这个?

CapsWriter Offline 是一款非常强大的离线语音转文字工具(基于阿里 FunASR 模型),识别率高且完全免费。但原版的使用流程略显繁琐:

  1. 手动打开服务端 (start_server.exe),等待加载。

  2. 手动打开客户端 (start_client.exe)。

  3. 拖入视频文件。

作为效率党,我们希望达到的效果是:在视频文件上点击右键 -> 选择“转文字” -> 自动处理一切(包括后台启动服务)

本文将基于 AutoHotkey (AHK) v2 版本,教你如何实现这一自动化流程。


准备工作

  1. 核心软件:CapsWriter Offline(确保你有 start_server.exestart_client.exe)。

  2. 脚本工具:AutoHotkey v2 版本(官网下载安装)。

  3. 目标路径:假设你的软件解压在 D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\注意:下文代码中请替换为你自己的实际路径)。


第一步:编写自动化逻辑 (AHK 脚本)

我们需要一个“大脑”来判断服务端是否开启,并协调客户端的调用。

  1. 在 CapsWriter 根目录下新建文本文档,重命名为 SourceScript.ahk

  2. 右键编辑,填入以下代码(基于 AHK v2 语法):

AutoHotkey

; ==============================================================================
; 脚本功能: 自动检测服务端状态并调用转录
; 环境要求: AutoHotkey v2
; ==============================================================================

#Requires AutoHotkey v2.0
#SingleInstance Force

; 1. 获取右键菜单传递的文件路径
if (A_Args.Length < 1)
{
    MsgBox("错误:请通过右键菜单调用此程序。", "错误")
    ExitApp
}
VideoPath := A_Args[1]

; 2. 定义程序名称和工作目录
; A_ScriptDir 代表当前脚本/exe所在的目录
WorkingDir := A_ScriptDir
ServerExe := "start_server.exe"
ClientExe := "start_client.exe"

; 3. 核心逻辑:智能判断服务端状态
; ProcessExist 检查进程是否存在
if !ProcessExist(ServerExe)
{
    ; --- 场景A:冷启动(服务未开)---
    TrayTip "服务端未运行,正在后台静默启动 (需等待35秒)...", "自动转录助手"
    
    ; Hide 参数让服务端在后台运行,不弹黑框干扰视线
    try {
        Run(ServerExe, WorkingDir, "Hide")
    } catch {
        MsgBox("找不到服务端文件,请检查路径!", "错误")
        ExitApp
    }
    
    ; 强制等待35秒(给模型加载预留时间,视电脑配置可自行调整)
    Sleep(35000)
    
    TrayTip "模型加载完毕,开始转录...", "自动转录助手"
}
else
{
    ; --- 场景B:热启动(服务已开)---
    TrayTip "服务端已就绪,立即开始转录...", "自动转录助手"
}

; 4. 调用客户端进行转录
; 注意:文件路径必须包裹引号,防止路径中含空格导致错误
try {
    Run('"' ClientExe '" "' VideoPath '"', WorkingDir)
} catch {
    MsgBox("无法启动客户端。", "错误")
}

ExitApp
  1. 编译为 EXE(关键步骤):

    • SourceScript.ahk 上点击右键,选择 "Compile Script"

    • 将生成的 .exe 文件重命名为 AutoTranscribe.exe

    • 原理:编译成 EXE 后,运行更稳定,且注册表调用时无需依赖 AHK 环境路径。


第二步:配置右键菜单 (注册表)

我们需要告诉 Windows,当按下右键时去运行刚才编译好的 EXE。

  1. 新建一个文本文档,重命名为 AddMenu.reg

  2. 右键点击选择“编辑”,填入以下内容(注意替换你的实际路径):

代码段

Windows Registry Editor Version 5.00

; --- 添加右键菜单项 ---
[HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe]
@="一键语音转文字 (CapsWriter)"
; 下面这行设置菜单图标,直接借用客户端的图标
"Icon"="D:\\Video-Transcribe\\CapsWriter-Offline-Windows-64bit\\start_client.exe"

; --- 定义点击后的动作 ---
; 调用我们编译好的 exe,并把文件路径 "%1" 传进去
[HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe\command]
@="\"D:\\Video-Transcribe\\CapsWriter-Offline-Windows-64bit\\AutoTranscribe.exe\" \"%1\""
  1. 【至关重要】解决乱码问题

    • 点击记事本左上角的 “文件” -> “另存为”

    • 底部的 “编码” 选项,必须手动选为 ANSI

    • 原因:Windows 注册表如果是 UTF-8 编码,中文会显示为乱码方块。

  2. 保存后,双击 AddMenu.reg 导入注册表。


第三步:效果验证

  1. 冷启动测试

    • 确保 CapsWriter 没在运行。

    • 右键视频 -> 点击“一键语音转文字”。

    • 效果:右下角弹出气泡“正在启动...等待35秒”,35秒后自动弹出转换进度条。

  2. 热启动测试

    • 不要关闭刚才开启的服务端。

    • 再次右键另一个视频。

    • 效果:右下角弹出“服务端已就绪”,瞬间弹出转换进度条,秒开!


技术总结 (Technical Summary)

如果你想深入理解,这里有几个关键技术点:

  1. AHK V2 语法

    • 使用了 ProcessExist() 替代了旧版的 Process, Exist

    • 使用了 Run(Target, Dir, Options) 函数式写法,更符合现代编程习惯。

    • 使用了 try...catch 进行简单的错误捕获。

  2. 静默运行 (Hide)

    • start_server.exe 本质是一个命令行工具,直接运行会有黑色窗口。通过 AHK 的 Hide 参数,我们将其隐藏在后台,保持桌面整洁。

  3. ANSI 编码陷阱

    • Windows 的 .reg 文件在处理中文字符串时,默认依赖系统本地编码(GBK/ANSI)。如果使用编辑器默认的 UTF-8 保存,会导致注册表菜单显示乱码。


希望这个教程能帮到大家,把重复的劳动交给代码,把时间留给创造!

升级版:用bat批处理管理右键菜单

这是一个非常实用的需求!为了方便管理右键菜单,防止菜单越来越臃肿,使用 .bat (批处理) 脚本做一个“开关”是最优雅的解决方案。

这个脚本将集成 “一键添加”“一键删除” 两个功能,无需再依赖 .reg 文件,完全独立运行。

✅ 解决方案:全能管理脚本 (ManageMenu.bat)

请在 D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\ 目录下新建一个文本文档,重命名为 ManageMenu.bat,然后右键选择“编辑”,粘贴以下代码。

⚠️ 重要提示:保存时编码依然要选择 ANSI,否则中文菜单会乱码。

代码段

@echo off
setlocal EnableDelayedExpansion
title CapsWriter 右键菜单管理工具
cd /d "%~dp0"

:: ============================================================================
:: 自动提权代码:确保以管理员身份运行,否则无法修改注册表
:: ============================================================================
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
    echo 正在请求管理员权限...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"

:: ============================================================================
:: 主菜单界面
:: ============================================================================
:MENU
cls
echo ================================================================
echo               CapsWriter 右键菜单管理助手
echo ================================================================
echo.
echo      [1]  安装 / 修复 右键菜单 (Add)
echo.
echo      [2]  卸载 / 清理 右键菜单 (Remove)
echo.
echo ================================================================
echo.
set /p user_choice=请输入数字 [1 或 2] 并回车: 

if "%user_choice%"=="1" goto INSTALL
if "%user_choice%"=="2" goto UNINSTALL
goto MENU

:: ============================================================================
:: 安装逻辑
:: ============================================================================
:INSTALL
cls
echo 正在添加注册表项目...

:: 1. 创建主菜单项
reg add "HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe" /ve /d "一键语音转文字 (CapsWriter)" /f >nul

:: 2. 设置图标 (指向当前目录下的 start_client.exe)
reg add "HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe" /v "Icon" /d "%~dp0start_client.exe" /f >nul

:: 3. 设置执行命令 (指向当前目录下的 AutoTranscribe.exe,并传递文件路径 %%1)
:: 注意:%%1 在 bat 中代表参数,为了写入注册表变成 %1,需要双写百分号
reg add "HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe\command" /ve /d "\"%~dp0AutoTranscribe.exe\" \"%%1\"" /f >nul

echo.
echo [成功] 右键菜单已添加!
echo 现在你可以在任意视频文件上右键看到该选项了。
echo.
pause
goto MENU

:: ============================================================================
:: 卸载逻辑
:: ============================================================================
:UNINSTALL
cls
echo 正在清理注册表项目...

:: 强制删除整个键值
reg delete "HKEY_CLASSES_ROOT\*\shell\CapsWriterTranscribe" /f >nul

echo.
echo [成功] 右键菜单已彻底移除!
echo.
pause
goto MENU

📖 代码逻辑详解 (小白教程 / 博客素材)

如果你要写博客,可以将这段脚本的技术原理拆解如下,显得非常硬核且专业:

1. 自动获取管理员权限 (Admin Rights)

脚本开头的 :UACPrompt 代码块是一个经典的 Bat 技巧。

  • 原理:注册表 HKEY_CLASSES_ROOT 是系统敏感区域,普通用户无法写入。

  • 逻辑:脚本启动时会检测当前是否为管理员,如果不是,它会创建一个临时的 VBScript 脚本来重新以“管理员身份”调用自己。这保证了用户双击打开也能正常工作,不会报错“拒绝访问”。

2. 动态路径获取 (%~dp0) —— 这是最关键的点

在之前的 .reg 文件中,我们把路径写死了(D:\Video...)。但在这个 .bat 脚本中,我使用了 %~dp0 变量。

  • 含义%~dp0 代表“当前批处理文件所在的盘符和路径”。

  • 优势:这意味着你可以把整个 CapsWriter 文件夹移动到电脑的任何地方(比如移动到 E 盘,或者复制到 U 盘给别人用),只要运行一次这个 Bat 脚本,路径就会自动识别为当前新路径。你的工具变成了真正的“绿色便携版”!

3. 注册表操作命令 (reg add / reg delete)

我们抛弃了 .reg 文件,直接用命令行操作注册表,这样更干净。

  • 安装 (Add)

    • /ve:设置默认值(菜单显示的文字)。

    • /v "Icon":设置图标。

    • \"%%1\":这里有两个 %。因为在 Bat 脚本中 % 是转义字符,所以要表示注册表里需要的 %1(代表被选中的文件),必须写成 %%1123

  • 卸载 (Delete)456

    • reg delete ... /f/f 表示强制删除,不弹出“你确定吗”的询问,实现一键清理。789


📝 博客总结建议101112

在你的技术博客中,你可以这样总结这套**“终极方案”**:131415

版本迭代总结:161718

  • V1.0 (纯手工):每次都要手动开服务端、客户端,繁琐。192021

  • V2.0 (AHK + Reg):利用 AHK 自动化流程,通过 .reg 文件导入右键菜单。缺点是路径写死,且无法方便移除菜单。222324

  • V3.0 (AHK + Bat)最终完美版2526

    • 使用 AHK 编译出的 27EXE 处理复杂逻辑28(等待服务启动)。

    • 使用 Bat 脚本管理注册表,实现了动态路径识别(文件夹随便搬家都不怕)。

    • 提供了菜单管理面板,用的时候开启,觉得右键太乱随时一键删除,把选择权还给用户。

现在,你拥有了一个既能自动干活,又能随时“隐身”的强大工具了!


进一步升级

这是一个非常棒的进阶玩法!结合 ContextSearchyt-dlp,你可以直接在网页链接上右键,实现“下载+转录”的一条龙服务。

根据你提供的路径和原教程逻辑 1111,我已经为你修改并优化了代码。

🚀 修改后的 ContextSearch 代码

请直接复制下面的代码块,粘贴到 ContextSearch 的 “命令” (Command) 输入框中:

DOS

tasklist /FI "IMAGENAME eq start_server.exe" 2>NUL | find /I /N "start_server.exe" >NUL || explorer "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_server.exe" & start "" cmd /c yt-dlp --output "%USERPROFILE%\Downloads\Video\%(title)s.%(ext)s" --merge-output-format mp4 --no-mtime --exec "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe" "{searchTerms}"

🔍 代码逻辑像素级拆解 (Detailed Breakdown)

这段代码虽然看着长,其实逻辑非常清晰,由 三个部分 组成,中间用 ||& 连接。

第一部分:智能启动服务端

DOS

tasklist /FI "IMAGENAME eq start_server.exe" 2>NUL | find /I /N "start_server.exe" >NUL || explorer "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_server.exe"
  • tasklist ... | find ...: 这一串命令在问电脑:“现在有没有一个叫 start_server.exe 的程序在运行?”

  • || (逻辑或): 意思是 “如果前面的命令失败了(没找到进程),那么就执行后面的”

  • explorer "D:\...\start_server.exe": 如果没找到服务,就根据你的路径启动服务端。

    • 注释:这里确保了服务端只会被启动一次,不会重复打开。

第二部分:调用 yt-dlp 下载视频

DOS

& start "" cmd /c yt-dlp --output "%USERPROFILE%\Downloads\Video\%(title)s.%(ext)s" --merge-output-format mp4 --no-mtime
  • &: 连接符,不管前面成不成功,都继续执行这一步。

  • start "" cmd /c: 打开一个新的黑色命令行窗口来执行下载任务(方便你看到下载进度)。

  • yt-dlp: 调用下载神器(你已经配置了环境变量,所以直接写名字就行)。

  • --output "%USERPROFILE%\Downloads\Video\...":

    • 优化点:原教程用了 ../../../ 这种相对路径,容易出错。我改成了 %USERPROFILE%,这样视频会稳定下载到你电脑的 “下载/Video” 文件夹里。

  • --merge-output-format mp4: 强制将视频合并为 mp4 格式,方便 CapsWriter 读取。

第三部分:下载完自动转录 (关键!)

DOS

--exec "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe" "{searchTerms}"
  • --exec: 这是 yt-dlp 的高级参数。意思是:“等文件下载完成后,执行后面的程序”

  • "D:\...\start_client.exe": 启动你的 CapsWriter 客户端。

  • "{searchTerms}": 这里的逻辑是 yt-dlp 会把 下载好的视频文件路径 自动传递给 start_client.exe

    • 注意:ContextSearch 会把 {searchTerms} 替换为你选中的网页链接,传给 yt-dlp 下载;下载完后,yt-dlp 会自动把本地文件路径传给 CapsWriter。


⚙️ 配置图示

参照你的截图,请确保以下设置正确:

  1. 名称: 随便填,例如 下载并转文字

  2. 命令: 粘贴上面那段长代码。

  3. 链接 (Link): 必须勾选(因为你是对链接进行操作)。

  4. 页面 (Page): 可以勾选(对当前页面链接操作)。

  5. 选中内容 (Selection): 不要勾选(除非你选中的是文本链接)。

💡 一个小建议

由于你的服务端启动需要 35秒 左右,而 yt-dlp 下载短视频可能只需要 5-10秒

  • 潜在问题:如果视频下载太快,服务端还没完全加载好,客户端就被 yt-dlp 唤起了,可能会导致连接失败。

  • 解决方法:第一次使用时,建议先手动开启服务端,或者找个长一点的视频下载,让服务端有足够的时间“热身”。一旦服务端在后台跑起来了(热启动状态),这个流程就是秒开的!


安装context-search重要通信工具

这是一个非常关键的步骤。你遇到的报错 Messenger app is not connected 正是因为缺少了这个“原生应用” (Native App)

ContextSearch 插件本身运行在浏览器的“沙盒”里,为了安全,它不能直接去指挥你的 Windows 系统(比如运行 yt-dlp 或打开软件)。你找到的这个 GitHub 项目正是那个“桥梁”程序,它负责把浏览器的指令传给 Windows。

由于你找到的是官方源码仓库,安装步骤稍微需要一点动手能力(因为它依赖 Python)。请按照以下步骤操作:

方法一:官方源码安装(需要安装 Python)

因为这个项目的官方版本是基于 Python 编写的,你需要先确保电脑里有 Python 环境。

第一步:安装 Python (如果电脑里没有)

  1. 去 Python 官网下载最新的 Python 安装包。

  2. 【至关重要】 在安装界面的第一页,务必勾选 "Add Python to PATH" (添加 Python 到环境变量)。如果不选这个,后面会报错。

  3. 一路点 "Install" 完成安装。

第二步:下载并安装 Native App

  1. 在你提供的 GitHub 页面上,点击绿色的 "Code" 按钮,选择 "Download ZIP"

  2. 解压下载好的压缩包到任意位置(建议放在一个不会轻易删除的地方,比如 D 盘的一个固定文件夹)。

  3. 进入解压后的文件夹。

  4. 在文件夹空白处 右键 -> 选择 "在终端中打开" (Open in Terminal) 或者 "Git Bash Here"

  5. 在黑色的窗口里输入以下命令并回车:

    Bash

    python install.py
    

    (如果提示 python 不是命令,试着输入 py install.py)

  6. 屏幕上应该会显示 "Native App installed" 或类似的成功提示。

第三步:重启浏览器

  1. 彻底关闭 你的浏览器(包括后台)。

  2. 重新打开浏览器,进入 ContextSearch 的设置页面。

  3. 点击右下角的 Test 按钮,那个红色的 Messenger app is not connected 应该就会消失了。


方法二:检查是否有“懒人包”(推荐)

你提到之前是看“阿虚同学”的教程操作的。通常这种整合教程里,作者为了方便小白,会把这个 Native App 打包成一个不需要 Python 的 .bat 文件

建议你回过头去检查一下阿虚同学提供的下载包(比如叫 ContextSearchNativeHost 的文件夹):

  1. 找找看里面有没有类似 install_host.bat安装.bat 的文件。

  2. 如果有,直接双击运行它。

  3. 这通常会自动完成注册,比你自己去 GitHub 下载源码安装要简单得多,且不容易出错。

总结

你现在的配置逻辑(代码)是完全正确的,只要把这个“桥梁”安装好,整个流程(右键 -> 下载 -> 转录)就能立刻跑通!

这里有一个关于 Context Menu Search 扩展使用的基础教程视频,虽然它主要讲的是搜索功能,但能帮你理解这个扩展的工作逻辑:

Context Menu Search Chrome Extension Tutorial

(该视频演示了 ContextSearch 的基本配置逻辑,当你安装好 Native App 后,你的高级脚本功能将像视频中的基础搜索一样顺畅运行。)


一个小bug,在页面上自动检索(无需选中URL)

这是一个非常经典的**“空参数导致闪退”问题。恭喜你,最难的配置部分(ID连接)你已经搞定了,现在只需要改动一个“变量名”**就能完美运行!

❌ 为什么会“闪一下黑框就没了”?

因为你的代码最后用的是 "{searchTerms}"。

这个变量的意思是:“获取我在网页上选中的文字”。

  • 你的测试操作:你在输入框里手动粘贴了链接,所以 {searchTerms} 有值,脚本能跑通。

  • 你的实际操作:你在看视频时,直接点了这个工具,但你并没有用鼠标“选中”任何文字或链接

    • 结果:脚本传给 yt-dlp 的是一个空值

    • 后果:yt-dlp 不知道要下载什么,瞬间报错退出,所以黑框一闪而过。


✅ 解决方法:把“选中文字”改成“当前网址”

你需要告诉插件:“不管我有没有选中文字,请直接把当前网页的 URL 地址传给下载器。”

请按以下步骤修改代码:

  1. 打开 ContextSearch 的设置界面。

  2. 找到你的“一键视频转文字”脚本。

  3. Command (命令) 编辑框里,拉到最末尾

  4. 找到 "{searchTerms}",把它删掉,替换为 "%url" (注意保留双引号,把大括号换成百分号)。

修改后的完整代码如下(请直接复制替换):

DOS

tasklist /FI "IMAGENAME eq start_server.exe" 2>NUL | find /I /N "start_server.exe" >NUL || explorer "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_server.exe" & start "" cmd /c yt-dlp --output "%USERPROFILE%\Downloads\Video\%(title)s.%(ext)s" --merge-output-format mp4 --no-mtime --exec "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe" "%url%"

注意:部分 ContextSearch 版本可能需要写成 %url 或者 "%url"。建议先尝试 "%url%""%url"。根据经验,"%url" 是最通用的写法。

⚠️ 保险起见,如果 "%url" 不起作用,请尝试 "%u"


💡 进阶:如何更优雅地使用?

修改代码后,操作逻辑就变了:

  • 以前 (逻辑):必须鼠标反蓝选中一个链接文本 -> 右键 -> 运行。

  • 现在 (逻辑):只要你打开了 B 站视频页面 -> 在页面任意空白处右键 (或者点那个浮动图标) -> 运行。它会自动抓取你浏览器地址栏里的链接进行下载。

检查一下你的 Checkbox 设置:

确保你的设置里:

  • [x] Page (页面)一定要勾选(这代表允许在页面空白处触发)。

  • [x] Link (链接):建议勾选(允许你在视频封面上右键直接下载,不用点进去)。

  • [ ] Selection (选中内容):可以取消勾选(避免混淆)。

再次去 B 站试试吧,这次肯定能弹出来!


PLUS:无法下载youtube视频(代理设置问题)

从你提供的截图来看,yt-dlp 的运行卡在了:

[youtube] xvHW08aexgA: Downloading webpage

这意味着 yt-dlp 正在尝试连接 YouTube 服务器,但没有收到回应(或者连接被阻断了)。

这通常是因为:命令行工具(CMD)默认是不走你的“科学上网”代理软件的。即使你的浏览器能看 YouTube,CMD 里的 yt-dlp 也是连不通的,除非你显式地告诉它走代理。

解决方法:加上 --proxy 参数

你需要知道你本机代理软件的端口号

  1. 找到端口号:

    • 如果你用的是 Clash 系列,默认 HTTP 端口通常是 7890

    • 如果你用的是 v2rayN,默认通常是 10809

    • (你可以在你的软件设置里看到“本地代理端口”或“HTTP 端口”)。

  2. 修改命令:

    在你的命令里加上 --proxy http://127.0.0.1:端口号。

    假设你的端口是 7890,正确的命令应该是:

    Bash

    yt-dlp --proxy http://127.0.0.1:7890 https://youtu.be/xvHW08aexgA
    

    (请把上面的 7890 换成你实际的端口号)


其他可能的原因(如果加了代理还不行)

  1. yt-dlp 版本过老:

    YouTube 经常改接口,旧版工具无法解析。

    请运行以下命令更新到最新版:

    Bash

    yt-dlp -U
    
  2. URL 参数干扰:

    虽然一般不影响,但你的链接后面带了一长串 ?si=...(这是 YouTube 的分享追踪码)。

    建议删掉问号及后面的内容,只保留视频 ID:

    https://youtu.be/xvHW08aexgA

总结:先试着加上 --proxy 参数,99% 是这个问题。


评论