简介

Kevin2li大约 2 分钟

简介

火山翻译是字节跳动旗下的一款翻译软件,但是它也自带一个文本转语音的服务,并且支持多国语言和多种音调,如下图所示,在中文模式下,目前已经支持了7种不同风格的音调,应该可以基本满足普通用户的需要了。遗骸的是,该网站并未提供mp3等格式的音频下载方式,使用起来还是会感到不便。

image.png
image.png

但是这么好的工具不能利用起来着实有点浪费,既然官方没有支持,我们就自己造轮子,本教程就来教大家如何破解它的mp3下载,实现白嫖!

使用

本教程将会使用“油猴脚本”浏览器插件,通过编写自定义的用户脚本来实现mp3下载功能。具体步骤如下:

  1. 新建油猴用户脚本,内容如下:
// ==UserScript==
// @name         文本转语音下载(火山翻译)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       Kevin2li
// @match        https://translate.volcengine.com/translate?category=&home_language=zh&source_language=detect&target_language=en&text=*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=tampermonkey.net
// @run-at       document-start
// @grant        unsafeWindow
// ==/UserScript==

(function() {
  'use strict';
  // Your code here...
// https://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript
const b64toBlob = (b64Data, contentType = "", sliceSize = 512) => {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];

  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);

    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }

  const blob = new Blob(byteArrays, { type: contentType });
  return blob;
};

const originOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (_, url) {
  if (url.startsWith("/web/tts/v1/?msToken=")) {
    this.addEventListener("readystatechange", function () {
      if (this.readyState === 4) {
        const res = JSON.parse(this.responseText);
        const data = res.audio.data;
        var downloadFileName = "火山翻译-";
        var timeStamp = new Date().getTime().toString();
        downloadFileName = downloadFileName + timeStamp.substring(0, timeStamp.length) + ".mp3";

        const blob = b64toBlob(data, "audio/mp3");
        const blobUrl = URL.createObjectURL(blob);

        let downloadLink = document.createElement('a');
        downloadLink.href = blobUrl;
        downloadLink.download = downloadFileName;
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);

        this.responseText = JSON.stringify(res);
      }
    });
  }
  originOpen.apply(this, arguments);
};
})();
  1. 打开火山翻译网站,输入文字,点击语音播放会自动下载mp3文件。

更简单地,你可以直接去脚本列表里选择安装:https://greasyfork.org/zh-CN/scripts/456887-文本转语音下载-火山翻译open in new window

补充

类似的文本转语音服务还有微软的Azure ttsopen in new window, 同样提供了多种人声可供选择,但是也同样缺少下载按钮,可通过下面的油猴脚本下载。
地址:https://greasyfork.org/zh-CN/scripts/444347-azure-speech-downloadopen in new window

image.png
image.png