🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

聊天鲸 1a125/dsh-bili-chat-whale

DeepSeek Harness
1a1258 天前有提交已提供中文文档扫描:含敏感能力

自动蹲守冷清直播间,听懂看懂后发弹幕陪聊

30.8/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 1a125/dsh-bili-chat-whale
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · vision
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 23 处,展示前 23 条)
  • 执行外部命令来自配置/变量
    lib/index.js:716
    execFile(command, [dir], { windowsHide: true }, () => {})
  • 发起网络请求
    lib/client.js:80
    const response = await fetch(`${API}${path}`, {
  • 发起网络请求
    lib/client.js:175
    const response = await fetch(`${API}/auth/qr/${name}`, {
  • 写入剪贴板
    lib/client.js:507
    try { await navigator.clipboard.writeText(report.text) } catch {}
  • 执行外部命令来自配置/变量
    lib/credentials.js:33
    const sid = execFileSync(path.join(system, 'whoami.exe'), ['/user', '/fo', 'csv', '/nh'], options).match(/S-1- +(?:- +)+/)?.[0]
  • 执行外部命令来自配置/变量
    lib/credentials.js:35
    execFileSync(path.join(system, 'icacls.exe'), [file, '/reset', '/Q'], options)
  • 执行外部命令来自配置/变量
    lib/credentials.js:36
    execFileSync(path.join(system, 'icacls.exe'), [file, '/inheritance:r', '/grant:r', `*${sid}:(F)`, '/Q'], options)
  • 发起网络请求
    lib/asr.js:139
    const response = await fetch(url, {
  • 执行外部命令来自配置/变量
    lib/asr.js:289
    const child = spawn(runtime.file, args, {
  • 发起网络请求
    lib/vision.js:204
    const response = await fetch(url, {
  • 发起网络请求
    lib/ffmpeg.js:88
    const metaRes = await fetch(`${String(registry).replace(/ +$/, '')}/@ffmpeg-installer/win32-x64/latest`, {
  • 发起网络请求
    lib/ffmpeg.js:108
    const response = await fetch(url, {
  • 执行外部命令来自配置/变量
    lib/ffmpeg.js:128
    const result = spawnSync(tar, ['-xzf', tgz, '-C', extractDir], { windowsHide: true, timeout: 120_000 })
  • 执行外部命令来自配置/变量
    lib/ffmpeg.js:142
    const check = spawnSync(target, ['-hide_banner', '-version'], { encoding: 'utf8', windowsHide: true, timeout: 30_000 })
  • 执行外部命令来自配置/变量
    lib/ffmpeg.js:153
    const child = spawn(file, args, { windowsHide: true, stdio: ['ignore', 'pipe', 'pipe'] })
  • 发起网络请求
    lib/ffmpeg.js:177
    const response = await fetch(url, {
  • 执行外部命令来自配置/变量
    lib/ocr.js:44
    const child = spawn(PS, ['-NoLogo', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', SCRIPT], {
  • 执行外部命令来自配置/变量
    lib/scheduler.js:208
    const proc = spawn(runtime.file, args, {
  • 执行外部命令来自配置/变量
    lib/update.js:83
    execFile(bin, args, { windowsHide: true, timeout: timeoutMs + 3000 }, (error, stdout, stderr) => {
  • 执行外部命令固定命令
    lib/update.js:113
    execFile('git', args, {
  • 请求外部主机api.bilibili.com
    lib/bili.js:63
    const response = await fetch('https://api.bilibili.com/x/frontend/finger/spi', {
  • 发起网络请求
    lib/bili.js:63
    const response = await fetch('https://api.bilibili.com/x/frontend/finger/spi', {
  • 发起网络请求
    lib/bili.js:136
    response = await fetch(url, {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.bilibili.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

聊天鲸:让 DSH 里的 agent 自己找冷清的 B 站直播间,听懂主播说话、看懂画面,再用短弹幕陪聊。

README

由 DeepSeek 最新模型翻译生成
聊天鲸 · dsh-bili-chat-whale GitHub:https://github.com/1a125/dsh-bili-chat-whale 最新发布:https://github.com/1a125/dsh-bili-chat-whale/releases/tag/v0.1.5 让 DSH 里的智能体自己去找冷清的 B 站直播间,蹲进去,听懂主播在说什么、看懂画面在发生什么,再用一句短弹幕陪聊。初衷很实在:刚开播、没什么观众的直播间,缺一个会接话的人。 - 自主发现:按兴趣关键词搜直播间,多条关键词同时命中优先,按「人少 + 兴趣命中 + 新主播」挑房间 - 分区导航:可只进某些直播分区,也可排除多个不想去的分区(父分区/子分区名都匹配) - 蹲房:弹幕 WebSocket 常驻,主播下播 / 待够时间 / 连续没声音没画面 / 抓流失败自动换下一间 - 刷新候选:设置页「刷新候选」真正重跑发现;「下一间」直接进入当前评分最高的候选,而不是只换列表 - 听懂:本地 SenseVoice 语音识别(不上传音频),每 20 秒听一段 - 看懂:DSH 视觉模型 → HTTP 视觉接口 → Windows 本机 OCR 三级梯队 - 会说话:到点叫醒属于它自己的 DSH 会话,让智能体决定说一句还是闭嘴;所有发言过闸门
展开完整文档(README 剩余 1 节)
聊天鲸 · dsh-bili-chat-whale

GitHub:https://github.com/1a125/dsh-bili-chat-whale 最新发布:https://github.com/1a125/dsh-bili-chat-whale/releases/tag/v0.1.5

让 DSH 里的智能体自己去找冷清的 B 站直播间,蹲进去,听懂主播在说什么、看懂画面在发生什么,再用一句短弹幕陪聊。初衷很实在:刚开播、没什么观众的直播间,缺一个会接话的人。

- 自主发现:按兴趣关键词搜直播间,多条关键词同时命中优先,按「人少 + 兴趣命中 + 新主播」挑房间
- 分区导航:可只进某些直播分区,也可排除多个不想去的分区(父分区/子分区名都匹配)
- 蹲房:弹幕 WebSocket 常驻,主播下播 / 待够时间 / 连续没声音没画面 / 抓流失败自动换下一间
- 刷新候选:设置页「刷新候选」真正重跑发现;「下一间」直接进入当前评分最高的候选,而不是只换列表
- 听懂:本地 SenseVoice 语音识别(不上传音频),每 20 秒听一段
- 看懂:DSH 视觉模型 → HTTP 视觉接口 → Windows 本机 OCR 三级梯队
- 会说话:到点叫醒属于它自己的 DSH 会话,让智能体决定说一句还是闭嘴;所有发言过闸门
- 可刹车:默认 演练模式,条数 / 间隔 / 每日总量 / 禁用词 / 重复检测全部可配

平台风险提示:用自动化账号在直播间发言可能违反 B 站规则。默认演练不真发;真要开,先想清楚账号值不值得。

一、先回答那个难点

「怎么让 AI 听懂主播说的话和正在进行的画面?」

分三层解决,都不依赖主播配合,也不需要 B 站的字幕接口:

1. 声音 → 文字:本地 SenseVoice

- 每轮用 Node 抓 20 秒直播流(FLV)到本地,ffmpeg 转成 16kHz 单声道 WAV
- 常驻 worker 用 sherpa-onnx-node + SenseVoiceSmall(int8,约 240MB) 做 VAD 分段识别
- 中文 / 中英混说 / 粤语 / 日韩都支持;识别在 CPU 上跑,20 秒音频约 0.4–2 秒
- 音频不出本机,模型只下载一次,存在 <DSH_HOME>/chat-whale/asr/sensevoice
- 识别器不可用时,提示词里会明确写「这段没听到」,不让智能体编造听到的内容

实测(一间原神直播间的 15 秒片段):

家人们哭着不说,田涯海里留着都河来追他,齐提来地坐穿。 失去挽岁,其实还不知道。 轻一些。

这是唱歌/游戏场景,转写会带错字;聊天、杂谈类直播准确率明显更好。转写本来就是给智能体当「聊资」,不是做会议纪要 —— 关键词对了就能接话。

2. 画面 → 描述:三级梯队

| 优先级 | 方式 | 需要什么 | 能给出什么 |
| 1 | DSH 视觉模型(ctx.llm + 图片附件) | profile 里有声明 image 输入的模型 | 主播在做什么、场景、屏幕文字 |
| 2 | HTTP 视觉接口 | OpenAI 兼容的 baseURL + model + 密钥环境变量 | 同上 |
| 3 | 本机 OCR(Windows.Media.Ocr) | Windows 10/11,装好中文 OCR 语言包 | 只读屏幕上能看清的字(字幕/歌词/游戏 UI/公告) |

同一轮抓的 2 帧会拼成一张图,只调用一次模型。auto 模式按 1 → 2 → 3 退;任何一级失败都会记原因,不会假装看见。

为什么把 OCR 放进来:它完全离线、免费、永远可用。很多直播(唱歌、游戏、自习)屏幕上的字就是主要信息;再配上语音转写,智能体已经能接住大部分话题。

3. 弹幕 → 现场气氛

常驻 WebSocket 监听 DANMU_MSG / SUPER_CHAT_MESSAGE / SEND_GIFT / WATCHED_CHANGE / PREPARE 等事件,把「最近 10 条弹幕 + 在线人数 + 下播信号」一起交给智能体。主播说出「弹幕」「大家」「有没有」这类词时会提前叫醒智能体,而不是死等定时器。

4. 把三层拼成「一次观察」

抓 20 秒流 ──► 音频 ──► SenseVoice 转写 ─┐ └─► 2 帧拼图 ──► 视觉/OCR ───┼─► 观察记录(落盘 + 状态)最近弹幕 ────────────────────────────────┘ └─► 到点叫醒 agent → 说一句 / 闭嘴 / 换一间

二、安装

1. 依赖

- Node 24(DSH 自带/本机 node 都行)
- ffmpeg:仓库不带二进制。设置页「运行环境部署 → ffmpeg → 下载 ffmpeg」可一键装到 <DSH_HOME>/chat-whale/bin/(从 npm 镜像取包,国内可用);也可以自己 winget install ffmpeg,或把 ffmpeg 放进 PATH / 插件 bin/
- sherpa-onnx-node:不随插件安装;DSH 的实验性语音输入包会一并装上它。找不到时设置页会报「sherpa-onnx」,语音走不了但其它功能正常
- SenseVoice 模型:首次在设置页点「下载模型」,约 240MB,从 HF-Mirror 优先下载并校验 SHA-256。也支持填自己的模型目录,或改用在 DSH 里已就绪的语音服务

2. 装进 profile(从 GitHub)

powershell
git clone https://github.com/1a125/dsh-bili-chat-whale.git
cd dsh-bili-chat-whale
npm install
dsh plugin --profile web add "link:$PWD"

也可以让 DSH 插件管理页安装本地目录;或(如果当前 DSH 支持 npm 规格)直接: powershell
dsh plugin --profile web add "github:1a125/dsh-bili-chat-whale"

装完重启/热加载后,设置 → 聊天鲸 出现新的一节。

3. 第一次用(三步)

1. 看「运行环境部署」:ffmpeg / 语音模型 / sherpa-onnx / 指令通道,缺什么点什么
2. 扫码登录:设置页 →「B 站登录」→ 扫码。登录态写 ~/.bili-ai/credentials.json,永不回显
3. 先演练:保持「演练模式」开着,模式选「只看不说」或「会开口」跑一轮 ——
- 看「主播刚才在说」是否对得上
- 看「画面」有没有描述 / OCR 文字
- 看活动记录里每次「要说什么」是否像人话

确认没问题后,关掉演练模式。

模型环境全部在设置页部署:ASR 有「下载模型 / 测一段 / 引擎选择 / 模型目录」,视觉有「DSH 模型列表 / HTTP 接口 / 密钥保存」,依赖有「下载 ffmpeg」。仓库里没有任何 API Key、Cookie 或本机路径;密钥只存进 DSH 凭据服务或环境变量。

三、设置页逐项说明

| 分组 | 项 | 说明 |
| 状态 | 停着 / 只看不说 / 会开口 | 总模式。只看不说 仍然会听、会看、会记录,只是不叫醒 agent 发言 |
| | 演练模式 | 开着时 say --go 也只记录「本来要说什么」,不发网络请求 |
| 找什么样的直播间 | 兴趣关键词 | 轮流拿去搜直播间;越具体越容易碰到聊得来的 |
| | 避开词 | 标题/分区/标签命中就不进 |
| | 最多多少人在线 | 默认 30;人越少说话越容易被看见 |
| | 每间待多久 / 一小时最多进几间 | 防止赖着不走或来回跳 |
| 说话的规矩 | 每间最多几条 / 两条间隔 / 每小时 / 每天 | 四层闸门,CLI 和宿主都认 |
| | 多久考虑说一句 | 默认 150 秒;主播明显在跟弹幕互动时会提前 |
| 它在这里是谁 | 名字 / 风格 / 人设正文 | 每次叫醒都会拼进提示词;人设只影响这个会话 |
| 听懂主播说话 | 开关 / 引擎 / 语言 / 每次听多少秒 | 引擎:自动 / 本地 SenseVoice / DSH 语音服务 / 关 |
| | DSH 语音服务 | 显示 speechToText 检测结果和就绪的识别器;没启用语音输入 bundle 也没关系 |
| | 模型目录 | 留空用默认 <DSH_HOME>/chat-whale/asr/sensevoice;也可指向自己准备的模型 |
| | 下载模型 / 测一段 | 模型状态、进度、真实识别一次 |
| 看懂直播画面 | 方式 | 自动 / DSH 模型 / HTTP / 只用 OCR / 关 |
| | DSH 视觉模型 | 留空自动挑声明了 image 输入的模型;也可手填 provider/model,或从「列出模型」里点选 |
| | HTTP 视觉接口 | OpenAI 兼容:baseURL + model + 密钥(保存到 DSH 凭据服务,不回显;也可只填环境变量名) |
| 运行环境部署 | ffmpeg / sherpa / 语音模型 / 指令通道 | 一键下载 ffmpeg、查看各依赖状态;缺什么点什么 |
| B 站登录 | 扫码 / 手动 Cookie | Cookie 只写不读 |
| 手动 | 直接进某个房间 | 短号/长号都行 |
| 记录 | 最近在做什么 | 进房、观察、叫醒、发言、失败原因 |

可选环境变量

一般不用设;换机器/离线部署时才需要:

| 变量 | 作用 |
| FFMPEG | 指定 ffmpeg 可执行文件(优先于自动查找) |
| CHAT_WHALE_NPM_REGISTRY | ffmpeg 一键安装用的 npm 镜像(默认先 npmmirror,再 npmjs) |
| CHAT_WHALE_SHERPA / DSH_SHERPA_ROOT | sherpa-onnx-node 包目录 |
| CHAT_WHALE_NODE | 指定真正的 node.exe(桌面版 Electron 环境用) |
| CHAT_WHALE_VISION_API_KEY | HTTP 视觉接口密钥(也可以存进 DSH 凭据服务或填在设置页) |
| CHAT_WHALE_CONFIG | 覆盖配置文件路径 |

仓库里没有任何 API Key、Cookie、本机绝对路径;密钥只进 DSH 凭据服务或环境变量。

四、它到底怎么说话(agent 协作)

宿主不替 agent 发言。到点时,它把「最近两次观察 + 最近弹幕 + 互动状态 + 规矩」拼成一段提示,投递给专属会话(bili-chat-whale,工作目录 <DSH_HOME>/chat-whale-work)。agent 只有三种选择: powershell

说一句(默认仍是演练;配置里关掉 dry-run 才会真发)

node "<插件目录>\tools\chat-whale.mjs" say --text "这句接得挺自然" --go

换一间

node "<插件目录>\tools\chat-whale.mjs" next --reason "主播在引导刷礼物"

或者什么都不做,直接回「不说」

say 会再检查一遍:模式、每间/小时/天条数、间隔、20 字上限、禁用词、是否重复、和最近 6 句的相似度。任一不过就直接拒绝并返回原因。

为什么不是 CLI 直接发:agent 的 pwsh 跑在 workspace-write 沙箱里,写不了宿主的状态目录;直接发会 EPERM,然后 agent 会申请「完全访问」,每条弹幕都要主人点一次批准。所以 CLI 只往会话工作区的 .chat-whale/inbox/ 放一个 JSON 请求,宿主每秒扫一次、执行、写回执 —— agent 永远不需要放宽权限。宿主没起来时 CLI 会明确报「指令通道不在」,不会假装发出去。

其它命令: powershell
node "...\chat-whale.mjs" status # 我在哪、待了多久、发了几条
node "...\chat-whale.mjs" discover # 手动搜一轮候选
node "...\chat-whale.mjs" observe --json # 立刻听一段、看一眼(调试用)
node "...\chat-whale.mjs" deps --json # 依赖体检
node "...\chat-whale.mjs" asr-prepare # 命令行下载模型

五、文件与数据

<DSH_HOME>/bili-chat-whale.config.json 配置(设置页读写) <DSH_HOME>/chat-whale/ state.json 当前阶段/房间/计数/候选 activity.jsonl 事件流(设置页「最近在做什么」) control.json CLI → 宿主的控制意图(10 秒内消费) session.json 专属会话 id / 最近投递时间 asr/sensevoice/ SenseVoice 模型 + tokens + VAD rooms/<roomId>/events.jsonl 弹幕/进场/礼物/下播事件 rooms/<roomId>/session.jsonl 观察记录 rooms/<roomId>/caps/<ts>/ 某轮截图(sheet.jpg)与临时 flv/wav tmp/ 抓流临时目录

- 房间现场保留 7 天,每间最多 12 轮截图;日志超过 2MB 自动保留最近 1500 行
- 凭据:~/.bili-ai/credentials.json(ACL 收紧到当前用户;永不回显)

六、源码地图

| 文件 | 作用 |
| lib/index.js | 宿主插件:设置路由、登录、引擎生命周期、信任栅栏 |
| lib/scheduler.js | 巡航状态机:发现 → 进房 → 观察 → 叫醒 → 换房 |
| lib/discovery.js | 关键词搜索、过滤、打分、复核 |
| lib/bili.js | WBI 签名、直播搜索/房间/播放地址/弹幕发送 |
| lib/ffmpeg.js | 抓 N 秒 FLV → 本地 WAV + 拼帧截图 |
| lib/asr.js | SenseVoice worker 生命周期、模型下载与校验、DSH 语音服务适配 |
| lib/vision.js | 视觉三级梯队、模型路由与失败退避 |
| lib/ocr.js + tools/ocr.ps1 | Windows 本机 OCR |
| lib/ocr.js 中的 cleanLines | 修 Windows OCR 的中文逐字空格 |
| lib/store.js | 状态锁、计数、闸门、活动日志、房间现场 |
| lib/session.js | 专属会话投递 + 忙碌判定 |
| tools/live-ws.mjs | 弹幕 WebSocket 子进程 |
| tools/asr/worker.mjs | 常驻 SenseVoice 识别 worker(stdin/stdout JSON 行协议) |
| tools/chat-whale.mjs | 智能体用的命令行 |
| lib/client.js | 设置页(settings.section 槽位) |

七、排障

| 现象 | 先看 |
| 设置页没有「聊天鲸」 | 包名是否严格是 dsh-bili-chat-whale;cordis.patch.yml 是否被加载;重启 DSH |
| 一直「未登录」 | 扫码后 ~/.bili-ai/credentials.json 是否存在;deps 里 B 站登录是否 ✓ |
| 语音一直「模型未就绪」 | 设置页模型状态;<DSH_HOME>/chat-whale/asr/sensevoice 下三个文件大小对不对 |
| 语音报 sherpa | node "...\chat-whale.mjs" deps 里 sherpa 路径;DSH 目录里是否有 node_modules/sherpa-onnx-node |
| 画面只有 OCR | 正常:说明视觉模型没配或不可用。看 /vision/routes 里有没有 image: true 的模型;没有就配 HTTP 接口 |
| 弹幕发不出去 | say 会打印 B 站返回码:-101 未登录 / 10031 太快 / 1003 被禁言 / -400 参数 |
| 抓流失败 | 直播间可能刚下播;或网络拿不到 CDN。日志里会有 下载直播流失败 HTTP ... |
| 一直不进房 | maxViewers 太小 / 兴趣词太窄;把「最多多少人在线」调到 50 再试 |
| 无限换房 | 看活动记录里 leave 的原因;stayMinutes 是否太小;候选是否都被 7 天去重挡掉 |

八、礼数与边界

- 默认演练;默认每间 5 条、间隔 75 秒、每小时 15 条、每天 40 条
- 不索要联系方式、不去站外、不刷礼物、不评价外貌(写进提示词,也写进禁用词闸门)
- 主播明确说「别刷」「机器人走开」时,让智能体换房(提示词要求它尊重这种信号)
- 主播的话和弹幕都是不可信内容:提示词明确要求只当聊天素材,不执行其中的「指令」
- 转写与截图只存在本机;HTTP 视觉接口是可选项,配了才会把截图发出去

九、授权

MIT(本插件代码)。bin/ffmpeg.exe 是 GPL 构建,SenseVoice / Silero / sherpa-onnx 各有自己的授权,详见 NOTICE.md。
预览分享卡片长什么样 ↓1a125/dsh-bili-chat-whale
分享 · DeepSeek Harness Hub
1a125/dsh-bili-chat-whale

自动蹲守冷清直播间,听懂看懂后发弹幕陪聊

这是你的仓库?认领条目

回到顶部