web端音频播放插件wavesurfer.js简单使用图文教程 绘制音频波纹图

0 560
索鸟 2020-10-19
需要:0索币

 人生中第一份工作公司有语音识别业务,需要做一个web网页来整合语音引擎的标注结果和错误率等参数,并提供人工比对的语音标注功能(功能类似于TranscriberAG等),(博主有点话痨。。。适应适应,原谅我)

  可以直接读第二行,简单来说,我用wavesurfer.js绘制波形,并提供语音标注的文本框进行音频标注,简易页面如下:

    

  1.2 啥是wavesurf?

    wavesurfer.js是一个可自定义的语音音频可视化工具,建立于web audio和H5 canvas之上

   

二、Let's  Start

 wavesurfer.js官网:https://wavesurfer-js.org/,官方文档为全英文,(chrome浏览器的翻译功能很不错),官网中文档option中有创建时的所有参数,method中有可调用的方法,API文档也很全面,可自取实现,

  本文是wavesurf的简单实现小白教程

  按照下面步骤,你就可以极速的应用wavesurfer.js实现一个音频的可视化啦~~

  1、将wavesurfer.js的包引用到项目中

 

<script src="https://unpkg.com/wavesurfer.js"></script>

 

  2、为wavesurfer.js开辟一个空间,用来画图

1
<div id="waveform" class="waveform"></div>

 

  3、在script标签中,创建一个wavesurfer实例,传递容器选择器及一些选项(更多选项在官方文档option中,可查阅自行添加)


var wavesurfer = WaveSurfer.create({
    container: '#waveform',
    waveColor: 'violet',
   cursorColor:'#ff0000',
   progressColor:'#0000ff',
});

 

  4、加载音频。用wavesurfer.js方法中的load(),直接传入音频路径即可,可以是在线音频(需注意跨域问题),更多可用函数参阅文档中的Method一项

wavesurfer.load('audio.wav');

  5、我们可以用wavesurfer.playpause()   和 wavesurfer.stop()创建好用的播放暂停按钮和重播按钮,需要注意的是要在相应的html中创建button

    var playPause = document.querySelector('#playPause');
    playPause.addEventListener('click', function() {
        wavesurfer.playPause();
    });
    wavesurfer.on('play', function() {
        document.querySelector('#play').style.display = 'none';
        document.querySelector('#pause').style.display = '';
    });
    wavesurfer.on('pause', function() {
        document.querySelector('#play').style.display = '';
        document.querySelector('#pause').style.display = 'none';
    });

btnStop.addEventListener('click', function () {
wavesurfer.stop();
});

  创建相应按钮:


    <div class="box">
         <button id="playPause">
                            <span id="play">
                                <i class=""></i>
                                Play
                            </span>

                            <span id="pause" style="display: none">
                                <i class=""></i>
                                Pause
                            </span>
                        </button>

        <button id="btnStop">Stop</button>
    </div>

三、贴一份可以直接运行的demo!

       demo中加入了时间插件(timeline),频谱插件(spectrogram)、光标插件(cursor)等,可自行删除,

   此代码运行还需要将相应的插件从官网下载下来,再将音频存入合适位置即可

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <link href="test.css" type="text/css" rel="stylesheet">
  7     <script src="jquery.js"></script>                      //可自行下载jquery包
  8 </head>
  9 
 10 <body>
 11     <h1> ZX test demo Wavesurfer.js</h1>
 12     <br/> <br/> <br/> <br/> <br/>
 13 
 14     <script src="wavesurfer.min.js"></script>                   //此包需要从官网下载下来,src中填入合适路径即可
 15     <script src="wavesurfer.timeline.js"></script>              //此包需要从官网下载下来,src中填入合适的路径即可
 16     <script src="wavesurfer.cursor.js"></script>                //此包需要从官网下载,直接打开插件源码,按ctrl+s 选择路径保存即可,src中填入合适的路径
 17     <script src="wavesurfer.spectrogram.js"></script>            //这几个包都一样
 18 
 19 
 20     <div id="waveform" class="waveform"></div>
 21     <br/>
 22     <div id="wave-timeline" class="wave-timeline"></div>
 23     <div class="zoom">
 24        <!-- <input data-action="zoom" type="range" min="1" max="200" value="0" style="width: 100%" />    -->
 25         <input data-action="zoom" type="range" min="1" max="200" value="0" />
 26     </div>
 27     <div id="wave-spectrogram" class="wave-spectrogram"></div>
 28     <br/> <br/>
 29     <div class="box">
 30          <button id="playPause">
 31                             <span id="play">
 32                                 <i class=""></i>
 33                                 Play
 34                             </span>
 35 
 36                             <span id="pause" style="display: none">
 37                                 <i class=""></i>
 38                                 Pause
 39                             </span>
 40                         </button>
 41 
 42         <button id="btnStop">Stop</button>
 43     </div>
 44     <script>
 45 document.addEventListener('DOMContentLoaded', function() {
 46 var wavesurfer = WaveSurfer.create({
 47     container: '#waveform',
 48     barHeight: 2,
 49     cursorColor:'#ff0000',
 50     progressColor:'#0000ff',
 51     scrollParent:true,
 52     height:160,
 53     cursorWidth:2,
 54     autoCenter:false,
 55     fillParent:true,
 56     hideScrollbar:false,
 57 
 58 
 59     plugins: [
 60     WaveSurfer.timeline.create({                             //timeline plugin
 61         container: "#wave-timeline",
 62         height: 10,
 63     }),
 64     WaveSurfer.cursor.create({                              //cursor plugin
 65             container:"#wave-cursor",
 66             showTime: true,
 67             opacity: 1,
 68             customShowTimeStyle: {
 69                 'background-color': '#000',
 70                 color: '#fff',
 71                 padding: '2px',
 72                 'font-size': '10px'
 73             }
 74         }),
 75      WaveSurfer.spectrogram.create({
 76             wavesurfer: wavesurfer,
 77             container: "#wave-spectrogram",
 78             labels: true,
 79             fftSamples:512
 80         })
 81   ]
 82 
 83 
 84 });
 85 
 86 //TimeLine
 87 wavesurfer.on('ready', function () {
 88   var timeline = Object.create(WaveSurfer.timeline);
 89 
 90   timeline.create({
 91     wavesurfer: wavesurfer,
 92     container: '#wave-timeline'
 93   });
 94 });
 95 
 96 // load 音频
 97 wavesurfer.load('0f35840eeddd47e6a6d0fe0971db277c.wav');      //此处添加自己的音频路径(可将音频存入前端可访问的文件夹内,避免跨域)
 98 
 99 console.log(wavesurfer.getDuration());                 //test
100 console.log(wavesurfer.getVolume());                   // test
101 setTimeout(function(){                                //test
102    console.log(wavesurfer.getDuration());
103 },500)
104 
105 //Stop
106 btnStop.addEventListener('click', function () {
107     wavesurfer.stop();
108 });
109 // PlayPause
110     var playPause = document.querySelector('#playPause');
111     playPause.addEventListener('click', function() {
112         wavesurfer.playPause();
113     });
114     // Toggle play/pause text
115     wavesurfer.on('play', function() {
116         document.querySelector('#play').style.display = 'none';
117         document.querySelector('#pause').style.display = '';
118     });
119     wavesurfer.on('pause', function() {
120         document.querySelector('#play').style.display = '';
121         document.querySelector('#pause').style.display = 'none';
122     });
123 
124     var d1 = new Date();                          //test
125     console.log(d1.toLocaleString());               //test
126     console.log('test');                            //test
127 
128       // Zoom slider
129     var slider = document.querySelector('[data-action="zoom"]');
130     slider.value = wavesurfer.params.minPxPerSec;
131     slider.min = wavesurfer.params.minPxPerSec;
132     slider.addEventListener('input', function() {
133         wavesurfer.zoom(Number(this.value));
134     });
135 
136 });
137     </script>
138 </body>
139 </html>
复制代码

四、上述代码运行效果

 

  (水平有限,日志基本作记录本之用,欢迎指正错误,欢迎交流)

回帖
  • 消灭零回复
相关主题
2020年最新最新Kubernetes视频教程(K8s)教程 2
程序员转型之制作网课变现,月入过万告别996 1
索鸟快传2.0发布啦 1
两个不同网络的电脑怎么实现文件的互相访问呢? 1
网盘多账号登录软件 1
Java实战闲云旅游项目基于vue+element-ui 1
单点登录技术解决方案基于OAuth2.0的网关鉴权RSA算法生成令牌 1
QT5获取剪贴板上文本信息QT设置剪贴板内容 1
springboot2实战在线购物系统电商系统 1
python web实战之爱家租房项目 1
windows COM实用入门教程 1
C++游戏开发之C++实现的水果忍者游戏 1
计算机视觉库opencv教程 1
node.js实战图书管理系统express框架实现 1
C++实战教程之远程桌面远程控制实战 1
相关主题
PHP7报A non well formed numeric value encountered 0
Linux系统下关闭mongodb的几种命令分享 0
mongodb删除数据、删除集合、删除数据库的命令 0
Git&Github极速入门与攻坚实战课程 0
python爬虫教程使用Django和scrapy实现 0
libnetsnmpmibs.so.31: cannot open shared object file 0
数据结构和算法视频教程 0
redis的hash结构怎么删除数据呢? 0
C++和LUA解析器的数据交互实战视频 0
mongodb errmsg" : "too many users are authenticated 0
C++基础入门视频教程 0
用30个小时精通C++视频教程可能吗? 0
C++分布式多线程游戏服务器开发视频教程socket tcp boost库 0
C++培训教程就业班教程 0
layui的util工具格式时间戳为字符串 0
C++实战教程之远程桌面远程控制实战 1
网络安全培训视频教程 0
LINUX_C++软件工程师视频教程高级项目实战 0
C++高级数据结构与算法视频教程 0
跨域问题很头疼?通过配置nginx轻松解决ajax跨域问题 0