longhai30 downloadsConvert notes to speech with cloud or local TTS, save audio in your vault, and follow playback with sentence highlighting.
Longhai PodVoice 将 Markdown 笔记转换为音频,保存在当前 Obsidian 库中,支持全文、选区、目录批量生成,以及关联笔记播放和句子高亮。语音服务包括火山引擎、MiniMax、Replicate、本地 GPT-SoVITS 和自定义 HTTP 接口。
当前发布候选面向 Obsidian 桌面端,使用 Node.js/Electron 接口。尚未完成社区目录审核,不能直接在插件市场安装。插件代码采用 MIT 许可证;云服务需要相应账号,可能产生服务商费用。本地模型和语音服务需要用户自行部署。
刘飞、孟岩预设只包含服务端文件路径和参数,不包含声音模型或参考音频。这些素材尚未获得公开分发确认,不随插件发布;新用户可以使用云端音色或自行配置有权使用的本地模型。
Longhai PodVoice converts Markdown notes to speech, saves audio in the vault, and links it back to the source note. It supports whole-note, selection, and folder generation; playback controls; and sentence highlighting. Providers include Volcengine, MiniMax, Replicate, a separately deployed GPT-SoVITS server, and custom HTTP endpoints.
This release is desktop only. macOS has been tested; Windows and Linux have not been tested in this release cycle. Community directory approval is pending.
main.js, manifest.json, and styles.css from GitHub Releases.<vault>/.obsidian/plugins/longhai-podvoice/.After directory approval, the plugin can also be installed by searching for its name in Obsidian's community plugin browser.
TTS Audio by default and linked through the note's audio property. Click the note's listening button again to play it. The floating player supports pause, seeking, speed changes, and highlighting.Cloud providers may charge fees and require separate accounts. The configured provider receives the text submitted for synthesis and the credentials needed for that request. Credentials are stored unencrypted in the plugin's data.json, which may be included in vault synchronization. Custom endpoints are controlled by the user.
Local GPT-SoVITS and its models must be installed separately. The named voice presets contain server paths and parameters only; this release includes no voice models, model weights, or reference recordings. Use only models and recordings you are authorized to use.
Optional offline speech alignment runs locally and needs Node.js, FFmpeg, sherpa-onnx-node, and a SenseVoice model installed separately. The worker code is bundled in main.js; the plugin does not download executable code. Without the required environment, playback remains available with estimated highlighting.
火山引擎语音合成:
音频存储与清理:
.mp3,本地 GPT-SoVITS 使用 .wav。笔记 ⇄ 音频双向强关联:
audio: "[[TTS Audio/笔记名.mp3]]";GPT-SoVITS 对应 .wav。![[...]])。TTS Audio 目录播放音频,插件也能根据文件名自动反查并定位到对应的 Markdown 笔记,点击一键跳转打开!桌面端运行与同步:
requestUrl,音频文件通过 Vault API 保存。智能 Markdown 文本清洗:
1. 内容 和 Markdown 转义写法 1\. 内容 统一以 1、内容 朗读,保留数字并加入停顿,避免本地语音把编号切成短片段后读成“零点一”。小数和版本号保持原样;只调整朗读文本,不修改笔记。更新后需重新加载插件并重新生成旧音频。500 年前 → 五百年前,275 年前 → 二百七十五年前,11 年后 → 十一年后。只转换 1~3 位、无前导零的明确“年前/年后/年以前/年以后/年之前/年之后”;四位年份及编号保留原样。independent_decode,每个片段只使用自己的文字与语义序列,避免同批其他片段影响发音;语义预测仍按批运行,保留用户设置的语速、温度等参数。这修正了跨句混合的处理方式,但不保证消除模型所有偶发拖音或重复。旧版服务若不支持该字段,需要同步更新服务。会议从10:30开始 → 会议从十点半开始,上午09:05 → 上午九点零五分。只处理有明确日期、时段或日程语境的有效时刻,不修改笔记原文。10:30、比分、比例、视频/音频进度、01:10:30 及带小数秒的时间码保持原样。同一句出现媒体、比分或比例等关键词时优先保留,可能漏转真正的时刻,可手动写成“十点半”。更新插件并重新加载后,新生成音频才使用此规则;已有音频需要重新生成。增强播放控制器:
/tts 请求仍携带目标 GPT 和 SoVITS 路径,由配套本地服务核对,相同则复用,不同才切换;插件不再预先发送强制重载请求。模型复用本身不需重启配套服务(逐句声学修复仍需按上文更新服务);自定义音色仍使用服务端当前模型。生成中的音色参数固定为本次开始时的设置。现代磨砂玻璃浮动伴读播放器 (Floating Player Dock):
语音时间戳高亮与“点哪读哪” (Note as a Player):
<音频文件名>.podvoice-timing.json,含识别文字、时间戳和音频 SHA-256。音频变化后自动重新分析;笔记变化后重新匹配,不重做识别。缓存可随音频同步到其他设备;当前发布候选仅支持桌面端。插件清理音频时会同时清理对应缓存。main.js;运行时还需要用户预先安装 Node.js、FFmpeg、sherpa-onnx-node 和 SenseVoice INT8 模型。模型目录为 ~/.coli/models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-int8-2024-07-17/,需包含 model.int8.onnx 和 tokens.txt。自动发现标准 Node/fnm/nvm 路径及 coli 的依赖;不自动安装或下载缺失环境。单音频上限两小时,分析任务串行执行,插件卸载时停止进程。📁 目录批量与定时增量生成(个人专属播客流 / 随身听专辑):
00:00)自动增量更新监控目录(如“待听播客”或“每周精选”)。🎧 听笔记 (2/5): 文章标题...,不弹窗阻塞写作,完成后弹汇总通知。Longhai PodVoice ➔ 点击安装并启用。Add Beta plugin ➔ 输入 GitHub 仓库地址 longhaiqwe/longhai-podvoice 即可自动拉取最新测试版。manifest.json、main.js、styles.css,放入你的仓库目录:<你的仓库>/.obsidian/plugins/longhai-podvoice/
├── manifest.json
├── main.js
└── styles.css
在 Obsidian 设置中进入「第三方插件」,启用 Longhai PodVoice。volcano_tts,接口地址、音量和音调位于折叠的「声音高级选项」。设置页按使用场景分为:
| 区域 | 常用设置 | 按需展开 |
|---|---|---|
| 声音 | 音色、语速;火山引擎与 GPT-SoVITS 支持试听 | 服务连接、声音高级选项 |
| 听读体验 | 朗读标题、逐句高亮、自动语音对齐、跟随滚动 | 播放器、按钮位置、高亮同步 |
| 音频保存 | 保存位置、历史版本 | 笔记关联、空间与清理 |
| 自动生成 | 每天自动更新 | 开启后显示目录、时间和补跑;关闭时仍可展开手动批量生成 |
| 高级设置 | 默认收起 | 文本清理、分段长度、设置语言 |
已有配置保持不变:打开设置不会保存或重置任何参数。旧的非默认文本清理规则自动显示为「自定义」,只有主动选择「推荐」才恢复文本清理规则;不会改动标题、分段、音色或服务凭证。关闭按钮、关联、定时等功能只隐藏附属选项,其值仍保留。
历史版本策略:
.mp3、GPT-SoVITS 为 .wav;切换策略本身不会删除文件。建议在 Obsidian 设置 ➔ 「文件与链接 ➔ 已排除的文件 (Excluded files)」 中,添加 TTS Audio 目录。
这可减少音频文件对搜索等功能的干扰;它不会阻止音频文件同步,也不保证 Obsidian 启动时完全跳过该目录。若改过音频保存位置,请使用实际目录名。
查看生成日志:命令面板运行 「听笔记:查看最近生成日志」,查看最近 50 次记录;点击记录可展开详情。
TTS Logs/YYYY-MM/时间-任务ID.json,每次生成独立文件,按 UTC 月份归档,查看窗口按本地时间显示。记录保留到手动删除,清理音频不会删除日志。正文和完整请求模板不写入日志,已知凭证及错误中的 URL 会脱敏。右键「听全文」选择音色:
生成当前笔记语音:
Cmd/Ctrl + P,输入 Longhai PodVoice:生成当前笔记语音并保存到本地;听笔记:生成该笔记语音并保存。播放已关联语音:
Cmd/Ctrl + P,输入 Longhai PodVoice:播放当前笔记关联的语音;听笔记:播放该笔记关联语音。为选中文本生成语音:
Convert selected text to speech。目录级批量与增量生成:
Cmd/Ctrl + P,输入 Longhai PodVoice:增量同步已配置目录的音频;openspeech.bytedance.com;MiniMax 默认请求 api.minimax.io;Replicate 请求 api.replicate.com,并下载其响应中的音频 URL。这些服务需要用户自行开通账号、提供凭证,费用由服务商收取。插件本身不收费。http://127.0.0.1:9880/tts;用户也可配置其他地址或自定义 HTTP 接口。插件向所选地址发送清洗后的文本、音色参数及配置的请求头,并从服务响应指定的地址下载音频。HTTP 不提供传输加密。plugins/longhai-podvoice/data.json。该文件未由插件加密,可能被用户的备份或同步服务复制;请求时凭证会发送至用户配置的相应服务。不要公开此文件。sherpa-onnx-node,读取 ~/.coli/models/ 下的 SenseVoice 模型。它启动本地子进程,在系统临时目录解码音频,结束后清理临时文件,不联网下载代码或模型。缺少依赖时保留普通播放与估算高亮。audio 属性,正文嵌入默认关闭。重新生成可覆盖旧音频,清理操作会删除所选音频及时间戳缓存。npm ci
npm test
npm run build
构建只生成仓库根目录的 main.js,不会写入个人 Obsidian 库,也不会下载模型。发布资产为 main.js、manifest.json、styles.css。逐句对齐工作进程源码来自 speech-timing.cjs,在构建时嵌入 main.js,无需用户另行安装脚本。
本项目基于 MIT 协议开源。