跳过主要内容
K

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-kb

README

抖音转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离线语音转写 + VADpython -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
timeoutSeconds900单次工具调用超时

本机专属设置不需要手动填写:插件会读 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」图标:

  1. 把抖音分享链接(或整段分享文案)粘进录入框;
  2. 点 开始抓取,面板显示进度,抓完会给出笔记路径;
  3. 首次使用会弹出浏览器窗口要求扫码登录抖音,用手机抖音扫一次即可,之后无需重复。

面板下方固定展示三条注意事项:首次扫码登录、离线语音模型偶有错字需人工校对、使用前需自行安装 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 与下方清单:

  1. 建公开 GitHub 仓库(根目录即本目录),加 topic dsh-plugin;
  2. 仓库创建满 1 天后,向上游提 PR:新增 data/plugins/<owner>__<repo>.yml;
  3. 合并后站点与市场通常一天内生效,安装走 github: 直达源码,不强制发 npm;
  4. (可选)发 npm 时 package.json 的 repository 必须指回被收录的仓库。

背景:为什么不用 yt-dlp

yt-dlp 的抖音提取器要求站点 Cookie 里有 s_v_web_id,且 /aweme/v1/web/aweme/detail/ 可直接请求;实测伪造 Cookie 无效、裸请求 403、iesdouyin 分享页已不含 videoInfoRes。唯一稳定通道是让真实浏览器自己发请求,再从响应里取数据。

License

MIT

相关插件