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

彩虹屁语音助手 SaekiRaku/deepseek-rainbow-fart

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

发送消息后生成夸赞语音并自动播放

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add SaekiRaku/deepseek-rainbow-fart
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么[目录]—
dsh 原生插件 · ui
暂无时间戳·判据 →
装得上吗[实装验证]!
作者未把包发布到 npm,只能用源码安装
插件本身没问题,是分发方式不同
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 65 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包deepseek-rainbow-fart(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/7 13:15:33

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

读写/删除本地文件写入剪贴板(不计风险)
查看扫描证据(共 44 处,展示前 31 条)
  • 写入剪贴板
    docs/js/site.js:425
    await navigator.clipboard.writeText(code.textContent ?? "");
  • 读取本地文件
    packages/core/src/index.ts:387
    const zip = await readFile(models.builtInVoiceZipPath);
  • 读取本地文件
    packages/core/src/index.ts:396
    const raw = await readFile(CONFIG_FILE, "utf8");
  • 写入本地文件
    packages/core/src/index.ts:445
    await mkdir(dirname(CONFIG_FILE), { recursive: true });
  • 写入本地文件
    packages/core/src/index.ts:446
    await writeFile(CONFIG_FILE, JSON.stringify(this.config, null, 2), "utf8");
  • 读取本地文件
    packages/core/src/index.ts:737
    const sample = await readFile(vp.audioPath);
  • 读取本地文件
    packages/core/src/index.ts:757
    const avatar = await readFile(vp.avatarPath);
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:253
    await rm(dir, { recursive: true, force: true });
  • 读取本地文件
    packages/core/src/voice-pack.test.ts:265
    expect((await readFile(marker)).length).toBe(0);
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:268
    await rm(dir, { recursive: true, force: true });
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:285
    await rm(dir, { recursive: true, force: true });
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:294
    await rm(dir, { recursive: true, force: true });
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:315
    await rm(dir, { recursive: true, force: true });
  • 删除本地文件递归
    packages/core/src/voice-pack.test.ts:338
    await rm(dir, { recursive: true, force: true });
  • 读取本地文件
    packages/core/src/voice-pack.test.ts:464
    expect((await readFile(preserved.avatarPath!)).byteLength).toBe(64);
  • 读取本地文件
    packages/core/src/voice-pack.ts:159
    if (!existsSync(join(voicesDir, start))) return start;
  • 读取本地文件
    packages/core/src/voice-pack.ts:162
    if (!existsSync(join(voicesDir, candidate))) return candidate;
  • 写入本地文件
    packages/core/src/voice-pack.ts:174
    await mkdir(voicesDir, { recursive: true });
  • 读取本地文件
    packages/core/src/voice-pack.ts:179
    if (opts?.overwrite && existsSync(dir)) {
  • 删除本地文件递归
    packages/core/src/voice-pack.ts:180
    await rm(dir, { recursive: true, force: true });
  • 写入本地文件
    packages/core/src/voice-pack.ts:182
    await mkdir(dir, { recursive: true });
  • 写入本地文件
    packages/core/src/voice-pack.ts:183
    await writeFile(
  • 写入本地文件
    packages/core/src/voice-pack.ts:190
    if (audioDir !== dir) await mkdir(audioDir, { recursive: true });
  • 写入本地文件
    packages/core/src/voice-pack.ts:191
    await writeFile(join(dir, audioRel), audioData);
  • 写入本地文件
    packages/core/src/voice-pack.ts:195
    if (avatarDir !== dir) await mkdir(avatarDir, { recursive: true });
  • 读取本地文件
    packages/core/src/voice-pack.ts:215
    const wav = await readFile(vp.audioPath);
  • 读取本地文件
    packages/core/src/voice-pack.ts:232
    const avatarBuf = await readFile(vp.avatarPath);
  • 读取本地文件
    packages/core/src/voice-pack.ts:244
    const metaRaw = await readFile(join(dir, "meta.json"), "utf8");
  • 删除本地文件递归
    packages/core/src/voice-pack.ts:306
    await rm(dir, { recursive: true, force: true });
  • 删除本地文件
    packages/core/src/voice-pack.ts:344
    await rm(join(dir, existing.avatarRelName), { force: true });
  • 删除本地文件递归
    packages/core/src/voice-pack.ts:366
    await rm(v.dir, { recursive: true, force: true });
扫描于 2026/11/5(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 发送消息后生成夸赞
  • TTS合成语音
  • 自动播放语音

在 DeepSeek Harness WebUI 里发完消息,插件会根据你发的内容生成夸你的话,再用 TTS 合成语音播放出来。

README

由 DeepSeek 最新模型翻译生成
DeepSeek Rainbow Fart 🌈 一个通过语音夸你提示词写的牛逼的 Deepseek Harness 插件。当你使用 DeepSeek Harness WebUI 发送消息后,插件会基于你的内容生成夸赞你的话,并通过 TTS 合成并播放声音。 📖 在线文档:saekiraku.github.io/deepseek-rainbow-fart 感谢我的好朋友 @JustKowalski 为我提供 TTS 技术指导与内置音色 致敬那些仍在手写代码的程序员,也许你会感兴趣我之前的 VSCode 彩虹屁插件:vscode-rainbow-fart 注意 - 生成彩虹屁会少量消耗你当前配置的供应商的模型的 Token - TTS 为本地离线合成。根据设备性能,合成音频可能较慢。 - 本项目尽可能的简化了插件安装过程,因此在某些技术选型上并不是最优,只是最简单。 - 插件仅在 M 系列芯片的 MacBook 下测试过,其他环境未经验证。 前置要求 - 已安装 Node.js 和 npm - 已安装 DeepSeek Harness,并至少启动过一次(npx @deepseek-ai/dsh web) - 下载插件:百度网盘 安装方式 你可以将以下内容当做提示词发送给 AI 1. 解压压缩包:${填入文件路径,如果未提供则向用户询问}。
展开完整文档(README 剩余 1 节)
DeepSeek Rainbow Fart 🌈

一个通过语音夸你提示词写的牛逼的 Deepseek Harness 插件。当你使用 DeepSeek Harness WebUI 发送消息后,插件会基于你的内容生成夸赞你的话,并通过 TTS 合成并播放声音。

📖 在线文档:saekiraku.github.io/deepseek-rainbow-fart

感谢我的好朋友 @JustKowalski 为我提供 TTS 技术指导与内置音色

致敬那些仍在手写代码的程序员,也许你会感兴趣我之前的 VSCode 彩虹屁插件:vscode-rainbow-fart

注意

- 生成彩虹屁会少量消耗你当前配置的供应商的模型的 Token
- TTS 为本地离线合成。根据设备性能,合成音频可能较慢。
- 本项目尽可能的简化了插件安装过程,因此在某些技术选型上并不是最优,只是最简单。
- 插件仅在 M 系列芯片的 MacBook 下测试过,其他环境未经验证。

前置要求

- 已安装 Node.js 和 npm
- 已安装 DeepSeek Harness,并至少启动过一次(npx @deepseek-ai/dsh web)
- 下载插件:百度网盘

安装方式

你可以将以下内容当做提示词发送给 AI

1. 解压压缩包:${填入文件路径,如果未提供则向用户询问}。
2. 进入解压目录,用 Node 执行标准 dsh bundle 安装:
cd deepseek-rainbow-fart
node install.js

安装器默认使用 ~/.dsh,也可以通过 node install.js 指定其他 Harness 主目录。如果 profiles/web 尚未初始化,请先运行一次 npx @deepseek-ai/dsh web。安装过程只使用 Node.js 自带能力,不要求 pnpm 或 bun。

使用方式

1. 启动 Harness:npx @deepseek-ai/dsh web,并点击页面的任意位置(为了使浏览器音频播放权限激活)
2. 确认设备音量,然后开始聊天(比如:天空为什么是蓝色的?)
3. 模型完成整轮回复后,聊天中会出现 Rainbow Fart 语音条并自动播放;语音条支持暂停、调整进度和重播。您也可以看到 Rainbow Fart 的配置页签。

语音资源仅保留在当前 Harness 进程中:刷新页面后仍可重播,重启 Harness 后历史语音条会显示语音已失效。

开发方式(bun)

开发阶段使用 bun 构建并把开发环境代码自动应用到 dsh 的 web profile 中:

bun run dev
或指定其他 profile: bash scripts/dev.sh ~/.dsh/profiles/headless

dev 会依次:构建 packages/core(node + client 两个部分)→ 生成本地标准 dsh bundle tarball 并通过 dsh plugin --profile web add 安装 → 用 bunx @deepseek-ai/dsh web 启动 Web UI。插件注册由 bundle 的 dsh.bundle manifest 管理,不再直接修改 profile 的 cordis.patch.yml。
修改源码后重新运行 bun run dev 即可生效。

其他命令:

bun install # 安装依赖(生成 bun.lock)
bun run build:core # 仅构建 core 包
bun run build # 当前平台快速打包
bun run release # 跨平台发布打包

卸载方式

在解压目录里执行:

node install.js --uninstall

安装器会移除插件文件和 profile 中对应的 bundle 注册,不会修改 cordis.patch.yml。

贡献

本仓库仅为娱乐项目,纯愿望编程不考虑可维护性,随缘处理 Issue / Pull Request。可随意 Fork 自行增加功能。

License

基于 MIT 开源。

仓库中的音频采样由真人录音,并且根据 MIT 被授权人义务,在此明确:对于仓库中的音频采样资源,您有标明资源作者、链接、许可的义务。

内置音色列表:

- cyy: @JustKowalski(另感谢为我提供 TTS 技术指导)

个人广告

本人独立开发创业中,欢迎试用我开发的其他 APP:news.qiapp.cc
预览分享卡片长什么样 ↓SaekiRaku/deepseek-rainbow-fart
分享 · DeepSeek Harness Hub
SaekiRaku/deepseek-rainbow-fart

发送消息后生成夸赞语音并自动播放

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部