XingYun blog
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具

XingYun

冲!
  • JS基础

    • 图解js原型链
    • JS Event Loop
    • 对象的底层数据结构
    • 让你的JavaScript代码简单又高效
    • 函数参数按值传递
    • 判断数据类型
    • 浮点数精度问题和解决办法
    • 常用方法snippet
    • 实现Promise
    • 防抖和节流
    • 巧用sort排序
  • CSS && HTML

    • CSS也需要性能优化
    • class命名规范
    • em、px、rem、vh、vw 区别
    • CSS揭秘阅读笔记
  • 浏览器

    • 浏览器是如何渲染页面的
    • 重排和重绘
    • BOM浏览器对象模型
    • DOM事件
    • 浏览器存储
  • 数据结构

    • JS实现链表
    • JS实现栈与栈应用
    • JS实现常见排序
    • 哈夫曼编码
    • MD5算法
  • vue原理浅析

    • Vue虚拟dom与Diff算法
    • 前端打包文件的缓存机制
    • vue数组为什么不是响应式
    • v-for为什么不能用index做key
  • 前端工程化

    • 浏览器是如何渲染页面的
    • 前端打包需要gzip压缩吗
    • 前端打包文件的缓存机制
    • webpack loader和plugin
  • 轮子&&组件库

    • 实现水波浪进度球
  • 文字转语音mp3文件
  • 文件上传前后端实现
  • moment.js给定时间获取自然月、周的时间轴
  • 实现文件上传功能
  • 批量下载照片
  • leaflet改变坐标原点
  • 网络

    • 有了MAC地址 为什么还需要IP地址
    • 为什么IP地址老是变
    • 我们为什么需要IPV6
    • TCP与UDP
  • 计算机组成原理

    • ASCII、Unicode、UTF-8和UTF-16
  • VSCode

    • VSCode图片预览插件 Image preview
    • rsync:linux间的高效传输工具
  • leaflet改变坐标原点
  • 补间动画gsap与tween
  • 文字转语音mp3文件
    • 前端 js + google Text-to-Speech API 实现文字转 mp3 文件
      • 1.将 base64 转为二进制 Unicode 编码
      • 2.JS 二进制转文件流
      • 3.通过 url 下载文件流
  • JavaScript引入
  • JavaScript高级程序设计阅读笔记
  • Javascript函数参数按值传递传递
  • JS防抖和节流
  • 手写JS常用方法
  • 手写Promise
  • JS Event Loop
  • 重排和重绘
  • em、px、rem、vh、vw 区别
  • css也需要性能优化
  • 图解 js 原型链
  • js函数参数按值传递
  • BOM浏览器对象模型
  • DOM
  • 事件
  • js对象数组sort按需排序
  • 文件上传功能技术选型和前后端实现
  • 前端图片处理
  • 让你的JavaScript代码简单又高效
  • BEM:class命名规范
  • 前端规范-CSS属性那么多(杂),怎么排序
  • TypeScript Tips
  • jsx
  • canvas基础
  • 前端日志
  • 浏览器存储
  • CSS世界阅读笔记
  • CSS揭秘阅读笔记
  • js变量命名常用规范词
  • 你不知道的JavaScript阅读笔记
  • js对象的底层数据结构
  • js判断数据类型
  • JS浮点数精度问题和解决办法
  • js作用域
  • js堆栈溢出和内存泄漏
  • 浏览器是如何渲染页面的
  • 疑难杂症和踩坑问题合集
  • 免费在线API收集
  • 原生JS实现Ajax请求
  • cookie、session、localStorage、sessionStorage的区别
  • Sass与Less
  • arrayBuffer、blob、file对象
  • TypeScript基础
  • 前端
XingYun
2021-11-12
目录

文字转语音mp3文件

# 前端 js + google Text-to-Speech API 实现文字转 mp3 文件

Design by xpy

# 使用由 Google 的 AI 技术提供支持的 API 将文字转换为自然而逼真的语音。

地址 Google Text-to-Speech 官网 (opens new window)

Tip:官网可以在线体验文字转语音,切换语言、男女声、语音速度等功能(详情见下图) 访问需要梯子

官网 API 详情截图

在这里插入图片描述

查阅 google 开发者文档发现 Text-to-Speech API 返回的是 base64 编码的 JSON 和 txt 文本文件

在这里插入图片描述

Text-to-Speech API key 的试用申请可以这篇博客 (opens new window)

本文主要讲解前端怎么把 base64 编码的字符串转化为.mp3 文件

# 1.将 base64 转为二进制 Unicode 编码

# JS base64 转二进制

大多数编码都是由字符串转化成二进制的过程,而Base64 的编码则是从二进制转换为字符串。与常规恰恰相反

js 中有两个方法专门用来处理 base64 编解码

# window.btoa() 和 window.atob()

  1. btoa() 方法使用 base-64 编码字符串
  2. atob() 方法用于解码使用 base-64 编码的字符串。
    注意 ⚠️:这两个方法都是返回字符串 atob()方法解码后返回的是 unicode 编码的字符串 不是二进制对象

下面上代码

// 将base64转为二进制Unicode编码
function base64toBlob(base64) {
  ;(bstr = atob(base64)), // 获得base64解码后的字符串
    (n = bstr.length),
    (u8arr = new Uint8Array(n)) // 新建一个8位的整数类型数组,用来存放ASCII编码的字符串
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n) // 转换编码后才使用charCodeAt 找到Unicode编码
  }
  return u8arr
}
1
2
3
4
5
6
7
8
9
10

# 2.JS 二进制转文件流

以上方法得到了 ArrayBufferView 类型的二进制数据, 要将它转换为二进制文件流 这里要用到Blob 对象
在这里插入图片描述

const fileStream = new Blob([data], { type: 'audio/mpeg' })
1

# 3.通过 url 下载文件流

这里需要用到window.URL.createObjectURL方法

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。
这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的 URL 对象表示指定的 File 对象或 Blob 对象。

最后通过 download 类型 a 标签调用浏览器下载文件即可

function dataURLtoFile(data, fileName, fileType) {
  const fileStream = new Blob([data], { type: fileType })
  let url = window.URL.createObjectURL(fileStream)
  let link = document.createElement('a')
  link.style.display = 'none'
  link.href = url
  link.setAttribute('download', fileName)
  document.body.appendChild(link)
  link.click()
  link.remove()
}
1
2
3
4
5
6
7
8
9
10
11

最后贴一个.html 的 demo,需要 demo 的小伙伴可以留下 email,看到后发
在这里插入图片描述

完

#JavaScript
上次更新: 2023/04/05, 09:41:10
补间动画gsap与tween
JavaScript引入

← 补间动画gsap与tween JavaScript引入→

最近更新
01
JavaScript-test
07-20
02
二维码的原理
07-20
03
利用ChatGPT优化代码
07-20
更多文章>
Theme by Vdoing | Copyright © 2021-2023 XingYun | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式