
Zotero-OpenReader
Zotero 10 的文字转语音插件:更多语音、按你的颜色逐词与逐句高亮、键盘快捷键。
English · 简体中文

如果你喜欢 Zotero-OpenReader,欢迎到 GitHub 给它点个 ⭐——让更多人发现它。
它增加了什么
Zotero-OpenReader 为 Zotero 10 增加了语音和播放器:每个服务商都是播放器第一个下拉框里的一个条目,而 Zotero 自己的标准和高级是另外两个,各自都有自己的开关。它按作者自己的阅读习惯来做——为什么这样做、往哪里去。
- 🗣️ 朗读播放器里更多语音,每个服务商都是一个条目——Fish Audio(免费,最值得先试)、Azure Speech、Cloudflare Workers AI、Speechify、装在你机器上的 Kokoro-FastAPI 或 Fish Speech 服务器、OpenAI、Xiaomi MiMo 或任何 OpenAI 兼容服务器——旁边是 Zotero 自己的标准和高级,各自都有一个开关。→ 服务商
- 🎛️ 三种布局的播放器——底部栏、工具栏下方的顶部栏,或悬浮面板。更改布局不会中断朗读。→ 播放器
- 🔖 从上次停下的地方接着读——关掉文档,过些天再打开,按
Shift+Space,朗读就从你上次停下的那一句开始。→ 从上次停下的地方接着读
- 📄 整句都在屏幕内——读 PDF 时,一句话如果超出窗口底部、延伸到下一页或下一栏,会被滚动到可见范围内,而不是被截断在外,
Shift+Enter 也能用同样的方式把它带回来。→ 朗读
- 📃 翻页不漏行——一句话跨到下一页、那一页的第一行本该被 Zotero 漏掉时,这一行照常朗读、照常高亮。→ 朗读
- 🧵 分段不分句——Zotero 有时会在一句话中间把段落切断,前后两半会被当作一句朗读、一句高亮。→ 朗读
- 🎧 设置里的语音浏览器:按服务商和语言列出每一个语音,一个播放按钮试听,一颗心收藏,还有一个开关让播放器只提供收藏的语音。→ 语音浏览器
- ✨ 逐词高亮和逐句高亮,各自都有自己的开关,颜色和不透明度都由你定——Zotero 自己的语音也一样。→ 高亮
- ⌨️ 键盘快捷键:调速、调音量、按句或按段跳读、从选中的文字开始读、打开播放器的选项面板、自动滚动模式、开关单词高亮、高亮或下划线正在读的句子、一次停止所有标签页的朗读。全部可以改键。→ 键盘快捷键
- 📌 所有文档、所有标签页同一个语音和速度——不再像 Zotero 那样按语言各记一个。→ 朗读
- ⏱️ 停顿由你定——每个语音句与句之间等多久、段落开头再多等多久;读得越快,停顿越短。→ 朗读
- 💾 备份与同步——设置和朗读位置可以存成文件,也可以走你自己的 WebDAV 文件夹,设置和书签跟着你在几台电脑之间走。→ 备份与同步
- 🔄 与 OpenReader 同步——通过你自己的 WebDAV 文件夹,朗读位置在电脑上的 Zotero 和 iPhone 上的 OpenReader App 之间来回走。→ 备份与同步
- 🖥️ Windows 和 macOS 的语音,改由插件来读——就是朗读本来就列出的那些,但有了试听、收藏、缓存,Windows 上还有逐词高亮。→ 服务商
安装
- 到最新发行版下载 `.xpi` 文件——Firefox 里右键 → 链接另存为…
- 工具 → 插件 → ⚙ → Install Plugin From File…(插件窗口没有中文),然后重启 Zotero。插件在 Zotero 里显示为 OpenReader。
- 到编辑 → 设置 → OpenReader 里启用一个服务商——拿不准就先启用 Fish Audio(为什么)——再在播放器第一个下拉框里选它和它的一个语音。

服务商
**先从 Fish Audio 开始。**下面这些里,它是最值得先试的一个:
- **免费。**它的免费模型想读多少读多少,不花钱,账户上也不用留余额。
- **拿密钥不用信用卡。**到 fish.audio 注册、创建密钥、粘贴进来就行——不用信用卡,也不用填账单信息。
- 83 种语言,而且是逐词高亮。
- 语音是这里面最好听的——Fish Audio 官方的、它的用户发布的,还有你自己用录音克隆的。
→ 怎么设置
| Azure Speech |
语音资源的密钥和区域 · 教程 |
免费额度:每月 50 万字符 |
逐词;名字里带 MAI-Voice-2 的语音逐句 |
| Cloudflare Workers AI |
账户 ID 和 API 令牌 · 教程 |
每天 10,000 个免费 Neurons:Aura 语音够读几页,MeloTTS 够读几个小时 |
逐句 |
| Speechify |
一个 platform.speechify.ai 的 API 密钥 · 36 种语言,没有普通话 |
免费:每月 50,000 字符,约十几页;之后每月 10 美元 100 万字符 |
逐词 |
| Fish Audio |
一个 fish.audio 的 API 密钥 · 官方语音、你自己克隆的语音,以及 Model ID,每种来源都有独立开关 · 教程 |
免费模型不花钱、不限量、不保证速度;付费模型每百万字节文本 15 美元,一个汉字算三个字节 |
逐词 |
| Kokoro-FastAPI |
一台跑在本机或局域网里的服务器 · 教程 |
免费;CPU 也能跑,有 GPU 更快 |
逐词 |
| Fish Speech |
一台跑在 24 GB 显卡上的 fish-speech 服务器,语音由你自己的录音克隆而来 · 教程 |
免费 |
逐句 |
| OpenAI |
一个 platform.openai.com 的 API 密钥 |
按字符计费 |
逐句 |
| Xiaomi MiMo |
一个 platform.xiaomimimo.com 的 API 密钥 |
限时免费 |
逐句 |
| OpenAI Compatible |
任何说 OpenAI 接口的服务器地址,服务器若要密钥再加一个:自建的 Chatterbox、托管服务、OpenAI 的代理 |
服务器自己的价钱;自建的服务器不花钱 |
逐句 |
| 系统语音 |
什么都不用——Windows 和 macOS |
免费、离线 |
Windows 逐词,macOS 逐句 |
| Zotero 标准/高级 |
登录 Zotero 账户(编辑 → 设置 → 账户);Zotero Read Aloud 这一节里每档各有一个开关,一开始都是开着的 |
Zotero 自己的额度,在 zotero.org 购买 |
逐词 |
播放器第一个下拉框列出眼下有语音的每一个已启用服务商,以及开关开着时 Zotero 自己的 Zotero 标准和 Zotero 高级,按名称排序。
- 这些条目是 Azure、Cloudflare、Fish Audio、Fish Speech、Kokoro、OpenAI、OpenAI Compatible、Speechify、系统、Xiaomi MiMo、Zotero 高级和 Zotero 标准;条目下面的语音各自带着自己的名字。
- 每个条目按语言各记住自己最后一个语音:Kokoro → Fish → Kokoro,用的还是原来那个 Kokoro 语音。
- 没有语音可提供的服务商——关着、服务器没起来,或者只提供收藏的语音时自己一个都没收藏——在它又有语音之前都不会列出来。
- 没有登录 Zotero 账户时,其他服务商照常可用;只有 Zotero 标准和 Zotero 高级不会列出,和 Zotero 自己一样。
- 你正用着的条目不再提供语音时,播放器会切到记住的那个语音所在的服务商;没有的话,切到默认语音所在的服务商;再没有,就切到第一个条目。
- 暂停时切换服务商或语言立刻生效;按下播放后,这一句会用新语音重新开始。暂停时选择的语音,则要等按下播放后,才从暂停的那个词之后继续。
- Zotero 自己的首次运行窗口和它的语音管理窗口依然把插件的每一个语音都归在本地下面。
- 每个服务商那一节末尾的启用会先跑一次连接检查:连不上的服务商不会被打开。
- Zotero 自己的标准和高级在 Zotero Read Aloud 这一节里各有一个开关,一开始都是开着的。关掉一档,它就从播放器第一个下拉框、语音浏览器和语言列表里消失;Zotero 记住的语音不会丢,重新打开就回来。这两档需要 Zotero 账户:没登录时,它们的启用是灰的,旁边写着原因和一个登录链接;登录后,启用会检查 Zotero 在这一档列出了语音,测试连接会报告语音数量。
- 剩余时间:每档名字下面显示你的 Zotero 账户在这一档的额度还能读多久,算法和 zotero.org 一样。高级语音每分钟消耗 10 或 30 额度,所以高级显示一个区间:剩余时间:9分钟 – 26分钟,视语音而定。0分钟显示为红色。最贵的语音不到 3 分钟时,会出现打开 zotero.org 的添加更多时长链接。
- 启用:一档的剩余时间为 0 时,启用不会打开它,要先添加时长。
- 测试连接只探测,不改变任何开关。
- 服务商开着时,这一节的字段是锁住的——要改先按停用。
- 密钥、网关请求头和 WebDAV 密码用圆点遮住。字段旁边的眼睛可以露出内容,方便查看、选中和复制;服务商开着时,它自己的这些字段一律遮住。
- 存放位置:和其他插件设置一样,以明文存在 Zotero 的首选项里,也会进入设置备份文件。
OpenAI、Xiaomi MiMo 和 OpenAI Compatible:各项怎么填
- OpenAI 和 Xiaomi MiMo 各有自己的一节:API 密钥、模型,以及语音——自己用逗号分隔列出语音 id,留空就用该服务自己的语音。它们的地址是固定的。
- OpenAI Compatible 是给任何说 OpenAI 接口的其他服务器用的:你自己的 Chatterbox、一个托管服务、OpenAI 的代理或镜像。地址填服务器地址,带不带
/v1 都行;API 密钥在服务器没有的时候可以留空;模型填服务器认的名字,测试连接会列出它有的模型;语音留空就用服务器自己的列表。一次只接一个服务器。
- 三节都按句高亮——都不带词级时间戳。
- Kokoro 请改用 Kokoro-FastAPI 那一节:逐词高亮是那条路才有的。
- 以前三个服务器共用一节、用服务器下拉框选择时存的设置,会在插件第一次启动时分别挪进各自的新一节:当时选中的那个保留原来开着的开关,另外两个从关着开始;那时候做的设置备份,恢复时也按这个规则分。
Cloudflare Tunnel 等网关
把网关要的请求头填进额外请求头——OpenAI Compatible 那一节的,或者 Kokoro 就用 Kokoro-FastAPI 那一节的——写成 名称: 值,多个之间用 ; 分隔,例如 CF-Access-Client-Id: …; CF-Access-Client-Secret: …。每个请求都会带上它们。教程。
系统语音
朗读早就把 Windows 和 macOS 自带的语音列在本地里了,但那是光秃秃的:不能试听、不能收藏、没有缓存、没有逐词高亮。
系统语音那一节里的启用把这些都给它们:
- 它们会在播放器第一个下拉框的系统条目下面回来——
Microsoft David、Samantha 这些——还是那些语音,但背后有了语音浏览器、试听、收藏和缓存。
- Windows 上有逐词高亮;macOS 上高亮停在句子上,而且每句要多花约半秒才开口。
- Zotero 自己那几份同名语音会从播放器里退场,所以不会列出两遍;你原先选的那个照读不误。
- 语速快的时候,这些语音听起来会和以前略有不同。
- Windows 上你可能会看到 Zotero 开着时多出一个
powershell.exe;Linux 不支持。
从上次停下的地方接着读
听到一半关掉文档、退出 Zotero,过几天回来按 Shift+Space——朗读就从你停下的那一句接着读。Zotero 自己不保留这个位置,插件替你保留,每一个你听过的文档都记。
- 从那一句的开头接着读,不会从半句中间起。
- 文档里什么都不画,也不往你的标注里加任何东西。
- 从没听过的文档,就从你正看着的那一页开始读。
- 位置只留在本机,除非你打开在电脑之间同步朗读位置(见备份与同步);打开之后它们就跟着你走:在一台电脑上停下,到另一台按
Shift+Space,从那一句接着读。
设置
播放器
- 播放器在每个文档里都是插件自己的;Zotero 原来的播放器不再出现。点击阅读器中的红色耳机图标,打开播放器并开始朗读;再次点击停止并关闭。播放器无法加载时,会有提示说明,也不会朗读:这时可以在“工具 → 插件”里关闭 OpenReader,先用 Zotero 自己的播放器朗读。
- 底部栏、顶部栏、悬浮面板可在设置中选择,也可从播放器的布局按钮选择。栏盖在文档的顶部或底部边缘上,因此打开、关闭或切换播放器都不会改变页面大小,也不会让页面变模糊;跟随会让正在朗读的句子不被栏挡住,Zotero 的查找框会出现在顶部栏下方。在文档的最开头或最末尾,栏下面那一条会一直被挡住。悬浮面板可以拖动。没有保存过布局时,默认使用顶部栏;已有选择会保留。
- 语音服务、语言、声音、速度和音量使用语音浏览器和键盘快捷键里的同一组选择。左侧的心形与设置里的收藏相同。
- 悬浮控件在播放/暂停按钮周围提供四个按句或按段跳转按钮。左上角的选项或 Shift+O 可收起或显示语音服务、语言和声音三行;右上角是布局。每次打开都遵循朗读设置中的打开时展开播放器。
- 悬浮菜单放得下时显示在按钮下方,否则显示在上方。两侧都放不下时,空间较大的一侧显示较短、可滚动的菜单。三种布局中,语言和声音的搜索框在选项列表滚动时都会保持可见。
- 预计剩余朗读时间显示在所有布局中,默认在朗读设置中启用。一行紧凑地显示全文和到下一个目录标题的剩余时间,也包括嵌套标题。悬浮布局中位于语速控件上方,顶部和底部布局中位于音量之后。从选中的文字开始读时,仍会算到文档末尾。要等正常朗读的音频足够后才会显示。正常朗读时,估算会保持不变或逐步减少;手动暂停和网络等待期间不倒数。更改声音、速度或朗读位置会重新开始估算。没有可靠边界的部分不会显示。
- 速度控件在播放器、设置和键盘快捷键中都以 0.05× 为步长调整,范围仍为 0.5×–3×。
- A / M控制当前文档的跟随方式。A表示自动滚动;M表示手动滚动。手动滚动或点击A会进入 M。后续句子、暂停/继续以及停止/重新开始都不会恢复 A。
- 点击 M 或按
Shift+M会返回正在朗读的句子并重新跟随。按 Shift+M可双向切换,与播放器的切换 A/M相同。按 Shift+Enter会返回朗读位置并开启自动滚动;按 Shift+R只返回朗读位置,不改变 A/M。M 状态下跳过句子或段落只改变朗读内容,不移动页面。暂停的音频仍保持暂停。每个已打开文档保留自己的选择;关闭后重开时使用设置里的默认值。
- 主题和控件跟随阅读器的外观。播放器中会显示“正在加载声音…”和“播放失败,请检查语音服务连接后重试。”;错误可以打开查看详情并点击重试。
- Zotero 语音的剩余时间显示在语音按钮的右侧,语音列表里每个 Zotero 语音旁边也有;不到 3 分钟时变红。
- Zotero 某一档的时间用完或达到 Zotero 的每日限额时,这一档会被自动关闭:所有标签页里用它朗读的播放器都会关掉,文档上方会出现一条提醒说明情况——时间用完时附添加更多时长链接。添加时长后或第二天,在设置里重新启用即可。如果还有剩余时间、Zotero 只是拒绝了一个较贵的语音,则不会关闭这一档,提醒会建议你换一个更便宜的语音。
全部在编辑 → 设置 → OpenReader 里。
高亮

- 句子和单词是两个开关,一开始都是开着的:正在朗读的单词用单词色,它所在的句子用句子色衬在下面。关掉一个,就只留下另一个;最后开着的那个关不掉。
- 各配一个颜色和一个不透明度——Zotero 自己的语音也一样。默认是黄色句子上的蓝色词,两者都是 70 %;恢复默认颜色把这些全部改回来,连开关也在内。
- 预览按你阅读器的主题绘制。
- Zotero 自己的高亮当前设置(设置 → 常规 → 朗读)跟随这里的选择,装着 Zotero-OpenReader 时会被置灰;没有段落级别。
- 没有单词时间的语音无论怎么选都按整句高亮。
- 单词在听到的那一刻才亮起:戴无线耳机时它会等声音到来,声音卡住时它也停在原处。
键盘快捷键

Shift+Space 是你唯一需要记的键——不管当时是什么情形,都是这一个键:
选中了文字:从选中的地方开始读。
没选中文字,而这个文档你以前听过:从上次停下的那一句接着读。
没选中文字,这个文档也没听过:从你正看着的这一页开始读。
朗读已经在读了:按一下暂停;再按一下从同一句继续——暂停期间你要是选了一段文字,就从那里重新开始。
等待播放会在音频开始前显示“正在准备…”,包括继续播放或跳到另一句话时。快速开始和已设置的句间停顿不会闪过提示。准备新声音时,声音切换提示优先显示。
**播放器布局 — Shift+P**播放器打开时,无论正在播放还是暂停,都可按顶部栏 → 底部栏 → 悬浮面板的顺序循环切换。所有播放器共用此布局,重启后仍会保留。长按只切换一次;在文本框中输入时不改变布局。
**加速/减速 — Shift+C / Shift+X**支持长按,按系统键盘的重复速度连续触发,每次以 0.05× 为步长,在 0.5×–3× 范围内调整。
**返回朗读位置并开启自动滚动 — Shift+Enter**会回到朗读位置并切换为自动滚动。**返回朗读位置 — Shift+R**只回到那里,不改变 A/M。朗读或暂停时都能用。
**切换 A/M — Shift+M**在播放器打开时切换当前文档的跟随方式。切换到 A 也会定位当前句;暂停的音频仍保持暂停。**自动滚动模式 — Shift+A**在每行都滚动、每句都滚动与超出视图时滚动之间依次切换,不改变 A/M。
自定义快捷键——可在键盘快捷键中改成其他按键、清除绑定或恢复默认值。自定义快捷键也支持长按调速。
Shift+S 停止所有朗读——所有标签页的播放器一次全部关掉,一条简短的提示说明停了几个,每个标签页的阅读位置都保留着,下次从原处接着读。没有播放器打开时,这个键保持原来的作用。
Shift+W 开关单词高亮,不用离开文档——是高亮一节的单词开关。这个改动落在正在读的这一句上,每个标签页都是,并一直保留到你下次更改;一条简短的提示说明现在高亮的是什么。关掉它不会让页面上什么都不高亮:句子会跟着高亮。没有单词时间的语音无论怎么选都按整句高亮,提示也会说明这一点。
Shift+H / Shift+U 高亮或下划线正在读的句子,播放或暂停时都可以,作为文档的注释添加,并打开注释弹窗以便写评论。刚开始读一句时,标注的是刚读完的上一句。没有打开朗读时,这两个键保持原来的作用。
- 上一个声音/下一个声音——
Shift+, / Shift+. 按播放器当前声音列表循环切换,到列表任一端会绕回。在播放器中选择声音、语言或语音模式时,也会采用相同的切换方式。
- 播放时,旧声音只用手上已有的音频继续朗读,不再向服务商请求新的音频。新声音准备好后,在单词边界处或句子之间接手;如果旧声音先读完了手上的音频,朗读会等新声音。一条简短的提示会显示声音名称。
- 暂停时,新声音会在后台静默准备。按下播放后,如果它已准备好,就从暂停的那个词之后继续;否则旧声音会继续播放,直到新声音准备好。没有可靠的单词对齐信息时,旧声音会先读完整句,再切换。
- 跳读或从别处开始朗读(在选中的文字上按
Shift+Space)不会取消切换。落到的那一句:新声音的音频已准备好,就用新声音读;否则旧声音已有这一句,就用旧声音读;都没有时,稍等新声音。
- 正在准备声音时,再次选择会取消上一个请求,只有最后一次选择会生效。准备失败时会保留原来的声音并由它继续朗读,同时显示提示。调速或关闭播放器会取消待处理的切换。准备声音可能消耗服务额度,即使你改变了主意。
语音浏览器

朗读能用的每一个语音,按播放器自己的三步排列——服务商(或者 Zotero 自己的标准/高级)、语言、语音。
- ▶ 试听一句,♥ 收藏。
- 点某一行就把那个语音设为全局默认语音。每个文档首次打开时复制它,之后保留自己的语音。在播放器中更改语音只影响该文档。
- 速度就是播放器自己的那个滑块(0.5×–3×);音量是朗读的响度,100% 是 Zotero 本来的响度。
收藏、试听、默认语音
- 每个启用的服务商都有自己的一栏——列表里没有语音时显示
(0)——Zotero 标准和 Zotero 高级是 Zotero 自己的,各自开关开着时才有;多语种语音归在「多语言」下,排在语言那一栏的最前面。
- ▶——用语音自己的语言试听一句:你的语音要花一次短请求,Zotero 自己的不花钱。
- 播放器中只提供收藏的语音会把播放器按每个服务商都裁到你标记过的那些——某个服务商一个都没标,就会从播放器第一个下拉框里消失,Zotero 自己的两档也在内。一个都没标,或者标过的语音都不再列出时,就又全部提供。开关开着时,只有收藏的语音才能当默认;而默认语音不是收藏时,这个开关打不开。收藏会跟着设置备份走。
- 心形也会显示在播放器的语音列表里,收藏的排在前面;点一下心,就能收藏或取消收藏那个语音。播放器中只提供收藏的语音开着时,如果一个改动会拿走某个标签页正在朗读用的语音,它会被拒绝,直到关掉那个标签页的播放器。
- 点默认那一行就清除默认语音。阅读没有保存语音的文档前,请先选一个。如果已保存的语音变得不可用,请在该文档的播放器中另选一个语音;不会自动开始使用替代语音。如果是连接不上该语音的服务,或服务拒绝了密钥,播放器会直接说明,文档也会保留这个语音,等服务恢复后继续使用。
- 速度滑块按这个速度播放试听,松开滑块就把它设为朗读的起始速度——正在播放的文档立刻就变。改速度不花钱,音高也不变。
- 音量(0–100%)对每个语音都有效,Zotero 自己的标准和高级也在内,试听也一样;改动落在正在读的这一句上,每个打开的标签页都是。朗读打开时,
Shift+↑ / Shift+↓ 调的是同一个数。
- 朗读期间的更改——不会影响当前任何朗读会话的设置可以立即更改。影响某个会话的更改会写明相应标签页,并提供关闭并继续:只关闭这些标签页中的播放器,每个标签页都保留并记住读到的位置,更改随即生效。暂停和后台标签页也算在内。启用服务商从不需要等待。不按这个按钮,朗读不会停止。
- 语音列表会在不打断或重新播放当前句子的情况下更新。正在使用的语音在本次朗读期间无法从列表中移除,也不能停用或重新配置其服务商。
- 恢复和同步——设置备份会整体恢复;如果会影响朗读,就会整体拒绝恢复。后台设置同步会应用不受影响的更改,并将受影响的更改留到这些朗读会话结束后再应用。
朗读
打开时展开播放器、文档语音、停顿、预取、缓存、页首一行、切成两句的话
打开时展开播放器——每次打开悬浮面板时显示语音服务、语言和声音三行。默认开启。点击选项或按 Shift+O 可在本次打开期间收起或展开。设置更改在下次打开播放器时生效。
文档语音——不同附件各自保留语音,即使属于同一文库条目。全局默认语音和文档语音会随设置备份和同步一起保存。同步的语音更改会在下次开始朗读时生效,不会在会话中途改变语音。
所有文档使用同一速度——每个文档、每个打开的标签页都用同一个速度,即全局速度,来自播放器的滑块、快捷键或设置里的滑块。它会随设置备份和同步一起保存;在另一台电脑上改的速度,要等这台电脑上的播放器都关闭后才在这里生效。关闭时,Zotero 按文档语言各记一个速度,每台电脑各自保存。
句与句之间停顿——每个语音读完一句要等多久再读同一段的下一句,不分服务商,按 1 倍速计;读得越快,停顿按比例缩短。默认开启,值为 200 毫秒。关闭时不停顿。
段落之间停顿——段落开头的整段停顿,在这里代替句间停顿,即使它比句间停顿短也一样;按 1 倍速计,同样随速度缩短。默认开启,值为 200 毫秒。关闭时不停顿。
朗读时去掉包围文字的括号——默认对所有语音开启,默认括号对为 <> []。括号不论在句中什么位置,只要括住了文字就会去掉,里面的文字照读:He cast [Fireball] at the wolf. 会按 He cast Fireball at the wolf. 朗读。没有配对的括号会保留,当作比较符号写的 < 和 > 也会保留,例如 x < 5 and y > 3。取消勾选后可以编辑列表,多个括号对之间用空格分隔;重新勾选时会检查并启用。输入无效时,可选择“使用默认值”,或选择“取消”继续编辑。文档不会改变。修改后,停止并重新打开朗读即可生效。
自定义预取——当前句播放时提前取来后面句子的音频,所有声音都适用,播放就不必等服务器。打开时由你设置预取后面的 … 句(3 到 20)和同时发送 … 个请求(1 到 5);关闭时用它们的默认值 5 和 2。提前取来又被跳过的句子,在付费服务商上照样计费,在 Zotero 高级语音上照样消耗额度。
缓存已合成的音频——往回跳或者重开文档时不再产生新的请求。存在内存里(64 MB);Zotero 重启就清空。
Zotero 漏读页首一行时,补读这一行——一句话跨到下一页时,那一页的第一行可能被 Zotero 漏掉:朗读直接跳过去,接起来听着仍像一句话。开启时这一行照常朗读、照常高亮。若某页的页眉被读了出来,就关掉它。对之后打开的文档生效。
Zotero 把一句话切成两句时,合成一句朗读——Zotero 有时会在一句话中间把段落切断,把两半当作两句朗读,中间还停顿一下。开启时两半作为一句朗读、一句高亮。若两个段落被连成一句读了出来,就关掉它。对之后打开的文档生效。
滚动
默认滚动方式、自动滚动方式、阅读线、边听边浏览、返回与跳过
- 默认滚动方式——新打开的 PDF 和 EPUB 标签页可选择自动滚动(默认)或手动滚动。选择手动滚动时,它们从 M 开始。更改此设置不会影响已打开的标签页。默认值、自动滚动方式和阅读线会随设置备份和同步;标签页当前的 A/M 选择不会。
- 自动滚动方式——适用于 PDF 和 EPUB,可选择每行都滚动(默认)、每句都滚动或超出视图时滚动。这些样式只在选择 A(自动)时生效。按下
Shift+A 可依次切换;当前方式会短暂显示。
- 每行都滚动——高亮的单词每换到新的一行,这一行就滚到阅读线,正在朗读的行始终停在同一高度。下一句从上一句结束的那一行接着开始时,页面不动。没有高亮单词时(此语音没有单词时间,或关闭了单词高亮),改为每句都滚动。分页 EPUB 在单词到达下一页时翻页。
- 每句都滚动在句子开始时把整句滚到阅读线;超出视图时滚动让完全可见的句子保持原位,只有在句子有部分超出视图时才把它滚到阅读线。这两种都不会让一个能完整显示的句子逐词移动。比视图高的句子从句首开始,然后在有真实的单词时间戳时跟随当前单词;没有时,只能可靠地定位句首。翻页 EPUB 保留各自的页面。
- 阅读线——自动滚动把句子(每行都滚动时是正在朗读的那一行)放在视图从上往下的哪个高度:0% 贴顶,50% 居中,100% 贴底;默认 30%。值越小,视图里露出的下文越多。所有自动滚动方式和回到朗读位置都用它。视图放得下的句子不会被切掉;但每行都滚动时,如果阅读线接近 0%,句子前面的行可能滚出顶部。播放器的顶部栏或底部栏盖住的部分不算视图。在文档开头或结尾附近,句子可能停不到阅读线上。分页 EPUB 按页翻,不受影响。
- 边听边浏览——手动滚动或翻页会让文档进入 M,即使句子仍在视野内。后续句子、暂停/继续、停止和重新开始朗读期间,页面都由你控制。点击 M 或按
Shift+M 可重新跟随。自动滚动、缩放和窗口变化本身不会让文档进入 M。
- 返回与跳过——
Shift+R只定位当前句一次,不改变 A/M。Shift+Enter定位当前句并切换到 A。在 A 中,跳过一句或一段会定位到新句子;在 M 中只改变朗读内容。每行都滚动时,返回会把正在朗读的那一行滚到阅读线。暂停的音频仍保持暂停。分页 EPUB 按页跳转;文档边界和超长句子可能让句子停不到阅读线上。
备份与同步
WebDAV——一个你自己的文件夹,同步和下面的服务器备份都会用到它。
- 填好文件夹地址、用户名和密码,按启用:它先检查连接,同步和服务器备份只在文件夹启用时才用它。
- 文件夹启用时它的字段锁定——按停用才能编辑。停用时,下面的同步和服务器备份变灰、不工作;它们的开关保留勾选,重新启用后照旧生效。
- 测试连接只探测,不启用任何东西。
http:// 地址不加密:密码和发到那里的设置(含 API 密钥)在传输途中可能被他人看到。启用和测试连接每次都会提醒,文件夹照常可用。
WebDAV 地址示例
地址填的是一个文件夹,第一次上传时创建。Nextcloud:https://cloud.example.com/remote.php/dav/files/<user>/zotero-openreader/;坚果云:https://dav.jianguoyun.com/dav/zotero-openreader/,配一个应用密码。
同步——自动跟着你在电脑之间走的东西,双向的。
- *在电脑之间同步朗读位置:*在一台电脑上停下,到另一台按
Shift+Space,从那一句接着读;共用这个文件夹、又持有同一个文库的电脑都对得上,打开它不会弄丢任何一台电脑上的书签。默认打开。
- iPhone 上的 OpenReader App:App 设到同一个 WebDAV 文件夹后,只要在电脑之间同步朗读位置开着,OpenReader 就和这里共享同样的朗读位置,双向的。
- *在电脑之间同步设置:*这里的改动几秒后就到其他电脑,那边的改动也会到这里,不用手动恢复。默认关闭。
- *各台电脑自己保留的:*本机或局域网地址的语音服务器、系统语音的开关,以及这个 WebDAV 文件夹本身,包括它是否启用。
- *两台电脑改动同一项设置:*以较晚的改动为准。
- 同步带来改动的那台电脑上,用不了的服务商会保持关闭,并说明原因。
备份——单向的副本,手动恢复。
- 备份设置…、恢复设置… 把每一项设置存成一个文件;导出朗读位置… 和 导入朗读位置… 把书签存成另一个文件。恢复设置是整体替换;导入位置只采用其中较新的。
- 在服务器上保留本机设置的备份——任一设置改动几秒后,服务器上本机自己的那份副本就会刷新;立即备份到服务器手动写下这份副本,从服务器恢复设置… 能取回任意一台电脑的那份副本。这是备份不是同步:除非你自己恢复,任何电脑上都不会有变化。
- 恢复到的那台电脑上,用不了的服务商或 WebDAV 文件夹会保持关闭,并说明原因。
- 恢复备份等于改动了其中的每一项设置,同步开着时也会传到你的其他电脑。
疑难解答
常见问题
- 「Cannot reach Kokoro at http://localhost:8880. Is the server running?」(或 Cannot reach Fish Speech at …):服务器没起来,或者监听在别的地址——这一行写的就是它试过的地址;
docker ps 应该能列出服务器;见它的教程。
- 语音在读,但没有逐词高亮。把设置 → 常规 → 朗读 → 高亮当前设成单词,并且用一个会报词级时间戳的语音:Kokoro、Speechify、Fish Audio 或名字里不带 MAI-Voice-2 的 Azure 语音(那些按句高亮)。
- 用名字里带 Dragon Latest 的 Azure 语音时,逐词高亮会在大约十秒后跳到本段最后一个词,并停在那里,直到下一段开始。这是语音本身的问题,不是插件的:Azure 的其他语音——Dragon HD Flash、Multilingual、普通的那些——每个词都跟得上。
- 用 OpenAI 兼容服务器时,读到一半冒出「发生一个未知错误。」 服务器在某一段上失败了;查它的日志。
- Zotero 更新之后插件的语音不见了。一次更新可能让它们消失,直到插件跟上;Zotero 自己的语音照常。请带上 Zotero 版本号开一个 issue。
兼容性
- 桌面版 Zotero 10,任何 10.x 版本都行,自己从源码构建的也算。Windows 和 macOS 上都在用;Linux 应该一样,但没测过。
开发
npm install
npm test # vitest,同时构建 build/Zotero-OpenReader.xpi
npm run typecheck
npm run build
notes/NOTES.md(英文)记录着插件依赖的 Zotero 内部实现,以及到目前为止的每一次事故。
致谢
许可证
AGPL-3.0,与 Zotero 本身相同的许可证。与 Zotero 官方无隶属关系。
贡献按 CONTRIBUTING.md(英文)中的条款接受,这些条款也允许作者把贡献用在他的手机和平板应用 OpenReader 里。
请我喝杯咖啡
