机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。
跳切器
下载:
或者从 GitHub 下载:Chromium / Gecko (Firefox)
实时跳过视频中的静音部分。
对于观看讲座、流媒体录制内容(VOD)、网络研讨会、播客以及其他未编辑视频可能很有用。
演示:
灵感来自 carykh 的 这个视频。
它是如何运作的
简单(大部分)。
目前有两种独立的算法。
第一种我们称为“拉伸算法”,它在此文件中。它仅仅查看媒体元素的输出音频,确定其当前响度,并且当响度不高时,增加其 playbackRate。(我们使用 Web Audio API 的 createMediaElementSource 和 AudioWorkletProcessor 来实现)。
详细信息,为什么称之为 " 拉伸 "
我们刚刚描述的算法无法 " 向前看 " 音频时间线。它只看当前响度,即我们已经发送到音频输出设备的样本。
但向前看(也称为 " 前边距 ")很重要,因为,例如,在语音中有一些可以用来开始一个词的声音并不很响。但仅仅因为这一点就跳过这些声音是不好的。语音的可理解性会降低。例如," throb " 会变成 " rob "。
这里就是 " 拉伸 " 的部分。它关乎于我们如何能够 " 预见 " 并在响亮的部分之前稍微减慢。基本上,它涉及在输出音频之前略微(约200毫秒) 延迟 音频(这是有目的的!)。
想象一下我们当前播放的是一个静音部分,因此播放速度更快。现在,当我们遇到响亮的部分时,我们就会 " 啊哈!那可能是一个单词,并且可能以'th'开头 " 。
如上所述,我们总是在输出音频之前将其延迟(缓冲)约200毫秒。因此我们知道,这200毫秒的缓冲音频中一定包含了那个 " th " 声音,而我们希望用户能听到那个 " th " 声音。但请记住:在我们录制所说的声音时,视频播放速度是 快速 的,但我们希望以正常速度播放那个 'th' 。因此我们不能直接将其输出。我们该怎么办呢?
我们所做的是将缓冲(延迟)的音频, 放慢(拉伸并改变音高),这样它就看起来像是以正常速度播放的!只有这样我们才将其传递给系统(然后系统将其传到你的扬声器)。
孩子们,这就是为什么我们称它为 " 拉伸算法 "。
想了解更多细节,你可以查看其源代码中的注释。
第二个算法是“克隆算法”,可以在这里找到。它会创建目标媒体元素的隐藏克隆,并在原始元素之前播放,寻找静音部分并记录它们的位置。当目标元素到达静音部分时,我们会增加它的 playbackRate,或者完全跳过(定位)静音部分。目前,你可以通过勾选“使用实验性算法”复选框来启用此算法。
我们通过在所有页面中注入脚本来查找视频元素,并简单地 document.getElementsByTagName('video') 。但是新的视频元素可能会在页面已经加载后才被插入,因此我们使用 MutationObserver 观察新元素。
高级架构图
如果下面你看到的是一段文字而不是图表,请访问 这里 。
图
%%graph TD
%% TODO 添加链接 https://mermaid.js.org/syntax/flowchart.html#interaction
watchAllElements["watchAllElements"
looks for media elements
on the page"]
点击 watchAllElements https://github.com/WofWca/jumpcutter/blob/890a2b25948f39f1553cb9afb06c4cc10c9d2a19/src/entry-points/content/watchAllElements.ts
AllMediaElementsController["AllMediaElementsController"
the orchestrator,"]
点击 AllMediaElementsController https://github.com/WofWca/jumpcutter/blob/44fadb1982fbe7dd20c64741ae9e754ba9261042/src/entry-points/content/AllMediaElementsController.ts
watchAllElements -- > |"onNewMediaElements(...元素)"| AllMediaElementsController
AllMediaElementsController -- > |原始 HTMLMediaElement| chooseController{选择
appropriate
controller}
chooseController -- > |原始 HTMLMediaElement| ElementPlaybackControllerCloning & ElementPlaybackControllerStretching
%% 元素播放控制器克隆
%% Subgraph "ElementPlaybackControllerCloning"
元素播放控制克隆["元素播放控制克隆"
controls playbackRate
of the original
HTMLMediaElement"]
点击 ElementPlaybackControllerCloning https://github.com/WofWca/jumpcutter/blob/3ff011318dc9af407eaf9f4cc8d33dfafaf0b53e/src/entry-points/content/ElementPlaybackControllerCloning/ElementPlaybackControllerCloning.ts
前瞻["前瞻"]
plays back the clone element
to look for silence ranges"]
点击 Lookahead " https://github.com/WofWca/jumpcutter/blob/988ec301bf2e6c07e6cc328f73a4177f7504f1e1/src/entry-points/content/ElementPlaybackControllerCloning/Lookahead.ts"
ElementPlaybackControllerCloning -- > | 原始 HTMLMediaElement 引用 | 前瞻
前瞻 -- > |静音范围| 元素播放控制器克隆
createCloneElementWithSameSrc --> |HTMLMediaElement 克隆| 前瞻
前瞻 --> |原始 HTMLMediaElement 引用| createCloneElementWithSameSrc 点击 createCloneElementWithSameSrc "https://github.com/WofWca/jumpcutter/blob/e9daff122f12263a50fb1c4a10e4b13c7fd190cf/src/entry-points/content/ElementPlaybackControllerCloning/createCloneElementWithSameSrc.ts"
cloneMediaSources["`cloneMediaSources"
intercepts all MediaSources
and holds a clone
HTMLMediaElement`"]
点击 cloneMediaSources "https://github.com/WofWca/jumpcutter/blob/5bcfdaf53066c5ac4f664e089b916118afe37ae2/src/entry-points/content/cloneMediaSources/lib.ts"
cloneMediaSources -->|HTMLMediaElement 克隆| 前瞻
前瞻 -- > |getMediaSourceCloneElement| 克隆媒体源
SilenceDetector1["SilenceDetector"]
utilizes Web Audio API
to detect silence"]
点击 SilenceDetector1 "https://github.com/WofWca/jumpcutter/blob/e3283500aeefe994a8be5bb7fdd8f7308e895f4f/src/entry-points/content/SilenceDetector/SilenceDetectorProcessor.ts"
前瞻 -- > |克隆 HTMLMediaElement 音频| SilenceDetector1
静音检测器1 -- > |
SILENCE_END &
SILENCE_START events
with timestamps
| 前瞻
%% 结束
%% 元素播放控制器拉伸
%% 子图 "ElementPlaybackControllerStretching"
ElementPlaybackControllerStretching["ElementPlaybackControllerStretching"]
controls playbackRate
of the original
HTMLMediaElement"]
点击 ElementPlaybackControllerStretching "https://github.com/WofWca/jumpcutter/blob/3ff011318dc9af407eaf9f4cc8d33dfafaf0b53e/src/entry-points/content/ElementPlaybackControllerStretching/ElementPlaybackControllerStretching.ts"
SilenceDetector2["SilenceDetector"]
utilizes Web Audio API
to detect silence"]
点击 SilenceDetector2 "https://github.com/WofWca/jumpcutter/blob/e3283500aeefe994a8be5bb7fdd8f7308e895f4f/src/entry-points/content/SilenceDetector/SilenceDetectorProcessor.ts"
ElementPlaybackControllerStretching -- > |原始 HTMLMediaElement 音频| SilenceDetector2
静音检测器2 -- > |
SILENCE_END &
SILENCE_START events
with timestamps
| 元素播放控制器拉伸
%% 结束
%% 遥测
%% 元素播放控制器克隆 & 元素播放控制器拉伸 -- > |遥测| 所有媒体元素控制器
弹出窗口["弹出窗口"]
(UI, chart)"]
点击弹出窗口 "https://github.com/WofWca/jumpcutter/blob/44fadb1982fbe7dd20c64741ae9e754ba9261042/src/entry-points/popup/App.svelte"
AllMediaElementsController --> |telemetry| 弹出窗口
贡献
- 🌐 翻译(在 Weblate 上)
- 👨💻 编码。查看 CONTRIBUTING.md 了解如何入门。并且欢迎随时联系我。
- 💸 捐赠
- 欢迎对我的决定提供一般反馈和质疑
构建
-
安装基础工具:
-
跑
yarn install -
用本地化文件填充
src/_locales目录。如果它们已经存在,则跳过此步骤。可以选择以下方式之一:-
如果你正在使用
git:git submodule update --init -
如果你不想使用
git,可以从translations分支下载它们,并手动放入src/_locales。
-
-
-
为 Gecko 构建(例如 Firefox):
yarn build:gecko -
为 Chromium(例如 Chrome、Edge)构建
yarn build:chromium
打包的文件将出现在
./dist-gecko(或./dist-chromium)中。 -
有关开发版本,请参阅 CONTRIBUTING.md
然后你可以在浏览器的扩展管理页面安装它(Chromium,Gecko)。
隐私与安全
总之:没问题。
与几乎所有其他扩展一样,你访问的网站_可能_会通过观察以下内容来检测你正在使用此扩展(或类似扩展)以及你为扩展设置的内容:
- 元素的播放速率变化。
createMediaElementSource已被用于某个元素的事实。- 由于播放速率增加而导致的媒体块请求频率增加。这无法通过禁用 JavaScript 来缓解。
- 由于使用克隆算法而导致的两次请求相同媒体的事实。
然而,我怀疑目前是否有专门提供这类服务的公司。但也有可能存在。
除此之外,没有已知的相关情况。它不会与第三方互动,也不会尝试做其他可怕的事情。
为什么是免费的?
它始于2019年的一个业余项目,你可以说它至今仍然是这样。编写成千上万人使用的软件,回馈人类的感觉非常好。
不过我仍在考虑以一种自由的方式将其货币化。我非常喜欢FUTO对此的看法,以及他们在例如FUTO Keyboard中所做的“无限免费试用”活动。
然而,考虑到目前的用户数量,我认为现在付出这个努力不值得。
关于捐赠
捐款很好,但它们告诉用户的是 " 我们并不真正想要钱,但如果你坚持,你可以捐一些 " ,甚至 " 没有人为这个产品付费,所以你将成为少数慷慨的人之一,如果你捐 $5,我只能用它买一杯咖啡,实际上不会激励我继续开发 " 。
很多人愿意付款。他们想真正购买产品,公平合理地完成交易,而不是开一个慈善机构,把钱扔进无底洞的 " 咖啡 " 中,并想着 " 我给得够吗?" 。
当然,我并不是说我不感激捐赠。它们对我意义重大,更加个人化。我只是想说明,就收入而言,它们的影响力没有那么大。
无论如何,这个软件变成闭源或者被卖掉的可能性极低,特别是考虑到我并不是它唯一的贡献者。我已经有人出价1000美元想买它,但这甚至都不够我花在它上的时间。因此,除非是改变人生的巨额金钱(在那种情况下我或许能够资助另一个像这样的项目!),否则我并不是真的在考虑它。
捐赠
-
门罗币 (XMR):
<monero:88yzE5FbDoMVLXUXkbJXVHjNpP5S3xkMaTwBSxmetBDvQMbecMtVCXnQ44W6WRYsPGCPoAYp74ER9aDgBLYDGAAiSt2wu8a?tx_amount=0.050000000000&recipient_name=WofWca (https://github.com/WofWca)&tx_description=为 Jump Cutter 插件开发的捐赠>
-
比特币(BTC):
- 本文标题:jumpcutter - ⏩ 快速跳过句子之间的长暂停——观看讲座速度提升约1
- 本文链接:https://www.cn121.com/productivity/wofwca-jumpcutter.html
- 原项目:WofWca/jumpcutter 版权归原作者 WofWca 及贡献者所有
- 收录信息:本站于 2026-10-10 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 AGPL-3.0(查看 LICENSE 原文),本站译文为其衍生内容;使用、修改、分发请以该仓库 LICENSE 原文为准。基于本页内容形成的衍生作品, 须同样以该协议发布。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 WofWca/jumpcutter。
- 翻译说明:本页正文为人工智能生成内容——由机器翻译对原项目 README 初译、经程序校验排版,可能存在错漏,请以原项目文档为准。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。