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

评书讲书 universe-st/dsh-pingshu-plugin

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

把电子书拆成回目,用传统评书讲给你听

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

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

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

状态速览

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

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

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

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

读写/删除本地文件写入剪贴板(不计风险)读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 48 处,展示前 42 条)
  • 读取本地文件
    lib/index.js:102
    entries = await readdir(dir, { withFileTypes: true });
  • 删除本地文件
    lib/index.js:110
    await rm(join(dir, entry.name), { force: true });
  • 写入本地文件
    lib/index.js:119
    await mkdir(summaryArchive, { recursive: true });
  • 读取本地文件
    lib/index.js:120
    const entries = await readdir(paths.chapterSummariesDir, { withFileTypes: true });
  • 写入本地文件
    lib/index.js:123
    await rename(join(paths.chapterSummariesDir, entry.name), join(summaryArchive, entry.name));
  • 写入本地文件
    lib/index.js:130
    await mkdir(perfArchive, { recursive: true });
  • 读取本地文件
    lib/index.js:131
    const entries = await readdir(paths.performancesDir, { withFileTypes: true });
  • 写入本地文件
    lib/index.js:134
    await rename(join(paths.performancesDir, entry.name), join(perfArchive, entry.name));
  • 读取本地文件
    lib/index.js:478
    const bytes = new Uint8Array(await readFile(join(projectDir(projectId), project.source.file)));
  • 读取本地文件
    lib/index.js:536
    const data = await readFile(found.path);
  • 删除本地文件
    lib/index.js:597
    await rm(tempPath, { force: true });
  • 删除本地文件
    lib/index.js:604
    await rm(tempPath, { force: true });
  • 删除本地文件
    lib/index.js:610
    await rm(join(projectPaths(project.id).sourceDir, fileName), { force: true });
  • 写入本地文件
    lib/index.js:611
    await rename(tempPath, join(projectPaths(project.id).sourceDir, fileName));
  • 删除本地文件
    lib/index.js:624
    try { await rm(tempPath, { force: true }); } catch { }
  • 写入剪贴板
    lib/client.js:244
    await navigator.clipboard.writeText(String(text ?? ''));
  • 写入本地文件
    lib/store.js:112
    await mkdir(path, { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/store.js:118
    await writeFile(tmp, content, { encoding: 'utf8', mode: 0o600 });
  • 写入本地文件
    lib/store.js:120
    await rename(tmp, path);
  • 删除本地文件
    lib/store.js:122
    await rm(path, { force: true });
  • 写入本地文件
    lib/store.js:123
    await rename(tmp, path);
  • 读取本地文件
    lib/store.js:129
    return JSON.parse(await readFile(path, 'utf8'));
  • 读取本地文件
    lib/store.js:139
    return await readFile(path, 'utf8');
  • 读取本地文件
    lib/store.js:249
    for (let attempt = 0; attempt < 5 && existsSync(dir); attempt += 1) {
  • 读取本地文件
    lib/store.js:323
    await stat(projectPaths(projectId).projectJson);
  • 读取本地文件
    lib/store.js:333
    entries = await readdir(projectsRoot(), { withFileTypes: true });
  • 删除本地文件递归
    lib/store.js:396
    await rm(projectDir(projectId), { recursive: true, force: true });
  • 读取本地文件
    lib/store.js:432
    const entries = await readdir(paths.chaptersDir, { withFileTypes: true });
  • 写入本地文件
    lib/store.js:435
    await rename(join(paths.chaptersDir, entry.name), join(archiveDir, entry.name));
  • 删除本地文件
    lib/store.js:591
    await rm(performanceFile(projectId, chapterId, versionId), { force: true });
  • 读取本地文件
    lib/prompts.js:18
    return readFile(url, 'utf8');
  • 读取密钥环境变量
    lib/tts.js:163
    return String(process.env.SILICON_FLOW_API_KEY ?? process.env.SILICONFLOW_API_KEY ?? '').trim();
  • 写入本地文件
    lib/tts.js:215
    await chmod(configFile(), 0o600);
  • 写入本地文件
    lib/tts.js:280
    await mkdir(ttsRefsRoot(), { recursive: true, mode: 0o700 });
  • 写入本地文件
    lib/tts.js:281
    await writeFile(join(ttsRefsRoot(), filename), bytes, { mode: 0o600 });
  • 发起网络请求
    lib/tts.js:291
    return fetch(url, { ...options, signal: combined });
  • 读取本地文件
    lib/tts.js:537
    const bytes = await readFile(refsPath(relative));
  • 读取本地文件
    lib/tts.js:830
    const info = await stat(path);
  • 写入本地文件
    lib/tts.js:867
    await mkdir(dir, { recursive: true, mode: 0o700 });
  • 读取本地文件
    lib/tts.js:879
    const existing = await readFile(path);
  • 写入本地文件
    lib/tts.js:891
    await writeFile(path, bytes, { mode: 0o600 });
  • 读取本地文件
    lib/tts.js:1177
    const info = await stat(path);
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-typert-protocol
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

解决阅读困难症,让DeepSeek Harness化身说书人,帮你把书讲明白。

README

由 DeepSeek 最新模型翻译生成
评书 · dsh-pingshu 把电子书拆成回目,用中国传统评书讲给你听。 安装 · 快速上手 · 功能 · 演示 · 界面 · 朗读 · 数据 · 开发 这是什么 一本书,少则十几万字,多则上百万字。翻开第一页,人名一大串、地名一大片,读了十页还在认人——很多人就是这样把名著放回书架的。 评书是 DeepSeek Harness 的一个插件。它把一本电子书拆成回目,让 AI 先读懂人物、时间线和背景,再按中国传统评书的讲法把这一回讲出来。你得到的不只是“缩写”,而是一段能听、能读、有扣子的评书: 百年风雨一座城,七代儿孙一盏灯。 灯灭城空人散尽,纸上犹闻打雷声。 四句歪诗念罢,醒木一拍——各位,咱们今天开一部新书,《百年孤独》。 书还是那本书,只是这回,有人在桌子后头替你讲了。 功能 - 多格式导入:EPUB / PDF / TXT / Markdown。EPUB 优先读目录与书脊,PDF 优先读书签,TXT / Markdown 识别标题行;识别不到时按段落长度兜底分章。 - 分章会避坑:自动跳过正文前的目录/提要残片、合并被网站拆成 -1/-2 的同一回、认出「引言」与「附录」边界,并清掉 TXT 里的站点横幅。
展开完整文档(README 剩余 1 节)
评书 · dsh-pingshu

把电子书拆成回目,用中国传统评书讲给你听。

安装 · 快速上手 · 功能 · 演示 · 界面 · 朗读 · 数据 · 开发

这是什么

一本书,少则十几万字,多则上百万字。翻开第一页,人名一大串、地名一大片,读了十页还在认人——很多人就是这样把名著放回书架的。

评书是 DeepSeek Harness 的一个插件。它把一本电子书拆成回目,让 AI 先读懂人物、时间线和背景,再按中国传统评书的讲法把这一回讲出来。你得到的不只是“缩写”,而是一段能听、能读、有扣子的评书:

百年风雨一座城,七代儿孙一盏灯。
灯灭城空人散尽,纸上犹闻打雷声。

四句歪诗念罢,醒木一拍——各位,咱们今天开一部新书,《百年孤独》。

书还是那本书,只是这回,有人在桌子后头替你讲了。

功能

- 多格式导入:EPUB / PDF / TXT / Markdown。EPUB 优先读目录与书脊,PDF 优先读书签,TXT / Markdown 识别标题行;识别不到时按段落长度兜底分章。
- 分章会避坑:自动跳过正文前的目录/提要残片、合并被网站拆成 -1/-2 的同一回、认出「引言」与「附录」边界,并清掉 TXT 里的站点横幅。还不满意时,对话里的 AI 可以先用 pingshu_adjust_chapters 体检,再按 drop / merge / split 局部修正,不必整本重来。
- 书目资料:每本书生成全书概要、章节摘要、人物小传、时间线、术语表和时代背景,分目录保存,随时可查、可补、可手改。
- 评书文案:按回目生成完整评书,包含开场定场诗、正文、扣子和下回预告;每版单独保存(v1、v2…),旧版不覆盖。
- 不设字数上限:不讲“十分钟带你读完”,按故事完整度讲完;想短一点,可以在开讲时选时长和讲解力度。
- 写给耳朵听:内置《评书表演手册》,要求把原文里的格言、警句、比喻翻成大白话,避免“听着高级但没懂”。
- 四种朗读方式:浏览器语音、火山引擎豆包、硅基流动、MOSS-TTSD 本地服务,按需切换。
- 全部在本机:书、摘要、文案、TTS 缓存都在 $DSH_HOME/pingshu,不上传云端;Markdown / JSON 可直接阅读和备份。

演示

评书插件介绍片

观看 2 分 15 秒的插件介绍片(1080p)。片中的评书片段,来自本插件实际生成的《百年孤独》卷首与《悲惨世界》卷首。

界面

安装

评书是一个 DSH bundle。在 DSH 里用插件管理器安装:

plugin_manager install_bundle { target: "/path/to/dsh-pingshu" }

或在命令行:

dsh plugin --profile web add /path/to/dsh-pingshu

安装后刷新 Web GUI,侧栏会出现「评书」图标。

要求:DSH >=0.2.1-rc.2 <0.3.0-0。仓库内的 node_modules 已在 .gitignore 中忽略,安装时由 DSH 自行解析依赖。

快速上手

1. 侧栏点「评书」→「新建项目」。
2. 选择电子书,填写书名、作者,点「导入并开始分析」。
3. 导入完成后会自动打开一个「书目分析」对话。分析一次做完:AI 用 pingshu_analysis_batches 分批,再开子代理并行读章节、写摘要,最后汇总全书资料;不需要你反复回「继续」。
4. 回到面板,挑一回,点「讲这一回」,选时长、风格和讲解力度。
5. AI 会先读手册,再读资料包和原文,写完自动保存。到「评书」页签点朗读,或者直接读文字。

一个项目就是一个工作区。导入、分析、讲某一回都会各自开一个新对话,互不打断。

面板

| 页签 | 你能做什么 |
| 回目 | 看全书回目和字数;读原文;对某一回点「讲这一回」 |
| 书目资料 | 看全书概要、人物、时间线、背景与术语;缺哪块让 AI 补 |
| 评书 | 看历史版本;阅读、朗读、下载、重讲、删除;切换朗读方式 |

阅读器按评书段落分块朗读,长回会自动分段合成,不用一口气等完整本。

朗读

| 方式 | 要不要 Key | 说明 |
| 浏览器语音 | 不需要 | 用系统自带的中文语音(Web Speech API)。装什么音色就用什么音色;浏览器不提供音频导出 |
| 火山引擎豆包 | 需要 | 走单向流式 TTS HTTP 接口,按字符计费;预置音色用 seed-tts-2.0,复刻音色用 seed-icl-2.0 |
| 硅基流动 | 需要 | 托管 MOSS-TTSD-v0.5,OpenAI 风格 /v1/audio/speech;支持 SILICON_FLOW_API_KEY 环境变量 |
| MOSS-TTSD | 不需要(要本机服务) | 开源的 1–5 人长对话 TTS,需自己起 SGLang 推理服务;支持参考音频克隆音色 |

配置都在阅读器底部「配置」里。API Key 只保存在本机 tts/tts.json(权限 600),不会回传浏览器,也不会写进文案。测试连接和正式合成都会计费。

数据目录

$DSH_HOME/pingshu/projects/<projectId>/
project.json # 书名、作者、格式、回目索引 source/book.epub|pdf|txt|md # 原始文件 text/book.txt # 抽取出的纯文本 chapters/ch-000001.md # 按回目切好的正文 summaries/book.md # 全书概要 summaries/chapters/.md|.json # 章节摘要与要素 characters/index.json|.md # 人物小传 timeline/timeline.json|.md # 时间线 background/glossary.json|.md # 术语表 background/context.md # 时代与背景 performances/ch-000001/v1.md # 评书文案,每版一个文件 tts/tts.json # TTS 配置(含 Key,权限 600) tts/refs/.wav # MOSS-TTSD 参考音频 cache/tts/<hash>/* # TTS 合成缓存

默认 $DSH_HOME 是 ~/.dsh。所有内容都是普通 Markdown / JSON,可以直接看、直接改;改完在面板点「刷新」会对账。

工作方式

电子书 ──▶ 解析 / 分回 ──▶ 逐回摘要 ──▶ 全书资料(人物·时间线·背景·术语) │ ┌──────────────┘ ▼ 《评书表演手册》 │ ▼ 评书文案 v1 / v2 / … ──▶ 阅读 / TTS 朗读

- 分析用 pingshu_analysis_ 和 pingshu_save_ 工具,分批并行,一次做完。
- 开讲先取紧凑资料包,再读原文;长回分段读,避免只凭摘要编情节。
- 写作遵循 prompts/performance.md:结构、扣子、人物对话、降低门槛、输出格式都写在里面。

工具

插件向 DSH 暴露 14 个 pingshu_ 工具,覆盖定位、读原文、读资料、分批分析、保存摘要 / 全书资料、保存评书文案和查历史版本。模型不需要知道文件路径,也不需要直接改 project.json。

开发与自检

npm test # 解析、存储、TTS、提示词等单元测试
node scripts/verify-wire.mjs # host / client / gateway 方法面一致
node --check lib/index.js lib/client.js

安装后可以用 cordis_inspect_query 检查:

- Config.listConfigs 里的 pingshu 行
- Slots.listSubTree 的 main key=pingshu、sidebar.panellist id=pingshu
- Tool.listTools 里的 14 个 pingshu_ 工具

写作方法在 prompts/ 下,都是普通 Markdown,改完重启 Host(或等 HMR)即可生效:

- prompts/performance.md:评书表演手册
- prompts/analysis.md:书目资料整理手册
- prompts/accessibility.md:降低阅读门槛的通用原则

参考来源见 docs/REFERENCES.md。

限制

- 扫描版 PDF 不做 OCR:没有文字层会提示先转文字版;DRM 加密书、密码 PDF 不支持。
- PDF 版面不保证:多栏、表格、特殊字体可能抽错行;面板会警告,可在对话里让 AI「重新分章」。
- 浏览器语音不能导出:要音频文件请用火山豆包、硅基流动或 MOSS-TTSD。
- TTS 不内置音色列表:Speaker ID / voice 以各家控制台为准;不同资源对应不同音色集合。
- 文案质量取决于模型与书:写文案前会读手册,但长书、难书仍可能出现取舍偏差,建议先试听一回再批量生成。
- 按本地单用户设计:如果开启远程访问,请自行确认 DSH 的访问控制。

常见问题

Q:为什么导入后没有马上出评书? A:导入只做解析和分章。书目分析是一次性任务,会在新对话里跑完;分析完成后才可以开讲。

Q:能只讲某一回、不分析全书吗? A:可以。但人物、时间线和背景会薄一些,跨章节的伏笔容易接不上。建议至少让分析把当前回和前后各一回覆盖到。

Q:评书文案能改吗? A:能。文案就是 Markdown,直接在 performances/<回目>/vN.md 里改;重讲会生成新版本,不会覆盖你改过的旧版。

Q:卸载会删书吗? A:不会。卸载只移除插件,$DSH_HOME/pingshu 里的书和文案保留;要清理请手动删除该目录。

致谢

- 评书的结构与说法参考了传统评书的常见套路:定场诗、开脸儿、扣子、下回分解。
- 朗读能力来自 火山引擎豆包语音、硅基流动、MOSS-TTSD 与浏览器 Web Speech API。
- 感谢 DSH 插件生态里的同行为 bundle / slot / wire 协议留下的示例。
- 宣传片里的评书片段,分别来自本插件实际生成的《百年孤独》卷首与《悲惨世界》卷首;BGM 由 muse.top 提供。

License

MIT © 2026 huanyu
预览分享卡片长什么样 ↓universe-st/dsh-pingshu-plugin
分享 · DeepSeek Harness Hub
universe-st/dsh-pingshu-plugin

把电子书拆成回目,用传统评书讲给你听

这是你的仓库?认领条目

回到顶部