无Cookie下载B站视频并语音转文字:基于OpenClaw与faster-whisper的实践
视频内容处理是当前AI应用与自动化工作流中的常见需求,其核心通常涉及音视频的获取与信息提取。从技术原理上看,这需要解决视频源解析、媒体文件处理以及语音识别等关键环节。在工程实践中,通过组合成熟的开源工具链,可以构建高效、轻量的本地化处理流水线。例如,利用公开API实现免认证的视频流获取,结合ffmpeg进行音视频分离,再采用本地部署的语音识别模型如faster-whisper进行转录,能够在保障隐
1. 项目概述:一个无需Cookie的B站视频下载与转录工具
最近在折腾AI智能体(Agent)的时候,发现了一个挺有意思的项目,叫 rrrrrredy/bilibili-video 。简单来说,这是一个为OpenClaw AI Agent设计的技能(Skill),它的核心功能是帮你下载B站的视频,并且能把视频里的语音转成文字。最吸引我的一点是,它整个过程不需要你登录B站,也不需要提供任何Cookie,直接通过公开的API就能搞定。这对于我们这些经常需要处理视频素材、做内容分析或者单纯想离线观看的用户来说,简直太方便了。我自己试了一下,从下载到转录,一条命令就能跑通,非常适合集成到自动化工作流里。如果你也在用OpenClaw,或者对视频内容处理有需求,这个工具值得你花时间了解一下。
这个项目本质上是一个脚本集合,它巧妙地组合了几个成熟的开源工具:用 curl 或类似方式调用B站公开API获取视频流地址,用 ffmpeg 处理音视频分离,最后用 faster-whisper 这个本地化的语音识别模型把音频转成文字。整个流程设计得非常清晰,没有冗余的依赖,跑起来也很轻量。接下来,我就结合自己的使用经验,把这个工具从原理到实操,再到可能遇到的坑,给你掰开揉碎了讲清楚。
2. 核心功能与设计思路拆解
2.1 为什么可以“无Cookie”下载?
这是这个项目第一个值得说道的技术点。通常我们下载B站视频,可能会想到用 yt-dlp 这类工具,但它们往往需要配置Cookie来模拟登录状态,以获取更高清晰度的资源或规避一些限制。这个项目反其道而行之,它瞄准的是B站对未登录用户也开放的“公开API”。
具体来说,B站视频播放页面在加载时,会向一个叫 playurl 的接口请求视频流的CDN地址。这个接口在用户未登录时,依然会返回一个默认清晰度(通常是360P或480P)的视频流地址。 bilibili-video 项目就是通过模拟这个网络请求,直接获取到CDN链接,然后使用 curl 或 wget 进行下载。这样做的好处显而易见:
- 零门槛 :用户无需折腾如何获取和更新Cookie,开箱即用。
- 安全性高 :不涉及用户账户信息,避免了Cookie泄露的风险。
- 稳定性好 :公开接口的变动相对缓慢,且针对未登录用户的服务通常比较稳定。
当然,这种方式的局限性在于,你通常只能下载到较低清晰度的视频(如360P/480P)。对于绝大多数以获取音频内容进行转录为主要目的的场景来说,这个清晰度已经完全足够了,因为音频质量并不会随着视频清晰度降低而显著受损,反而因为文件体积小,下载和处理速度更快。
2.2 工具链选型:为什么是它们?
项目的第二个设计亮点在于其精简而高效的工具链选型。每一个环节的工具都是经过深思熟虑的。
- 下载与列表获取 :项目脚本里可能直接使用
curl调用API,而对于“获取UP主最新视频列表”这个功能,则引入了yt-dlp。这里的选择很聪明。yt-dlp是网络视频下载的瑞士军刀,其--flat-playlist参数可以非常高效、稳定地解析B站UP主空间页面的视频列表,获取BV号等信息。把专业的事情交给专业的工具,避免了重复造轮子去解析复杂的网页结构。 - 音视频处理 :
ffmpeg是毋庸置疑的选择。它是音视频处理领域的标准工具,几乎无所不能。在这里,它负责将下载下来的视频文件中的音频流无损(或指定质量)地提取出来,生成一个适合后续语音识别模型处理的音频文件(如WAV或MP3)。 - 语音转录 :这是核心中的核心。项目选择了
faster-whisper而不是OpenAI官方的Whisper。faster-whisper是Whisper模型的一个重新实现,它使用了CTranslate2作为推理引擎,其最大的优势就是 速度 和 资源占用 。它支持INT8量化,能在CPU上实现较快的推理速度,这对于没有独立GPU的普通用户来说非常友好。同时,它保持了Whisper模型在中英文混合语音识别上的高准确率。
这一套组合拳下来,形成了一个从获取视频地址,到下载,到预处理,再到核心AI识别的完整、高效且轻量的流水线。
2.3 作为OpenClaw Skill的设计哲学
这个项目不仅仅是一组脚本,它被精心打包成了一个 OpenClaw Skill 。这意味着它遵循了OpenClaw智能体的技能开发规范,可以无缝地被OpenClaw Agent调用。其设计哲学体现了AI智能体应用的典型思路:
- 原子化操作 :每一个功能(如下载、转录音频)都被封装成独立的、可被智能体理解和调用的操作。这使得智能体可以灵活地组合这些技能来完成更复杂的任务,比如“找到某个UP主的最新视频,下载并总结其内容”。
- 自然语言接口 :在Skill的描述中,定义了诸如“B站视频下载 BV1xxx”、“b站视频转文字 BV1xxx”这样的自然语言指令。用户可以直接用说话的方式让智能体去执行任务,极大地降低了使用门槛。
- 一体化流水线 :提供的
fetch_video.sh脚本展示了一个“端到端”的最佳实践。用户只需提供一个BV号,脚本就会自动执行下载、提取音频、转录文字的全过程。这既方便了直接使用,也为智能体如何串联多个技能提供了范本。
这种设计让工具的价值超越了“下载器”本身,变成了一个可被AI调用的、具有理解和服务能力的数字模块。
3. 环境准备与详细安装指南
要运行这个项目,你需要准备好基础环境。以下步骤我亲自验证过,能确保你顺利跑起来。
3.1 基础系统依赖安装
这些是项目运行所需的底层命令工具,大部分Linux/macOS系统可能已部分安装,但建议逐一检查。
# 在Ubuntu/Debian系统上,可以使用apt安装
sudo apt update
sudo apt install -y curl ffmpeg python3-pip
# 在macOS上,使用Homebrew安装
brew install curl ffmpeg python
- curl :用于从网络API获取数据或下载文件。它是调用B站公开API的关键。
- ffmpeg :音视频处理的基石。确保安装的版本支持常见的编解码器。
- python3-pip :Python的包管理工具,用于安装后续的Python依赖。
注意 :在某些极其精简的Docker镜像或服务器环境中,
ffmpeg可能需要额外安装编码器库。如果后续音频提取步骤报错,可以尝试安装sudo apt install -y libavcodec-extra。
3.2 Python环境与核心依赖
项目的主要逻辑由Python脚本实现,我们需要安装特定的Python包。
# 确保使用pip3,避免与系统Python2的pip混淆
pip3 install yt-dlp faster-whisper
# 如果想安装特定版本以确保兼容性,可以指定
# pip3 install yt-dlp==2024.04.09 faster-whisper==0.10.0
- yt-dlp :如前所述,用于获取UP主视频列表。它的更新非常频繁,以应对网站改版。
- faster-whisper :本地语音识别模型。第一次运行时,它会自动从Hugging Face下载指定的Whisper模型(默认为
base模型)。请确保网络通畅,且磁盘有足够空间(base模型约几百MB)。
3.3 获取bilibili-video技能
你有两种方式将技能安装到你的OpenClaw环境中。
方法一:通过OpenClaw CLI安装(推荐) 如果你的OpenClaw环境已经配置好,并且CLI工具可用,这是最简洁的方式。
openclaw skill install bilibili-video
这条命令会从默认的技能仓库(通常是GitHub)拉取该技能,并安装到OpenClaw的技能目录下(例如 ~/.openclaw/skills/ )。
方法二:手动Git克隆 如果CLI安装遇到问题,或者你想直接查看源码,可以手动克隆仓库。
# 假设你的OpenClaw技能目录在 ~/.openclaw/skills/
git clone https://github.com/rrrrredy/bilibili-video.git ~/.openclaw/skills/bilibili-video
克隆后,你需要确保技能目录的权限正确,并且OpenClaw Agent有权限读取和执行其中的脚本。
3.4 环境验证
安装完成后,进行一个快速验证,确保主要工具就绪。
# 检查curl和ffmpeg
curl --version | head -1
ffmpeg -version | head -1
# 检查Python包
python3 -c "import yt_dlp; print('yt-dlp version:', yt_dlp.version.__version__)"
python3 -c "from faster_whisper import WhisperModel; print('faster-whisper imported successfully')"
如果以上命令都没有报错,那么基础环境就搭建完成了。
4. 核心使用场景与实操详解
环境准备好了,我们来实战。这个技能主要通过两种方式使用:一是通过OpenClaw Agent用自然语言交互,二是直接调用其底层脚本。这里我们重点讲更通用、更底层的脚本使用方式,这能帮你理解其工作原理,也方便你集成到自己的其他脚本中。
4.1 场景一:下载指定BV号的视频
这是最核心的功能。假设我们要下载BV号是 BV1GJ41187du 的视频。
直接使用项目提供的流水线脚本: 项目根目录下的 scripts/fetch_video.sh 是一个封装好的流水线脚本。你需要先进入技能目录。
cd ~/.openclaw/skills/bilibili-video
bash scripts/fetch_video.sh BV1GJ41187du
这个脚本会依次执行:
- 调用内部方法获取视频的CDN播放地址。
- 使用
curl下载视频文件(通常为.flv或.mp4格式)。 - 使用
ffmpeg从视频中提取音频(默认为.mp3格式)。 - 调用
transcribe.py脚本,使用faster-whisper将音频转录为文本。 执行完毕后,你会在当前目录下找到生成的文件,例如BV1GJ41187du.mp4、BV1GJ41187du.mp3和BV1GJ41187du.txt。
手动分步执行(理解原理): 如果你想更精细地控制每一步,或者脚本某一步出错需要调试,可以手动执行。
# 1. 获取视频信息(这里需要查看脚本内部如何构造API请求,模拟实现)
# 假设脚本里获取到的视频流URL是:https://example.com/video.flv
VIDEO_URL="https://example.com/video.flv"
# 2. 下载视频
curl -L -o "BV1GJ41187du.mp4" "${VIDEO_URL}"
# 3. 提取音频
ffmpeg -i "BV1GJ41187du.mp4" -q:a 0 -map a "BV1GJ41187du.mp3"
# 参数解释:
# -i 输入文件
# -q:a 0 表示音频质量最高(VBR,范围0-9,0最好)
# -map a 只提取音频流
# 也可以输出为wav格式,对转录更友好:-acodec pcm_s16le -ar 16000 "audio.wav"
# 4. 转录音频
python3 scripts/transcribe.py --audio_path "BV1GJ41187du.mp3" --output_path "BV1GJ41187du.txt"
4.2 场景二:仅提取音频或仅转录
有时你可能已经有视频文件,只需要音频;或者有音频文件,只需要文字。
仅提取音频: 如果你通过其他方式获得了视频文件,可以单独使用 ffmpeg 命令。
ffmpeg -i your_video.mp4 -vn -acodec libmp3lame -ab 128k output_audio.mp3
# -vn 表示不要视频流
# -acodec libmp3lame 指定MP3编码器
# -ab 128k 设置音频比特率为128kbps
仅转录文字: 直接调用转录脚本,指向你的音频文件。
python3 ~/.openclaw/skills/bilibili-video/scripts/transcribe.py --audio_path "/path/to/your/audio.wav"
转录脚本通常支持一些参数,你可以通过 --help 查看:
python3 scripts/transcribe.py --help
# 可能支持的参数:--model_size (tiny, base, small等), --language (zh, en等), --device (cpu, cuda)
4.3 场景三:获取UP主的最新视频列表
这个功能依赖于 yt-dlp 。它并不是去下载视频,而是解析UP主的主页,获取视频列表信息。
# 假设你想获取UID为12345678的UP主的最近5个视频
yt-dlp --flat-playlist --get-id --match-filter "duration > 60" "https://space.bilibili.com/12345678/video" | head -5
--flat-playlist:只列出列表,不下载。--get-id:只输出视频ID(对于B站就是BV号)。--match-filter "duration > 60":一个过滤器示例,只列出时长大于60秒的视频。你可以根据需要调整或移除。head -5:取前5条结果。
执行后,你会得到一串BV号列表,接下来就可以用场景一的方法循环处理它们了。你可以将这个命令与Shell脚本结合,实现批量自动化处理。
UP_UID="12345678"
VIDEO_COUNT=3
for bv in $(yt-dlp --flat-playlist --get-id "https://space.bilibili.com/${UP_UID}/video" | head -${VIDEO_COUNT}); do
echo "处理视频: ${bv}"
bash scripts/fetch_video.sh "${bv}"
# 可以在这里添加后续处理,比如分析转录文本
done
5. 脚本解析与自定义修改
要真正掌握这个工具,或者让它更贴合你的需求,有必要深入看看它的脚本。我们重点分析两个核心脚本。
5.1 fetch_video.sh 工作流解析
这个Shell脚本是项目的大脑,它协调了整个流程。我们拆解一下它的典型逻辑(具体代码可能随版本更新,以下为原理性伪代码):
#!/bin/bash
# 1. 参数检查
BV_ID=$1
if [ -z "$BV_ID" ]; then
echo "Usage: $0 <BV号>"
exit 1
fi
# 2. 获取视频信息(核心)
# 这里通常会调用一个Python脚本或使用curl模拟API,解析出视频标题、清晰度列表和播放URL。
# 例如:VIDEO_URL=$(python3 get_video_info.py $BV_ID)
VIDEO_URL="从API获取到的实际视频流地址"
VIDEO_TITLE="获取到的视频标题"
# 3. 下载视频
echo "正在下载视频: $VIDEO_TITLE"
curl -L -o "${BV_ID}.mp4" "$VIDEO_URL"
# 4. 提取音频
echo "正在提取音频..."
ffmpeg -i "${BV_ID}.mp4" -q:a 0 -map a "${BV_ID}.mp3" -y 2>/dev/null
# -y 选项自动覆盖已存在文件,2>/dev/null 隐藏ffmpeg信息输出
# 5. 调用转录脚本
echo "开始语音转录..."
python3 scripts/transcribe.py --audio_path "${BV_ID}.mp3" --output_path "${BV_ID}.txt"
echo "全部完成!视频: ${BV_ID}.mp4, 音频: ${BV_ID}.mp3, 字幕: ${BV_ID}.txt"
自定义点:
- 输出目录 :你可以在脚本开头设置一个
OUTPUT_DIR变量,修改所有的输出路径,让文件更规整。 - 音频格式 :如果你希望转录效果更好,可以将MP3改为WAV格式(
-acodec pcm_s16le -ar 16000 "${BV_ID}.wav"),并记得修改转录脚本的输入参数。 - 错误处理 :可以增加更完善的错误检查,比如下载失败重试、ffmpeg执行状态检查等。
5.2 transcribe.py 转录配置解析
这是执行语音识别的Python脚本,核心是调用 faster_whisper 库。
# 脚本内容示意
from faster_whisper import WhisperModel
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--audio_path", required=True)
parser.add_argument("--output_path", default="transcript.txt")
parser.add_argument("--model_size", default="base") # 模型大小:tiny, base, small, medium, large
parser.add_argument("--language", default="zh") # 语言:zh, en, ja等,或None自动检测
parser.add_argument("--device", default="cpu") # 设备:cpu 或 cuda
args = parser.parse_args()
# 加载模型(首次运行会自动下载)
model = WhisperModel(args.model_size, device=args.device, compute_type="int8")
# compute_type="int8" 表示使用8位整数量化,在CPU上速度更快,精度损失可接受
# 转录
segments, info = model.transcribe(args.audio_path, language=args.language, beam_size=5)
print(f"检测到语言:{info.language}, 概率:{info.language_probability}")
# 输出文本
with open(args.output_path, 'w', encoding='utf-8') as f:
for segment in segments:
print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")
f.write(f"{segment.text}\n")
if __name__ == "__main__":
main()
关键参数调整建议:
--model_size:这是速度与精度的权衡。tiny模型最快,但识别精度最低,适合短句或对实时性要求高的场景。base模型是默认选择,在速度和精度上取得了很好的平衡,适合大多数情况。small/medium/large模型精度依次提升,但所需内存和计算时间也大幅增加。对于长视频转录,base通常是性价比最高的选择。--language:如果你明确知道视频语言,指定语言(如zh)可以提高识别准确率和速度。如果不确定,可以设置为None,让模型自动检测,但可能会略微增加处理时间。--device:如果你有NVIDIA GPU且配置好了CUDA环境,可以设置为cuda,这将极大提升转录速度。对于CPU用户,int8量化是保证速度的关键。
实操心得 :处理长音频(如1小时以上的课程)时,
faster-whisper可能会占用较多内存。如果遇到内存不足的问题,可以尝试将音频文件预先切割成多个小段(例如每10分钟一段),然后分段转录,最后合并文本。ffmpeg可以很方便地做到音频切割。
6. 常见问题与故障排查实录
在实际使用中,你可能会遇到一些问题。下面是我踩过的一些坑以及解决办法。
6.1 视频下载失败或速度极慢
可能原因及排查:
-
API失效或变更 :B站的公开API并非官方承诺的稳定接口,有可能发生变动。这是“无Cookie”方案最大的潜在风险。
- 排查 :检查
fetch_video.sh脚本中构造API请求的部分。可以尝试手动用浏览器开发者工具(F12),在B站视频播放页面的“网络(Network)”选项卡中,过滤playurl或api.bilibili.com的请求,观察其URL格式、参数和头部信息(Headers),与脚本中的进行对比。 - 解决 :根据最新的请求格式,更新脚本中的API请求逻辑。这可能涉及到添加新的URL参数(如
bvid、cid、qn清晰度)或修改HTTP头部(如Referer,User-Agent)。
- 排查 :检查
-
网络或CDN问题 :获取到的CDN链接可能在某些网络环境下访问不畅。
- 排查 :手动复制脚本打印出的或从API获取的视频流URL,用
curl -I <URL>测试是否能正常访问,观察返回的状态码。 - 解决 :可以尝试在运行脚本的机器上配置代理。由于项目说明中提到“Upstream proxy for CDN access (auto-configured in sandbox)”,如果你在OpenClaw的沙箱环境中运行,代理可能已自动配置。如果在自己的机器上,可能需要手动设置
http_proxy和https_proxy环境变量。
- 排查 :手动复制脚本打印出的或从API获取的视频流URL,用
6.2 音频提取过程报错
常见错误:
ffmpeg: command not found
解决 :按照本文“3.1 基础系统依赖安装”部分,正确安装 ffmpeg 。
Unsupported codec or file format
解决 :这可能是下载的视频文件本身损坏,或者 ffmpeg 不支持其封装格式。尝试重新下载视频。也可以尝试在 ffmpeg 命令中指定输出音频编码器,如 -acodec libmp3lame 。
6.3 faster-whisper 转录失败或速度慢
问题:首次运行时卡住不动 原因 : faster-whisper 正在从Hugging Face下载模型文件。 base 模型大约几百MB,网络不好时会很慢。 解决 :耐心等待,或检查网络连接。你可以通过设置环境变量 HF_ENDPOINT=https://hf-mirror.com 来使用国内镜像加速下载。
问题:转录时内存不足(OOM) 原因 :处理超长音频时,尤其是使用 large 模型,会消耗大量内存。 解决 :
- 换用更小的模型,如
--model_size base。 - 在转录命令中增加
--vad_filter=True参数,启用语音活动检测(VAD),可以过滤静音段,减少内存压力。 - 如前所述,预先将长音频切割成小段。
问题:转录结果全是英文或乱码 原因 :模型语言检测错误。 解决 :明确指定语言参数 --language zh 。对于中英混合的视频,指定中文通常也能较好地识别其中的英文单词。
6.4 关于OpenClaw Skill的调用问题
问题:安装了技能,但OpenClaw Agent无法识别命令 解决 :
- 确保技能安装路径正确,通常在
~/.openclaw/skills/下,并且目录名是bilibili-video。 - 重启你的OpenClaw Agent进程,让它重新加载技能列表。
- 检查OpenClaw的日志,看是否有技能加载错误的信息。
6.5 功能扩展与进阶思路
这个项目提供了一个优秀的起点,你可以基于它进行扩展:
- 批量处理与任务队列 :结合获取UP主列表的功能,编写一个守护脚本,定时获取指定UP主的新视频,自动下载并转录,实现无人值守的内容收集。
- 集成到内容分析流水线 :将转录得到的文本,接入到另一个AI技能(例如基于大语言模型的摘要总结、关键词提取、情感分析技能),构建一个从视频到结构化见解的完整管道。
- 支持更多视频源 :研究其他视频平台(如YouTube、抖音)的公开API或解析方式,用类似的架构(下载->提取音频->转录)扩展技能,使其成为一个通用的视频内容处理工具。
- 优化转录后处理 :
faster-whisper输出的文本是按时间戳分段的。你可以编写后处理脚本,将这些片段合并成更连贯的段落,并加上标点符号优化(虽然Whisper本身已具备一定的加标点能力,但仍有提升空间)。
这个项目的价值在于它展示了一种简洁、实用的技术集成方案。它没有追求大而全,而是把几个关键工具用脚本粘合起来,解决了一个明确的需求。无论是直接使用,还是作为你自定义工作流的参考,它都能给你带来不少启发。
更多推荐




所有评论(0)