dsh-douyin-kb
kunwu1980/dsh-douyin-kb
一个简单的人工提供抖音链接(可通过抖音PC客户端获得),由本插件自动将视频内容转化文字记录,并自动导入到Obsidian中,适用于harness、个人知识库搭建初学者上手。需要安装 Python 3.10+ 以及 playwright(驱动 Edge)、PyAV、sherpa-onnx 和 numpy,并把 SenseVoice 模型放到 %USERPROFILE%\.dsh\douyin-kb\models。
安装
dsh plugin --profile web add github:kunwu1980/dsh-douyin-kbREADME
抖音转OB(初学者适用)— 抖音视频 → Obsidian 知识库
一个简单的人工提供抖音链接(可通过抖音PC客户端获得),由本插件自动将视频内容转化文字记录,并自动导入到Obsidian中,适用于harness、个人知识库搭建初学者上手。也是本人使用harness完全借助deepseek创建的第一个插件,具备实验性质:-)
把抖音视频(单条分享链接或博主主页批量)下载下来,离线转写成带时间戳的中文文字稿,写成 Markdown 笔记放进本机 Obsidian Vault。
安装后左侧栏会多出一个「抖音转OB」图标:里面只有三个部分——粘贴抖音链接的录入框、开始抓取按钮、以及注意事项,不熟悉命令行的使用者也能直接用。
- 抓取:Playwright 驱动本机 Edge 的持久化配置目录,先拿
ttwid等 Cookie,再打开视频页,在页面自身的response回调里截获/aweme/v1/web/aweme/detail/的aweme_detail(yt-dlp 对抖音已失效,见“背景”)。 - 转写:sherpa-onnx + SenseVoice(中英日韩粤,int8 模型约 228 MiB)+ silero VAD 切段,纯本地、离线、无 API key。
- 落库:YAML frontmatter + 视频文案 +
- \mm:ss` 句子形式的转写 + 要点区,封面存抖音收藏/_附件/,去重索引抖音收藏/.index.json`。
安装
发布渠道(任选其一):
# 1. 从 GitHub 仓库(推荐给用户;仓库根目录即本目录)
dsh plugin add github:KunWu1980/dsh-douyin-kb
# 2. 从本地打包产物
dsh plugin add C:\path\to\douyin-kb-1.0.0.tgz
# 3. 从本地目录(开发时用,link 安装)
dsh plugin add C:\path\to\douyin-kb-plugin
桌面版也可以在 设置 → 插件 里用“安装插件”填上面同样的 spec;或让 Agent 调用 plugin_manager install_bundle。
更新已安装的 bundle 后需要重启应用,宿主才会加载新的 JS 模块代际;
application: applied只代表 profile 已写入。
运行时前置
插件本身零 npm 依赖,但它调用的 Python 脚本需要:
| 依赖 | 用途 | 安装 |
|---|---|---|
| Node.js ≥ 20(含 npm) | 宿主运行插件 | 已随 DSH 提供 |
| Python 3.10+ | 执行 assets/douyin_kb.py | 系统 Python 或 DSH 自带运行时 |
playwright | 驱动 Edge 抓取抖音页面 | python -m pip install playwright(用 channel="msedge",无需下载 Chromium) |
av (PyAV) | 无 ffmpeg 时解码音轨 | python -m pip install av |
sherpa-onnx | 离线语音转写 + VAD | python -m pip install sherpa-onnx |
numpy | 音频重采样 | pip |
| SenseVoice 模型 | 中文转写 | model.int8.onnx + tokens.txt 放到 %USERPROFILE%\.dsh\douyin-kb\models\ |
| silero VAD | 语音切段 | silero_vad.onnx 同目录(缺失会退化为 25s 定长切块) |
模型下载(国内镜像):
# SenseVoice(约 228 MiB)
curl.exe -L -o "$env:USERPROFILE\.dsh\douyin-kb\models\model.int8.onnx" `
https://hf-mirror.com/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/resolve/main/model.int8.onnx
curl.exe -L -o "$env:USERPROFILE\.dsh\douyin-kb\models\tokens.txt" `
https://hf-mirror.com/csukuangfj/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17/resolve/main/tokens.txt
# silero VAD(约 2.2 MiB)
curl.exe -L -o "$env:USERPROFILE\.dsh\douyin-kb\models\silero_vad.onnx" `
https://hf-mirror.com/onnx-community/silero-vad/resolve/main/onnx/model.onnx
配置
| 配置项 | 默认值 | 说明 |
|---|---|---|
vault | 自动识别(Obsidian 当前打开的库) | 也支持环境变量 OBSIDIAN_VAULT 或本地 config.json 覆盖 |
kbHome | %USERPROFILE%\.dsh\douyin-kb | 模型、浏览器配置、下载缓存;也可用 DOUYIN_KB_HOME |
python | 自动探测 | 指定 Python 可执行文件;也可用 DOUYIN_KB_PYTHON |
timeoutSeconds | 900 | 单次工具调用超时 |
本机专属设置不需要手动填写:插件会读 Obsidian 自己的 obsidian.json,用“当前打开的那个库”作为 vault。只有在你想覆盖时才需要额外指定——写在插件目录之外的 %USERPROFILE%\.dsh\douyin-kb\config.json(该文件不在仓库里,也不会随插件发布):
{ "vault": "D:\\path\\to\\Obsidian Vault" }
读取优先级:插件配置 vault → 环境变量 OBSIDIAN_VAULT → config.json 的 vault → Obsidian 当前打开的库 → 默认 %USERPROFILE%\Documents\Obsidian Vault。
左侧栏面板(初学者推荐)
安装并重启 DeepSeek Harness 后,左侧栏出现「抖音转OB」图标:
- 把抖音分享链接(或整段分享文案)粘进录入框;
- 点 开始抓取,面板显示进度,抓完会给出笔记路径;
- 首次使用会弹出浏览器窗口要求扫码登录抖音,用手机抖音扫一次即可,之后无需重复。
面板下方固定展示三条注意事项:首次扫码登录、离线语音模型偶有错字需人工校对、使用前需自行安装 Node.js / Git / Python。
斜杠命令
/douyin https://v.douyin.com/xxxxxx/
与面板按钮等价(同样走 force=true 覆盖写),适合在会话里直接触发。
工具用法
Agent 侧工具名 douyin_kb:
{ "action": "ingest", "target": "7.66 12/31 ... https://v.douyin.com/xxxx/", "force": false }
{ "action": "batch", "target": "https://www.douyin.com/user/MS4wLjABAAAA...", "limit": 5 }
{ "action": "probe", "target": "https://www.douyin.com/video/7703889641270775066" }
{ "action": "login" }
命令行等价物(排错时用):
python assets/douyin_kb.py ingest "https://v.douyin.com/xxxx/" --vault "D:\path\to\Obsidian Vault"
python assets/douyin_kb.py probe 7703889641270775066
常见问题
Fresh cookies (not necessarily logged in) are needed/ HTTP 403:抖音风控。本插件走浏览器截获,不使用 yt-dlp;若页面出现data-e2e="error-page",先action=login扫码,或删掉%USERPROFILE%\.dsh\douyin-kb\browser-profile重来。无头模式会被判定为机器人,默认有头。aweme_detail: null+filter_reason: "core_dep":视频区域/内容受限,换片源。- 转写为空:视频无语音、音量过低,或 VAD 误切;可先
action=probe确认时长。 - 中文乱码:PowerShell 里跑命令行版时先
[Console]::OutputEncoding = [Text.Encoding]::UTF8。
目录
douyin-kb-plugin/
├─ index.js # 宿主侧:注册 douyin_kb 工具与 /douyin 命令,spawn Python
├─ client.js # 客户端:左侧栏图标 + 主面板(录入框 / 开始抓取 / 注意事项)
├─ package.json # dsh.bundle.patch + dsh.client 清单
├─ cordis.patch.yml # 插入插件行
├─ locale/{en,zh}.json # 插件名与描述
├─ icon.svg
├─ assets/douyin_kb.py # 抓取 + 下载 + 转写 + 写笔记
└─ docs/market-entry.yml # 上架 DSH 插件市场的条目文件
发布到 DSH 插件市场
市场列表来自精选仓库 awesome-dsh-plugin,一插件一个 YAML。步骤见 docs/market-entry.yml 与下方清单:
- 建公开 GitHub 仓库(根目录即本目录),加 topic
dsh-plugin; - 仓库创建满 1 天后,向上游提 PR:新增
data/plugins/<owner>__<repo>.yml; - 合并后站点与市场通常一天内生效,安装走
github:直达源码,不强制发 npm; - (可选)发 npm 时
package.json的repository必须指回被收录的仓库。
背景:为什么不用 yt-dlp
yt-dlp 的抖音提取器要求站点 Cookie 里有 s_v_web_id,且 /aweme/v1/web/aweme/detail/ 可直接请求;实测伪造 Cookie 无效、裸请求 403、iesdouyin 分享页已不含 videoInfoRes。唯一稳定通道是让真实浏览器自己发请求,再从响应里取数据。
License
MIT