使用wavesurfer.js繪製音頻波形圖小白極速上手總結

1、簡介css

  1.1  引html

    人生中第一份工做公司有語音識別業務,須要作一個web網頁來整合語音引擎的標註結果和錯誤率等參數,並提供人工比對的語音標註功能(功能相似於TranscriberAG等),(博主有點話癆。。。適應適應,原諒我)前端

  能夠直接讀第二行,簡單來講,我用wavesurfer.js繪製波形,並提供語音標註的文本框進行音頻標註,簡易頁面以下:jquery

    

  1.2 啥是wavesurf?web

    wavesurfer.js是一個可自定義的語音音頻可視化工具,創建於web audio和H5 canvas之上chrome

   

2、Let's  Startcanvas

 wavesurfer.js官網:https://wavesurfer-js.org/,官方文檔爲全英文,(chrome瀏覽器的翻譯功能很不錯),官網中文檔option中有建立時的全部參數,method中有可調用的方法,API文檔也很全面,可自取實現,
跨域

  本文是wavesurf的簡單實現小白教程瀏覽器

  按照下面步驟,你就能夠極速的應用wavesurfer.js實現一個音頻的可視化啦~~ide

  一、將wavesurfer.js的包引用到項目中

 

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

 

  二、爲wavesurfer.js開闢一個空間,用來畫圖

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

 

  三、在script標籤中,建立一個wavesurfer實例,傳遞容器選擇器及一些選項(更多選項在官方文檔option中,可查閱自行添加)

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

 

  四、加載音頻。用wavesurfer.js方法中的load(),直接傳入音頻路徑便可,能夠是在線音頻(需注意跨域問題),更多可用函數參閱文檔中的Method一項

wavesurfer.load('audio.wav');

  五、咱們能夠用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>

3、貼一份能夠直接運行的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>

4、上述代碼運行效果

 

  (水平有限,日誌基本做記錄本之用,歡迎指正錯誤,歡迎交流)

原文出處:https://www.cnblogs.com/zhangxingcomeon/p/10428895.html

相關文章
相關標籤/搜索