声音转base64https://zhuanlan.zhihu.com/p/139023181

使用Base-64实现纯文本网页音频传输|网页前端|音频开发|

 

并不是什么高新技术,仅作学习整理。

前言——windows与macos系统GM Synth的不同点

起因源于本人太闲,开发了一个网页端练耳app,还能借此重新复习下以前学过的JavaScript。

在HTML5,w3c就提供了非常厉害的Web Audio API,可以独立实现32浮点音频计算、Summing、内置iir滤波器、混响器、音频动态处理算法、OSC等,与此同时它还有个兄弟——Web MIDI API, 用来实现web中与电脑本地midi设备的互通。(bandlab开发的网页DAW就是用HTML5的Web Audio API和Web MIDI API写的,此外也有很多用其开发的网页DAW)

在实现上面app时,就有了这种需求——通过Web MIDI API连接系统自带的GM Synth,点击音高便可以发出相应MIDI信息,来发出音高。

这个在Windows系统上可以实现,因为windows自带的GM Synth是作为一个MIDI port,使用Web MIDI API连接到这个port,发送相应音符信息就可以发出音高,还可以发出音色库信息来改变音色,使用gm中128个音色。

但是MacOS系统不同,MacOS系统自带的GM Synth是作为一个AU插件存在,插件名字是DLSMusicDevice,任何软件想要使用自带的GM Synth时都可以调用它,好处是可以在DAW中直接加载。但这也意味着,与Web无缘了,因为Web Audio API并不能加载AU/VST插件。

如果要实现我的需求,是不是就只能生成好每个音色的音频文件,上传到服务器呢?

这样做无非是效率极低的,首先,音频文件要占用大量带宽,对于服务器来说,一丁点带宽都是宝贵的,除非进行良好的压缩;也要占用文件系统的空间,除非进行良好的压缩;对于终端,每点击一次,浏览器就要向服务器申请一次音频下载,效率极低。于是我就在寻找mac下能实现类似windows gm synth的方法,最后没找到,还是得从服务器端上传音频文件解决问题。

HTML5中,Audio标签有个非常牛逼的功能,Audio标签的src属性在指定播放音频的来源时,不仅可以指向服务器任何一个音频文件,也可以直接放入一串Base64代码,Audio标签会实时解析Base64代码,生成一个文件,并且按照设置的格式播放。

我们可以只使用js+HTML,在一个文件中实现纯文本储存、传输多个音频文件。

我只要给每个音色建立一个js文件,里面放入每个音色中部分音高音频的Base64文本,放入的音高不用把全音域放进去,只需要每隔2~4度放入一个音高,每两个音高之间的音使用Web Audio API来实现升降调,产生之间的其它音,节省空间。

<audio controls="controls" autobuffer="autobuffer" autoplay="autoplay">
    <source src="data:audio/mpeg;base64,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" />
</audio>

上面这串代码,src属性中就是一个铃声.mp3转成base64后的结果,上面这串代码直接打开就可以播放,不需要联网,因为已经相当于把mp3“嵌入”到代码里了。

这种开发方式,实际上肯定没有直接放音频来的方便快捷,但可以实现“纯代码”音频。

从音频制作到生成Base64

  1. 生成一个wav音频

我从logic中导出了一个斯坦威大钢琴C4音的16bit wav

2. 进行压缩

由于是web端,带宽及其珍贵,我们得尽量减少带宽使用

我使用Adobe Audition进行处理:

导入音频,变换采样率,16kHz以上都是不必要的,所以直接把采样率改成32kHz,位深度不需要改变,16bit就可以,8bit的量化噪音太大。

并且导出为压缩率比较高的mp3

这时的文件就非常小了,只有20多KB。

3. 转换成base64

我使用的是js,所以我用js代码来实现转换

<input type="file" id="fileInput">

<script>

   var fileInput = document.querySelector('#fileInput');

   fileInpt.onchange = function () {
       var file = this.files[0];
       var reader = new FileReader();
       reader.readAsDataURL(file);
       reader.onload = function () {
           console.log(reader.result);
       };
    };

</script>
//此代码可以实现input按钮加载本地文件,并在console直接输出base64编码
//来源于http://www.imooc.com/wenda/detail/458679

记住,千万不要在vs code这类软件里打开mp3,用其中的base64扩展转换成base64。 因为mp3文件本身并不是文本信息,vs code这类字编辑软件会用unicode等字体编码来打开mp3文件,最后进行的转换是unicode乱码转成base64的结果,并不是mp3转成base64的结果。所以请一定要注意。

输出结果是这样的:

红框告知数据类型,这样audio解码base64后就知道音频格式,就可以正确播放;绿框告知这是base64编码,audio读到这里也会知道使用的是base64而不是其他;绿框后面逗号之后的部分就是完整的base64编码了。如果你的编码没有红框绿框的部分,请自己加上。mp3使用 audio/mpeg,wav使用audio/wav,还可以支持非常非常多格式,其他格式可以上网查找(这里有  )。红框绿框之间用英文分号分割,绿框与base64数据之间用逗号分隔。

这样就可以直接复制到audio标签的src属性中了。

我们可以根据不同乐器构建多个js文件,其中存放该乐器一部分音高的base64等信息。设计一个播放器.js,根据当前加载的乐器.js实现音高播放,播放器.js中使用web audio api来实现音高变调,这样填充相邻音高之间的音符,节省乐器.js的空间(实际的乐器.js只需要几百KB);然后在网页中设计、插入可以更换乐器的.js,更换乐器.js实现实时将所更换的乐器.js名称传入播放器.js中,来达到切换音色。这是最终的目的,如果需求没有这样复杂,直接在服务器用多个mp3分好文件夹和名字就可以了,mp3本身够小了,base64会大个10kb左右。

已经有大佬这么做了,这是一个github上叫WebAudioFont的项目,作者就是使用这种方法逻辑,来实现网页乐器。网页所占的空间出乎意料的小(大多不超过1m,取决于乐器音域大不大),可以演奏不同乐器的音。

这个项目把所有gm音色128个乐器都弄出来了,纯js+HTML,没有任何音频文件,都是base64加乐器.js的模式,有需要的可以直接套用。

这样的逻辑让js显得更像一个“乐器”,而不是简单的音频调用。

网页示例,点击不同琴键可以发出不同的音高

上图是播放器.js部分内容,作者还实现了ADSR调整功能、混响和滤波器等功能,并且在html界面中可以实现根据用户的调整实时传入乐器.js参数,更改乐器:

 

上图是乐器.js,file 属性储存的是各个音频的base64,还有相应的音高信息、采样率信息等等。储存了钢片琴8个音高,实现播放25个音(2个八度),只有小小的147KB。

(作者使用开源的sf2音色库提取出的音频,和web audio api写的合成器来制作所有乐器,见项目readme)

不错的开发方式

对于网页音乐应用开发来说,这种方式貌似很实用,可以自己搭建一个乐器.js库,供自己随时调用。一部分可以节约一些带宽(貌似伪命题,追求音质的话大压缩肯定不能进行,那样文件照样大,base64也会更大些;唯一可以节省的是浏览器的文件询问次数),一部分也可以让用户无法直接获取到音频,相当于上了一层加密,用户就不能直接拦截xxx.wav yyy.mp3的地址进行下载了。但是对于前端经验丰富的程序员什么的来说还是没用的(((

这种方式恰好的解决了我的需求,在此做学习整理,不是什么高深也不是罕见的东西,希望能学习到更多网页音频开发方式。

posted on 2021-11-14 20:07  DreamOnTheGo  阅读(15904)  评论(0编辑  收藏  举报