如何将 ChatGPT 变成 TTS 工具

将 ChatGPT 变成 TTS 工具

ChatGPT 对话中,有一个「Read aloud」功能,可以将回复的内容阅读出来。比如我们可以用一些 Prompt 技巧,让 GPT 重复一段文字,然后让他朗读出来。

image.png

不过 GPT 的 「Read aloud」会直接将语音播放出来,如果想要作为 TTS 工具使用,就不得不去录屏然后将音轨抽离出来。

为了简化操作,可以使用如下这段脚本。https://gist.github.com/frostime/4795b664b83360d6afe1d3ab49bd5e90

function hijackAudio(baseUrl = null) {
    baseUrl = baseUrl || window.location.origin;

    // 保存原始函数
    const originalFetch = window.fetch;
    const originalXhrOpen = XMLHttpRequest.prototype.open;
    let isHijacked = false;

    // Helper function: 提取 Authorization 头部信息
    function extractAuthorizationHeader(headers) {
        if (headers instanceof Headers) {
            return headers.get("Authorization");
        } else {
            return headers["Authorization"];
        }
    }

    // 主函数:劫持 fetch 和 XMLHttpRequest,自动下载音频文件
    function hijack() {
        if (isHijacked) {
            console.log("Already hijacked.");
            return;
        }

        // 劫持 fetch 请求
        window.fetch = function (url, options) {
            // 检查请求 URL 是否为目标 API
            if (url.includes(`${baseUrl}/backend-api/synthesize?`)) {
                console.log("Found fetch request:", url);

                // 获取 Authorization 头部信息
                const headers = options && options.headers ? extractAuthorizationHeader(options.headers) : null;

                // 修改请求 URL,将格式从 acc 改为 mp3
                const modifiedUrl = url.replace(/format:acc/, "format:mp3");

                // 发起修改后的请求并处理响应
                return originalFetch(modifiedUrl, options).then((response) => {
                    return response.blob().then((blob) => {
                        // 创建下载链接并触发下载
                        const link = document.createElement("a");
                        link.href = URL.createObjectURL(blob);
                        link.download = "response.mp3";
                        link.click();
                        return response;
                    });
                });
            }

            // 如果不是目标请求,继续使用原始 fetch
            return originalFetch.apply(this, arguments);
        };

        // 劫持 XMLHttpRequest 请求
        XMLHttpRequest.prototype.open = function (method, url) {
            // 检查请求 URL 是否为目标 API
            if (url.includes(`${baseUrl}/backend-api/synthesize?`)) {
                const xhr = this;
                const originalOnReadyStateChange = xhr.onreadystatechange;

                // 修改 onreadystatechange 以处理响应并触发下载
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        const blob = new Blob([xhr.response], { type: "application/octet-stream" });
                        const link = document.createElement("a");
                        link.href = URL.createObjectURL(blob);
                        link.download = "response.mp3";
                        link.click();
                    }

                    // 调用原始的 onreadystatechange(如果存在)
                    if (originalOnReadyStateChange) {
                        originalOnReadyStateChange.apply(xhr, arguments);
                    }
                };

                // 修改请求 URL,将格式从 acc 改为 mp3
                const modifiedUrl = url.replace(/format:acc/, "format:mp3");

                // 保持 Authorization 头部信息
                const authorizationHeader = xhr.getRequestHeader("Authorization");
                if (authorizationHeader) {
                    xhr.setRequestHeader("Authorization", authorizationHeader);
                }

                // 使用修改后的 URL 调用原始的 open 方法
                originalXhrOpen.call(this, method, modifiedUrl);
            } else {
                // 如果不是目标请求,继续使用原始 open 方法
                originalXhrOpen.apply(this, arguments);
            }
        };

        isHijacked = true;
        console.log("Hijack activated and listeners set.");
    }

    // 重置函数:恢复原始状态
    function reset() {
        if (!isHijacked) {
            console.log("Not hijacked yet.");
            return;
        }

        window.fetch = originalFetch;
        XMLHttpRequest.prototype.open = originalXhrOpen;
        isHijacked = false;
        console.log("Reset completed. Original functions restored.");
    }

    return {
        hijack,
        reset
    };
}

这段脚本会劫持 ChatGPT 的文本转语音请求并直接下载一份 mp3 文件。具体使用方法如下:

  1. 首先把这段脚本粘贴到 ChatGPT 网页的控制台中
  2. 执行 const hijack = hijackAudio()
  3. 执行 hijack.hijack()
  4. 然后点击「Read aloud」,等待片刻会下载一个 mp3 文件

image.png

  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1327 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • DaVinci

    这个真不错。Mark

推荐标签 标签

  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    349 引用 • 1803 回帖 • 1 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    46 引用 • 25 回帖
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 363 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 3 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 57 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 音乐

    你听到信仰的声音了么?

    60 引用 • 511 回帖
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    31 引用 • 124 回帖 • 4 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 735 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 629 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 16 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 612 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 429 回帖 • 1 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 352 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 49 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 61 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 2 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 585 关注