深入淺出 Web Audio API
大 廠 技 術 堅 持 周 更 精 選 好 文
-
2011被提出,同年草案被Google Chrome和Mozilla Firefox實現
-
在此之前Web音訊較為原始,無法應付較為複雜的應用場景,例如Web遊戲或互動應用
-
旨在提供全套Web音訊解決方案,包含現代遊戲音訊引擎和一些混錄、加工、過濾的能力,可實現部分數字音訊工作站(DAW)的功能
基本概念
音訊數字訊號處理 Audio DSP

-
包含 振盪器 (oscillator), 濾波器 (filter), 合成器 (synthesiser)等功能
聲訊號 Sound Signal
-
20~20,000Hz頻率 震動 (vibration)產生的 聲波 (sound wave),通過 模擬訊號 (analogue signal)或 數字訊號 (digital signal)表示,可被 麥克風 (microphone)、樂器 拾音器 (pickup)等換能裝置轉換後 取樣 (sample),或直接被 合成 (synthesise)
-
震動的 頻率 (frequency)稱為 音高 (pitch), 振幅 (amplitude)稱為 音量 (volume)
-
將取樣的 連續取值 (continuous-valued)模擬訊號近似為 離散值 (discrete-valued)數字訊號,從而實現數字化,常用方法 脈衝編碼調製 (pulse-code modulation, PCM )
-
數字音訊的 取樣率 (sample rate)指的是每秒數字音訊取樣的個數,單位為Hz,通常使用48,000Hz或44,100Hz

時域 Time Domain

-
訊號的時域波形表達訊號隨著時間的變化而變化, 示波器 (oscilloscope)可以展示訊號的時域波形。
頻域 Frequency Domain
-
通過數學運算進行時域和頻域的互相轉換,音訊領域常見的有 傅立葉變換 (Fourier transform), 快速傅立葉變換演算法 (FFT algorithm)

音訊上下文 AudioContext


-
Web Audio API提供了**
AudioContext
作為音訊DSP操作的上下文空間,內部實現了一套 模組化路由**(modular routing) -
使用的時候,需要
connect
,用完可以disconnect
-
輸入向輸出方向“流動”
-
suspend resume close
-
安全:使用者必須提供user gesture,否則保持
suspended
狀態

音訊節點 AudioNode
-
音訊上下文中的基礎單元
-
常用節點
-
ScriptProcessorNode
:利用JavaScript直接生成、處理、分析音訊,deprecated but commonly used -
分析器(
AnalyserNode
) -
合併聲道(
ChannelMergerNode
) -
分離聲道(
ChannelSplitterNode
) -
音訊輸出(
AudioDestinationNode
):預設輸出(AudioContext.destination
) -
MediaStream(
MediaStreamAudioDestinationNode
):WebRTCMediaStream
-
增益(
GainNode
):音量增益db -
延遲(
DelayNode
):延遲輸出效果 -
卷積(
ConvolverNode
):混響 -
立體聲均衡(
StereoPannerNode
):立體聲效果 -
空間均衡(
PannerNode
):3D -
波形畸變器(
WaveShaperNode
):扭曲效果 -
動態壓縮(
DynamicsCompressorNode
):壓縮、側鏈 -
雙二階濾波器(
BiquadFilterNode
):EQ均衡 -
振盪器(
OscillatorNode
):持續產生指定頻率週期的正弦波(sine),方波(square),鋸齒波(sawtooth),三角波(triangle)和自定義週期波 -
音訊緩衝(
AudioBufferSourceNode
):解碼後的PCM資料 -
媒體元素(
MediaElementAudioSourceNode
):HTML5 -
MediaStream(
MediaStreamAudioSourceNode
):WebRTCMediaStream
-
音訊源
-
音效
-
音訊輸出
-
聲道處理
-
視覺化
-
特殊
例:使用振盪器,增益和自定義週期波,分析
具體地址可以檢視 CodePen:http://codepen.io/jamesliu96/pen/oNGgWOb

例:淡入淡出Mixer
具體地址可以檢視 CodePen:http://codepen.io/jamesliu96/pen/jOYedQR

例: Chime [1]

旋律來自個人聽音扒譜,音樂版權歸原作者所有
例: Pitcher [2]

幅度 Amplitude
-
方均根

自相關 Auto Correlate
-
離散自相關

音高 Pitch
基於十二平均律,標準音高為440Hz

p = #MIDI
f = 頻率
當 f = 440:p = 69
A440 = 440Hz = #69
Web Audio API - Web APIs | MDN [3]
Web Audio API - Web API 介面參考 | MDN [4]
http://tonejs.github.io/
參考資料
Chime: http://jamesliu.info/chime/
Pitcher: http://jamesliu.info/pitcher/
Web Audio API - Web APIs | MDN: http://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API
Web Audio API - Web API 介面參考 | MDN: http://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API
- END -
:heart: 謝謝支援
以上便是本次分享的全部內容,希望對你有所幫助^_^
喜歡的話別忘了 分享、點贊、收藏 三連哦~。
歡迎關注公眾號 ELab團隊 收貨大廠一手好文章~
我們來自位元組跳動,是旗下大力教育前端部門,負責位元組跳動教育全線產品前端開發工作。
我們圍繞產品品質提升、開發效率、創意與前沿技術等方向沉澱與傳播專業知識及案例,為業界貢獻經驗價值。包括但不限於效能監控、元件庫、多端技術、Serverless、視覺化搭建、音視訊、人工智慧、產品設計與營銷等內容。
歡迎感興趣的同學在評論區或使用內推碼內推到作者部門拍磚哦
位元組跳動校/社招投遞連結: http://job.toutia o.com/
內推碼: 7 EZKXME
- 使用 WebAssembly 打造定製 JS Runtime
- 前端也要懂演算法,不會演算法也能微調一個 NLP 預訓練模型
- 聯機遊戲原理入門即入土 -- 入門篇
- Plasmo Framework:次世代的瀏覽器外掛開發框架
- 深入理解 Mocha 測試框架:從零實現一個 Mocha
- Single Source of Truth:XCode SwiftUI 的介面編輯的設計理念
- 深入理解 D3.js 視覺化庫之力導向圖原理與實現
- 淺析神經網路 Neural Networks
- Cutter - Web視訊剪輯工具原理淺析
- 你可能需要一個四捨五入的工具函式
- 淺析eslint原理
- 最小編譯器the-super-tiny-compiler
- Git儲存原理及部分實現
- 淺談短鏈的設計
- Web元件構建庫-Lit
- 使用Svelte開發Chrome Extension
- Web3.0開發入門
- vscode外掛原理淺析與實戰
- 深入淺出 Web Audio API
- 探祕HTTPS