根据“ContextSearch + yt-dlp + CapsWriter Offline”这一特定的工具组合,这是一套非常经典的在线视频本地化转文字方案。
这套方案的核心逻辑是:
ContextSearch (浏览器扩展):作为触发器,获取当前视频的 URL。
yt-dlp (命令行工具):作为下载器,将视频的音频部分下载到本地。
CapsWriter Offline (语音转文字工具):作为转写引擎,将下载好的音频文件转换为文字。
下面为您复原并搭建这套解决方案,包含所需的核心 Python 脚本和配置步骤。
准备工作
请确保您已安装以下软件:
ContextSearch web-ext:Chrome 或 Edge 浏览器扩展。
yt-dlp:下载
yt-dlp.exeRelease yt-dlp 2025.12.08 · yt-dlp/yt-dlp 并将其所在文件夹添加到系统的环境变量PATH中(确保在 CMD 中输入yt-dlp能运行)。CapsWriter Offline:下载并解压好该软件(通常由 B站 UP 主“也就是罗大”或 GitHub 开发者 HaujetZhao 提供),确保它能正常运行并识别语音。
Python:安装 Python 3.x,并安装必要的库(用于搭建本地服务监听浏览器请求)。
核心实现步骤
我们将搭建一个轻量级的 Python 本地服务器,它接收浏览器传来的 URL,调用 yt-dlp 下载音频,然后通知 CapsWriter Offline 进行转写。
第一步:编写 Python 脚本 (Glue Code) 强烈推荐用AHK这种轻量脚本工具,而非python,见文末
在本地创建一个文件夹(例如 D:\VideoTranscribe),在其中创建一个名为 server.py 的文件。
你需要安装 Python 依赖:
Bash
pip install flask yt-dlp pyperclip pywin32注:pyperclip 用于复制文本,pywin32 用于将文件复制到剪贴板(这是 CapsWriter Offline 识别文件的关键)。
server.py 代码如下:
Python
import os
import subprocess
import time
from flask import Flask, request
import win32clipboard
from ctypes import *
app = Flask(__name__)
# 配置下载目录和文件名
DOWNLOAD_DIR = os.path.dirname(os.path.abspath(__file__))
AUDIO_FILENAME = "temp_audio.wav"
AUDIO_PATH = os.path.join(DOWNLOAD_DIR, AUDIO_FILENAME)
# 辅助函数:将文件复制到剪贴板
# CapsWriter Offline 通常通过识别剪贴板中的音频文件来进行转写
class DROPFILES(Structure):
_fields_ = [("pFiles", c_uint),
("pt", c_long),
("fNC", c_int),
("fWide", c_bool)]
def copy_file_to_clipboard(filepath):
pDropFiles = DROPFILES()
pDropFiles.pFiles = sizeof(DROPFILES)
pDropFiles.fWide = True
mate = filepath + "\0\0"
dropfiles = bytes(pDropFiles) + mate.encode("utf-16le")
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32clipboard.CF_HDROP, dropfiles)
win32clipboard.CloseClipboard()
print(f"文件已复制到剪贴板: {filepath}")
@app.route('/transcribe')
def transcribe():
video_url = request.args.get('url')
if not video_url:
return "错误:未提供 URL", 400
print(f"收到任务,正在下载: {video_url}")
# 1. 清理旧文件
if os.path.exists(AUDIO_PATH):
try:
os.remove(AUDIO_PATH)
except:
pass
# 2. 调用 yt-dlp 下载音频 (转为 wav 格式以确保兼容性)
# -x: 提取音频
# --audio-format wav: 指定格式
# -o: 指定输出文件名
cmd = [
"yt-dlp",
"-x", "--audio-format", "wav",
"-o", AUDIO_PATH,
video_url
]
try:
subprocess.run(cmd, check=True)
except subprocess.CalledProcessError:
return "下载失败,请检查 URL 或网络", 500
# 3. 将文件路径复制到剪贴板
if os.path.exists(AUDIO_PATH):
copy_file_to_clipboard(AUDIO_PATH)
# 4. 提示用户或尝试自动触发(可选)
# CapsWriter Offline 通常需要你按下设定好的快捷键(如 CapsLock)来处理剪贴板中的文件
# 如果你想全自动,可以使用 pyautogui 模拟按键,但建议手动按键以防误触
# import pyautogui
# pyautogui.press('capslock')
return f"下载完成!音频已复制。请按下 CapsWriter 快捷键开始转写。", 200
else:
return "文件未生成", 500
if __name__ == '__main__':
print("服务已启动,监听端口 5000...")
app.run(port=5000)
第二步:配置 ContextSearch web-ext
打开浏览器的 ContextSearch web-ext 设置页面。
找到 Search Engines (搜索引擎) 设置。
添加一个新的搜索引擎:
Name (名称):
视频转文字(或 Video2Text)URL Template (URL 模板):
http://127.0.0.1:5000/transcribe?url=%s解释:
%s会被扩展替换为你选中的链接或当前页面的 URL。
保存设置。
第三步:配置 CapsWriter Offline
打开 CapsWriter Offline。


确保它的文件转写功能已开启。
确认它的快捷键设置(默认通常是
CapsLock长按,或者双击,具体取决于版本)。注意:CapsWriter Offline 的机制通常是检测到剪贴板里有音频文件,按下快捷键后就会开始转写并输入文字。

使用流程
启动服务:双击运行你的
server.py(或者在命令行运行python server.py),保持黑色窗口开启。获取链接:
在浏览器中看到想转文字的视频(如 B站、YouTube)。
右键点击视频链接(或者在页面空白处右键,使用 ContextSearch 获取当前页面 URL)。
在 ContextSearch 菜单中选择你添加的 “视频转文字”。
等待下载:
浏览器可能会弹出一个新标签页显示“收到任务...”。
观察
server.py的黑窗口,等待显示“下载完成”。
一键转写:
当脚本提示下载完成且文件已复制到剪贴板后。
切换到你想粘贴文字的地方(比如一个空的记事本)。
按下 CapsWriter Offline 的转写快捷键(如长按 CapsLock)。
文字就会自动打出来了。
进阶优化(可选)
如果您希望实现完全“一键”自动化(无需手动按 CapsLock),可以在 server.py 中引入 keyboard 或 pyautogui 库来模拟按键。
修改 server.py 的最后部分:
Python
import pyautogui
# ... 在 copy_file_to_clipboard(AUDIO_PATH) 之后 ...
# 模拟按下 CapsLock 键(根据你的 CapsWriter 设置调整)
# 比如 CapsWriter 设置为“按下 CapsLock”触发:
pyautogui.press('capslock')
# 或者如果是长按:
# pyautogui.keyDown('capslock')
# time.sleep(0.5)
# pyautogui.keyUp('capslock')
总结:这套方案利用 Python 作为一个“中转站”,连接了浏览器(信息源)、yt-dlp(下载器)和 CapsWriter(转写器),实现了本地化、免费且隐私安全的视频转文字工作流。
Context-Search配置

’这段代码是一个非常典型的自动化工作流脚本,它的核心目的是:自动检查转录服务是否开启 -> 下载视频 -> 下载完成后自动调用转录客户端进行处理。
它可以分为两个主要部分来解读:
第一部分:服务检查与启动 (Server Check)
代码段
tasklist /FI "IMAGENAME eq start_server.exe" 2>NUL | find /I /N "start_server.exe" >NUL || explorer "C:\Portable\CapsWriter\start_server.exe"
含义:“检查
start_server.exe是否正在运行?如果没有运行,就启动它。”详细拆解:
tasklist ...: 列出当前所有进程。| find ...: 在进程列表中查找名为start_server.exe的进程。||: 这是一个逻辑“或者”操作符。意思是:如果前面的命令失败了(没找到进程),才执行后面的命令。explorer "...": 如果没找到进程,就通过资源管理器启动位于C:\Portable\CapsWriter\下的服务端程序。
第二部分:下载与后续处理 (Download & Execute)
代码段
& start "" cmd /c yt-dlp --output "../../../Downloads/Video/%(title)s.%(ext)s" --merge-output-format mp4 --no-mtime --exec "C:\Portable\CapsWriter\start_client.exe" "{searchTerms}"
含义:“不管上面服务检查结果如何,接着开启一个新窗口,用
yt-dlp下载视频,存为 mp4,下载完后立刻运行转录客户端。”详细拆解:
&: 连接符,表示执行完第一部分后,紧接着执行这一部分。start "" cmd /c: 启动一个新的 CMD 窗口执行命令,执行完后自动关闭(这就是你之前遇到“闪退”的原因)。yt-dlp: 调用著名的视频下载工具。--output "../../../Downloads/Video/...": 指定下载保存路径。注意:这里用的是相对路径
../,这非常依赖于当前命令的“执行位置”。如果位置不对,视频可能会下载到奇怪的地方,或者报错找不到路径。
--merge-output-format mp4: 强制将视频合并/转换为 MP4 格式。--exec "C:\...\start_client.exe": 这是最关键的一步。它的意思是:当视频下载成功后,把下载好的视频文件作为参数,传递给start_client.exe运行。这通常用于触发 CapsWriter 进行离线语音转文字。"{searchTerms}": 这是浏览器插件传进来的参数,即你要下载的网页/视频链接。
总结:整个流程是怎样的?
当你点击这个按钮时,电脑按顺序做了这几件事:
看一眼后台有没有
start_server.exe(CapsWriter 的服务端)在跑。如果没跑,就去
C:\Portable\CapsWriter\把名为start_server.exe的程序打开。启动 yt-dlp 开始下载你选中的视频链接。
视频下载保存到
Downloads/Video文件夹(路径取决于相对位置)。下载一旦完成,立刻命令
start_client.exe对刚才下载的文件进行处理(也就是开始转录生成字幕)。
💡 潜在的问题点(调试建议)
基于你之前遇到的“闪退”问题,这段代码有几个隐患:
yt-dlp 路径问题:代码直接写了
yt-dlp,这意味着你的电脑环境变量里必须已经配置好了 yt-dlp。如果没有配置,这步会直接报错退出。建议改为绝对路径,例如"C:\Tools\yt-dlp.exe"。相对路径风险:
../../../Downloads/Video/这种写法很不稳定。浏览器插件调用 CMD 时,初始目录可能是浏览器的安装目录(如 Chrome 的 Application 目录)。往上翻三层级不一定能找到Downloads。建议:改成绝对路径,例如
D:\Downloads\Video\%(title)s.%(ext)s。
调试无法看到:因为用了
cmd /c,一旦出错(比如路径不对、yt-dlp 没找到),窗口瞬间消失。建议:调试时把
cmd /c改成cmd /k,这样窗口会留住,你就能看到是卡在下载那一步,还是卡在最后调起 start_client 那一步。
修改定制我的路径
这是根据你的路径要求修改后的完整代码。
为了防止你再次遇到“窗口闪一下就没了”无法调试的问题,我特意将代码中的 /c 改为了 /k(执行完保留窗口)。等你确认一切运行正常后,可以再改回 /c。
✅ 修改后的代码(直接复制粘贴)
代码段
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 /k yt-dlp --output "D:\视频下载\%(title)s.%(ext)s" --merge-output-format mp4 --no-mtime --exec "D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe" "{searchTerms}"
🔧 我做了哪些修改?
服务端路径:
原代码:
C:\Portable\CapsWriter\start_server.exe修改后:
D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_server.exe作用:确保能正确唤醒 CapsWriter 的服务端。
下载保存路径:
原代码:
../../../Downloads/Video/...(相对路径,容易出错)修改后:
D:\视频下载\%(title)s.%(ext)s作用:强制指定下载到 D 盘的“视频下载”文件夹,不再迷路。
客户端调用路径:
原代码:
C:\Portable\CapsWriter\start_client.exe修改后:
D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe作用:确保下载完视频后,能正确把文件传给客户端进行转录。
防闪退设置:
原代码:
cmd /c(跑完即关)修改后:
cmd /k(跑完保留)作用:如果出错,黑色窗口会停留在屏幕上,你能看到报错信息。
⚠️ 重要提示:关于 yt-dlp 的位置
这段代码里直接使用了 yt-dlp 这个命令。这前提是你的电脑系统变量里已经配置了它,或者它就在 System32 里。
如果运行后提示 “'yt-dlp' 不是内部或外部命令...”,你需要把代码里的 yt-dlp 也改成它的绝对路径。
通常在 CapsWriter 的压缩包里会自带 tools 文件夹放 yt-dlp。如果它在 D:\Video-Transcribe\tools\yt-dlp.exe,那么代码中间部分应该改成:
... & start "" cmd /k "D:\Video-Transcribe\tools\yt-dlp.exe" --output ...
建议先试用上面的代码,如果报错找不到命令,请告诉我你 yt-dlp.exe 文件的具体位置
CapsWriter 代码修改部分~~
记得首先安装:AHK2.0编译器(用于脚本自动化环境支持),

这三个文件放在CapsWriter的目录下~~

运行 ManageMenu.bat 安装右键,就会出现

下载付费影片:yt-dlp支持cookie导入
yt-dlp 支持 Cookie 导入是它最强大的功能之一,主要用于解决以下问题:
下载会员/Premium 专属视频(前提是你账号买了会员)。
绕过年龄限制(Age-gated content)。
解决“需要登录才能观看”的限速或画质限制(例如 B站的 1080p+ 画质)。
目前有两种主要方式,推荐优先使用 方法一。
方法一:直接从浏览器读取(最推荐,最简单)
这是 yt-dlp 相比老旧工具的一大优势。它不需要你手动导出文件,而是直接读取你电脑上浏览器的 Cookie 数据库。
命令参数:
--cookies-from-browser [BROWSER]
支持的浏览器代号:
chrome, firefox, edge, opera, brave, vivaldi, safari 等。
使用步骤:
在浏览器(比如 Chrome)中登录视频网站(比如 YouTube 或 Bilibili)。
关键点: 建议先关闭该浏览器(尤其是 Windows 下 Chrome 会锁定数据库文件,导致读取失败)。
在命令行输入:
Bash
# 从 Chrome 读取 Cookie 并下载
yt-dlp --cookies-from-browser chrome "视频链接"
# 从 Edge 读取 Cookie 并下载
yt-dlp --cookies-from-browser edge "视频链接"
进阶技巧(指定配置):
如果你有多个浏览器用户配置(Profile),可以指定路径(通常不需要,除非你不用默认用户):
Bash
yt-dlp --cookies-from-browser chrome:Default "视频链接"
方法二:手动导出 cookies.txt 文件(最稳定,适合服务器/脚本)
如果你在服务器上运行(没有浏览器),或者方法一报错(如数据库被锁定),则需要使用此方法。
步骤:
安装浏览器插件:
你需要一个能将 Cookie 导出为 Netscape HTTP Cookie File 格式的插件。
推荐插件: Get cookies.txt LOCALLY (Chrome/Edge/Firefox 都有)。
注意:不要随便用不知名的 Cookie 插件,有盗号风险。
导出文件:
在浏览器中打开视频网站并登录。
点击插件图标,选择 "Export",将文件保存为
cookies.txt。将这个文件放到你运行
yt-dlp的同一目录下。
运行命令:
Bash
yt-dlp --cookies cookies.txt "视频链接"
方法三:写入配置文件(一劳永逸)
如果你不想每次都输入 --cookies...,可以将配置写入 yt-dlp 的配置文件中。
在
yt-dlp.exe同级目录下创建一个名为yt-dlp.conf(Windows) 或config(Linux/Mac) 的文本文件。在里面写入一行:
Plaintext
# 方案 A:自动读取 Chrome
--cookies-from-browser chrome
# 或者 方案 B:读取本地文件
# --cookies cookies.txt
这样以后你只需要输入 yt-dlp "链接",它就会自动带上 Cookie。
⚠️ 常见问题与注意事项
B站下载特别注意:
B站的 Cookie 经常变动。如果你发现下载速度慢或者画质只有 480p,说明 Cookie 过期了,需要重新在浏览器刷新页面(方法一)或重新导出文件(方法二)。
安全警告:
绝对不要把你的 cookies.txt 发给别人或上传到公开代码库!拥有这个文件等于拥有了你的账号登录权限。
Permission denied / Database locked 错误:
如果使用方法一出现这类错误,说明浏览器正在占用 Cookie 文件。请完全退出浏览器(右键任务栏图标退出)后再试。
下一步建议
考虑到你之前提到正在做 GUI 项目,如果你打算把 yt-dlp 集成到你的 Python 脚本中,我可以给你一段 Python 代码示例,展示如何通过 yt_dlp 库(Python wrapper)直接传递 cookies 参数,而不是通过命令行调用。你需要这个代码片段吗?