共计 2597 个字符,预计需要花费 7 分钟才能阅读完成。
痛点分析:为什么需要 AI 生成笔记?
最近在整理 B 站学习视频时,发现手工记录效率极低——1 小时视频需要 3 小时整理,关键信息还容易遗漏。更糟的是,当需要回溯某个知识点时,得重新拖进度条寻找,这种线性检索方式在百集课程中简直是噩梦。

技术选型:语音识别与图像处理方案对比
语音识别 (ASR) 方案
- OpenAI Whisper:
- 优势:支持 99 种语言、自带时间戳、开源模型可本地部署
-
劣势:大模型需要 16GB+ 内存,实时性较差
-
阿里云 ASR:
- 优势:中文场景准确率 96%+,支持实时流式识别
- 劣势:按调用次数计费,长期使用成本高
# Whisper 基础调用示例
import whisper
model = whisper.load_model("base")
result = model.transcribe("video.mp4")
print(result['text'])
关键帧提取方案
- CNN 特征法:
- 使用 ResNet 提取图像特征
-
计算帧间差异,选取突变点
-
Transformer 法:
- 采用 ViT 模型处理图像块
- 通过注意力机制识别重要画面
核心实现四步走
第一步:视频下载与预处理
B 站 API 需要先获取 cid 参数才能下载视频,这里演示通过网页解析获取:
import re
import requests
def get_bilibili_video(bvid):
url = f"https://www.bilibili.com/video/{bvid}"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
cid = re.search(r"cid=(\d+)&", resp.text).group(1)
play_url = f"https://api.bilibili.com/x/player/playurl?cid={cid}&bvid={bvid}"
return requests.get(play_url).json()['data']['durl'][0]['url']
第二步:语音识别处理流
增加错误重试机制的 Whisper 调用:
from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def safe_transcribe(model, audio_path):
try:
return model.transcribe(audio_path)
except RuntimeError as e:
print(f"GPU 内存不足,尝试降低精度: {e}")
return model.transcribe(audio_path, fp16=False)
第三步:关键帧特征提取
使用 OpenCV 提取画面突变帧:
import cv2
def extract_keyframes(video_path, threshold=0.3):
cap = cv2.VideoCapture(video_path)
prev_frame = None
keyframes = []
while cap.isOpened():
ret, frame = cap.read()
if not ret: break
if prev_frame is not None:
diff = cv2.absdiff(prev_frame, frame)
if diff.mean() > threshold:
keyframes.append(frame)
prev_frame = frame
return keyframes
第四步:文本摘要生成
对比传统算法与 LLM 的效果差异:
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.text_rank import TextRankSummarizer
def textrank_summary(text, sentences_count=3):
parser = PlaintextParser.from_string(text, Tokenizer("english"))
summarizer = TextRankSummarizer()
return " ".join([str(s) for s in summarizer(parser.document, sentences_count)])
性能优化三大策略
多进程处理设计
使用 ProcessPoolExecutor 加速视频处理:
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor(max_workers=4) as executor:
results = list(executor.map(process_video, video_list))
内存泄漏检测
使用 memory_profiler 定位问题:
@profile
def process_video(video_path):
# 处理代码...
异步 IO 实战
aiohttp 实现高并发请求:
import aiohttp
async def async_download(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.read()
五大避坑指南
- 反爬策略应对:
- 随机 User-Agent 轮换
-
请求间隔加入随机延迟
-
长视频处理:
- 按 30 分钟分段处理
-
使用 ffmpeg 的 segment 参数
-
敏感内容过滤:
- 关键词黑名单机制
-
图像 NSFW 检测模型
-
字幕冲突处理:
- 优先使用硬字幕识别
-
避免 ASR 与字幕重复
-
格式兼容问题:
- 统一转码为 MP4 格式
- 采样率设为 16kHz
完整项目示例
点击访问 Colab Notebook 包含所有可运行代码
延伸思考
- 如何实现跨视频的知识点关联?
- 当处理 ASMR 类视频时,现有方案有哪些不足?
- 对于弹幕密集的视频,怎样合理融入笔记系统?
这个项目从零到上线用了三周时间,最终实现单机日处理 2000+ 视频的能力。最惊喜的是发现 AI 提取的思维导图式笔记,比人工记录的检索效率高出 3 倍不止。如果你也经常在 B 站学习,强烈建议尝试自动化方案——它甚至能帮你发现视频里自己都没注意到的关键点。
正文完
