将 ChatGPT 变成 TTS 工具
ChatGPT 对话中,有一个「Read aloud」功能,可以将回复的内容阅读出来。比如我们可以用一些 Prompt 技巧,让 GPT 重复一段文字,然后让他朗读出来。
不过 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 文件。具体使用方法如下:
- 首先把这段脚本粘贴到 ChatGPT 网页的控制台中
- 执行 const hijack = hijackAudio()
- 执行 hijack.hijack()
- 然后点击「Read aloud」,等待片刻会下载一个 mp3 文件
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于