Administrator
发布于 2025-12-28 / 11 阅读
0
0

18. 一键语音+视频转文字!本地、在线视频均支持,离线模型免费无限可用

根据“ContextSearch + yt-dlp + CapsWriter Offline”这一特定的工具组合,这是一套非常经典的在线视频本地化转文字方案。

这套方案的核心逻辑是:

  1. ContextSearch (浏览器扩展):作为触发器,获取当前视频的 URL。

  2. yt-dlp (命令行工具):作为下载器,将视频的音频部分下载到本地。

  3. CapsWriter Offline (语音转文字工具):作为转写引擎,将下载好的音频文件转换为文字。

下面为您复原并搭建这套解决方案,包含所需的核心 Python 脚本配置步骤


准备工作

请确保您已安装以下软件:

  1. ContextSearch web-ext:Chrome 或 Edge 浏览器扩展。

  2. yt-dlp:下载 yt-dlp.exe Release yt-dlp 2025.12.08 · yt-dlp/yt-dlp 并将其所在文件夹添加到系统的环境变量 PATH 中(确保在 CMD 中输入 yt-dlp 能运行)。

  3. CapsWriter Offline:下载并解压好该软件(通常由 B站 UP 主“也就是罗大”或 GitHub 开发者 HaujetZhao 提供),确保它能正常运行并识别语音。

  4. 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

  1. 打开浏览器的 ContextSearch web-ext 设置页面。

  2. 找到 Search Engines (搜索引擎) 设置。

  3. 添加一个新的搜索引擎:

    • Name (名称): 视频转文字 (或 Video2Text)

    • URL Template (URL 模板): http://127.0.0.1:5000/transcribe?url=%s

    • 解释:%s 会被扩展替换为你选中的链接或当前页面的 URL。

  4. 保存设置。

第三步:配置 CapsWriter Offline

  1. 打开 CapsWriter Offline。

  2. 确保它的文件转写功能已开启。

  3. 确认它的快捷键设置(默认通常是 CapsLock 长按,或者双击,具体取决于版本)。

  4. 注意:CapsWriter Offline 的机制通常是检测到剪贴板里有音频文件,按下快捷键后就会开始转写并输入文字。


使用流程

  1. 启动服务:双击运行你的 server.py(或者在命令行运行 python server.py),保持黑色窗口开启。

  2. 获取链接

    • 在浏览器中看到想转文字的视频(如 B站、YouTube)。

    • 右键点击视频链接(或者在页面空白处右键,使用 ContextSearch 获取当前页面 URL)。

    • 在 ContextSearch 菜单中选择你添加的 “视频转文字”

  3. 等待下载

    • 浏览器可能会弹出一个新标签页显示“收到任务...”。

    • 观察 server.py 的黑窗口,等待显示“下载完成”。

  4. 一键转写

    • 当脚本提示下载完成且文件已复制到剪贴板后。

    • 切换到你想粘贴文字的地方(比如一个空的记事本)。

    • 按下 CapsWriter Offline 的转写快捷键(如长按 CapsLock)。

    • 文字就会自动打出来了。

进阶优化(可选)

如果您希望实现完全“一键”自动化(无需手动按 CapsLock),可以在 server.py 中引入 keyboardpyautogui 库来模拟按键。

修改 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}": 这是浏览器插件传进来的参数,即你要下载的网页/视频链接。


总结:整个流程是怎样的?

当你点击这个按钮时,电脑按顺序做了这几件事:

  1. 看一眼后台有没有 start_server.exe(CapsWriter 的服务端)在跑。

  2. 如果没跑,就去 C:\Portable\CapsWriter\ 把名为 start_server.exe 的程序打开。

  3. 启动 yt-dlp 开始下载你选中的视频链接。

  4. 视频下载保存Downloads/Video 文件夹(路径取决于相对位置)。

  5. 下载一旦完成,立刻命令 start_client.exe 对刚才下载的文件进行处理(也就是开始转录生成字幕)。

💡 潜在的问题点(调试建议)

基于你之前遇到的“闪退”问题,这段代码有几个隐患:

  1. yt-dlp 路径问题:代码直接写了 yt-dlp,这意味着你的电脑环境变量里必须已经配置好了 yt-dlp。如果没有配置,这步会直接报错退出。建议改为绝对路径,例如 "C:\Tools\yt-dlp.exe"

  2. 相对路径风险../../../Downloads/Video/ 这种写法很不稳定。浏览器插件调用 CMD 时,初始目录可能是浏览器的安装目录(如 Chrome 的 Application 目录)。往上翻三层级不一定能找到 Downloads

    • 建议:改成绝对路径,例如 D:\Downloads\Video\%(title)s.%(ext)s

  3. 调试无法看到:因为用了 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}"

🔧 我做了哪些修改?

  1. 服务端路径

    • 原代码:C:\Portable\CapsWriter\start_server.exe

    • 修改后D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_server.exe

    • 作用:确保能正确唤醒 CapsWriter 的服务端。

  2. 下载保存路径

    • 原代码:../../../Downloads/Video/... (相对路径,容易出错)

    • 修改后D:\视频下载\%(title)s.%(ext)s

    • 作用:强制指定下载到 D 盘的“视频下载”文件夹,不再迷路。

  3. 客户端调用路径

    • 原代码:C:\Portable\CapsWriter\start_client.exe

    • 修改后D:\Video-Transcribe\CapsWriter-Offline-Windows-64bit\start_client.exe

    • 作用:确保下载完视频后,能正确把文件传给客户端进行转录。

  4. 防闪退设置

    • 原代码: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编译器(用于脚本自动化环境支持),

AutoHotkey


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

AutoTranscribe.exe

ManageMenu.bat

SourceScript.ahk

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


下载付费影片:yt-dlp支持cookie导入

yt-dlp 支持 Cookie 导入是它最强大的功能之一,主要用于解决以下问题:

  1. 下载会员/Premium 专属视频(前提是你账号买了会员)。

  2. 绕过年龄限制(Age-gated content)。

  3. 解决“需要登录才能观看”的限速或画质限制(例如 B站的 1080p+ 画质)。

目前有两种主要方式,推荐优先使用 方法一


方法一:直接从浏览器读取(最推荐,最简单)

这是 yt-dlp 相比老旧工具的一大优势。它不需要你手动导出文件,而是直接读取你电脑上浏览器的 Cookie 数据库。

命令参数:

--cookies-from-browser [BROWSER]

支持的浏览器代号:

chrome, firefox, edge, opera, brave, vivaldi, safari 等。

使用步骤:

  1. 在浏览器(比如 Chrome)中登录视频网站(比如 YouTube 或 Bilibili)。

  2. 关键点: 建议先关闭该浏览器(尤其是 Windows 下 Chrome 会锁定数据库文件,导致读取失败)。

  3. 在命令行输入:

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 文件(最稳定,适合服务器/脚本)

如果你在服务器上运行(没有浏览器),或者方法一报错(如数据库被锁定),则需要使用此方法。

步骤:

  1. 安装浏览器插件:

    你需要一个能将 Cookie 导出为 Netscape HTTP Cookie File 格式的插件。

    • 推荐插件: Get cookies.txt LOCALLY (Chrome/Edge/Firefox 都有)。

    • 注意:不要随便用不知名的 Cookie 插件,有盗号风险。

  2. 导出文件:

    • 在浏览器中打开视频网站并登录。

    • 点击插件图标,选择 "Export",将文件保存为 cookies.txt

    • 将这个文件放到你运行 yt-dlp 的同一目录下。

  3. 运行命令:

Bash

yt-dlp --cookies cookies.txt "视频链接"

方法三:写入配置文件(一劳永逸)

如果你不想每次都输入 --cookies...,可以将配置写入 yt-dlp 的配置文件中。

  1. yt-dlp.exe 同级目录下创建一个名为 yt-dlp.conf (Windows) 或 config (Linux/Mac) 的文本文件。

  2. 在里面写入一行:

Plaintext

# 方案 A:自动读取 Chrome
--cookies-from-browser chrome

# 或者 方案 B:读取本地文件
# --cookies cookies.txt

这样以后你只需要输入 yt-dlp "链接",它就会自动带上 Cookie。


⚠️ 常见问题与注意事项

  1. B站下载特别注意:

    B站的 Cookie 经常变动。如果你发现下载速度慢或者画质只有 480p,说明 Cookie 过期了,需要重新在浏览器刷新页面(方法一)或重新导出文件(方法二)。

  2. 安全警告:

    绝对不要把你的 cookies.txt 发给别人或上传到公开代码库!拥有这个文件等于拥有了你的账号登录权限。

  3. Permission denied / Database locked 错误:

    如果使用方法一出现这类错误,说明浏览器正在占用 Cookie 文件。请完全退出浏览器(右键任务栏图标退出)后再试。

下一步建议

考虑到你之前提到正在做 GUI 项目,如果你打算把 yt-dlp 集成到你的 Python 脚本中,我可以给你一段 Python 代码示例,展示如何通过 yt_dlp 库(Python wrapper)直接传递 cookies 参数,而不是通过命令行调用。你需要这个代码片段吗?


评论