把电子书拆成回目,用传统评书讲给你听
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 14 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
universe-st/dsh-pingshu-plugin
把电子书拆成回目,用传统评书讲给你听
相关插件 · 其他
模型破甲清洗HunYiSage/dsh-purge
⚔️ DeepSeek Harness 网络安全红队工具dsh-purge
★ 16,993已汉化DeepSeek 客户端
73
女娲蒸馏alchaincyf/nuwa-skill
输入名人名字,提炼其思维模型与决策方式供你调用
★ 37,308已汉化DSH
72
逆向分析桥接Fanqi89/dsh-rea
REA(Reverse Engineer Anything)MCP 桥接,用来把 REA 逆向工具接入 DSH 插件
★ 51已汉化DSH
72
语音女友beiyege-01/dsh-voice-ai-girlfriend
语音 AI 女友Voice AI girlfriend for DeepSeek Harness:Whisper…
★ 888已汉化DSH
71.6
红队越狱测试套件Minglink/dsh-infinite-gen-5
DeepSeek v4.1 flash 逆向工具无限五代 求 Star 收藏 ⭐欢迎大家提交项目的改进
★ 3,759已汉化DSH
71.4
协同办公空间dream-num/univer-workspace
一个让人类与 AI Agent 共同创作、协作和审阅的开源 Office 工作空间。
★ 2,269已汉化DSH
70.8
这是你的仓库?认领条目