2024-02-04
動画 = 画像の集まり + 音声
音声 = 音圧の集まり
音圧は数で表すことができ、高低の周期が聞こえる音の高さとなる。

1秒間に4万回くらい、計測した音圧を32bit(4byte)の浮動小数の-1から1の数にした配列が音データ。このままだと1秒間に160kbyte、1分間で10MBという容量になるところを、扱いやすく1/10くらいに圧縮する1995年に誕生した技術がMP3(エムピースリー)。


「code4fukui/MP3: lame mp3 encoding library wrapper, with binary compiled to web assembly」

WebAssemblyで実装されたMP3エンコーダーを検索して見つけた「vincentcr/lame-wasm」をフォークして、ESモジュール化。encodeという関数をひとつもつだけのシンプルなMP3クラスとしてまとめなおしました。 import { MP3 } from "https://code4fukui.github.io/MP3/MP3.js"; const freq = 440; const sampleRate = 44100; const sec = 5; const len = (sec * sampleRate) >> 0; const vol = 0.5; const buf = new Float32Array(len); for (let i = 0; i < len; i++) { const th = (i * freq / sampleRate) * (2 * Math.PI); buf[i] = Math.sin(th) * vol; } const mp3bin = await MP3.encode([buf], { vbrQuality: 5, // 0-9 default 5 sampleRate, // default 44100 debug: true, // boolean }); console.log(mp3bin, mp3bin.length); 440Hzの正弦波の音データ(buf)を作って、MP3で保存するプログラムです。サンプリング周波数と、圧縮具合とともに、encodeを呼び出せばMP3データのできあがり!

1998年誕生のC言語で作られた有名オープンソースMP3エンコーダー「LAME」がWebAssemblyによって現代でも活躍!WebAssemblyは、bin2jsを使ってESモジュールフレンドリーに変換しました。


「MP3.js demo」

ブラウザ上でもサクッと使えます!


ブラウザで動くオープンソースな音声エディタ「audiomass.co」で表示してみました。こちら、vbrQuality 0 で、もっとも圧縮率が低い、つまり原音に忠実なもの。


こちらvbrQuality 9 で、もっとも圧縮率が高いもの。見た目で波形の崩れが確認できます。

音と遊ぼう!

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS