效率神器 活跃维护

jumpcutter

WofWca/jumpcutter

⏩ 快速跳过句子之间的长暂停——观看讲座速度提升约1.5倍(浏览器扩展)

672
Stars 标星
28
Forks 分支
6
Watchers 关注
127
Open Issues
TypeScript
主要语言
AGPL-3.0
开源协议
6.5 MB
仓库大小
7 天前
最后推送
一键安装扩展 / 插件指令
dsh plugin --profile web add github:WofWca/jumpcutter
git clone https://github.com/WofWca/jumpcutter.git
git clone git@github.com:WofWca/jumpcutter.git
README.md master

机器翻译正文由机器翻译自项目原始文档(英文),排版经程序统一处理,可能存在偏差,请以原项目仓库为准。

跳切器

[][Chrome 网上应用店]

下载:

或者从 GitHub 下载:Chromium / Gecko (Firefox)

实时跳过视频中的静音部分。

对于观看讲座、流媒体录制内容(VOD)、网络研讨会、播客以及其他未编辑视频可能很有用。

演示:

https://user-images.githubusercontent.com/39462442/131825020-5308b879-0509-41a3-95c9-bb4ad8938dc0.mp4

灵感来自 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| 弹出窗口

贡献

构建

  1. 安装基础工具:

  2. 跑

    yarn install
  3. 用本地化文件填充 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美元想买它,但这甚至都不够我花在它上的时间。因此,除非是改变人生的巨额金钱(在那种情况下我或许能够资助另一个像这样的项目!),否则我并不是真的在考虑它。

捐赠




本站来源与版权声明
  • 本文标题:jumpcutter - ⏩ 快速跳过句子之间的长暂停——观看讲座速度提升约1
  • 本文链接:https://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 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。