Web開発
Show HN: ミニマルなAudacityのWeb版を作ってみました
Show HN: I think I made my own web version of minimalistic audacity (github.com)
要約
HERTZは、Web Audio APIとFFmpeg.wasmを活用したクライアントサイドのオーディオ処理エンジンです。サーバーサイド処理に依存せず、ユーザーのブラウザ内でリアルタイムにボーカルの加工を行います。Zero-Serverアーキテクチャを採用し、レイテンシー、帯域幅コスト、プライバシーリスクを排除することを目指しています。
全文翻訳
HERTZ 高忠実度クライアントサイドオーディオ処理エンジン。
HERTZは、インスタントなボーカルポリッシングのために設計されたWebベースのデジタルオーディオワークステーション(DAW)ユーティリティです。
リアルタイム信号処理のためにWeb Audio APIを、クライアントサイドエンコーディングのためにFFmpeg.wasmを活用しています。
Linux上のFFmpegバイナリに依存する従来のツールとは異なり、HERTZはWebAssemblyを介してユーザーのブラウザスレッド内で完全に実行されます。
コアアーキテクチャ
アプリケーションは「Zero-Server」アーキテクチャ上に構築されています。
目標は、機密性の高いオーディオデータをクラウドストレージにアップロードすることに伴うレイテンシー、帯域幅コスト、プライバシーリスクを排除することです。
パイプライン
取り込み:多様な入力フォーマット(WAV、MP3、M4A、OGG)を32ビット浮動小数点オーディオバッファにデコードします。
操作:Wavesurfer.jsのリージョンを使用した非破壊編集レイヤーを提供し、ユーザーがサンプル精度の開始/終了ポイントを定義できるようにします。
デジタル信号処理(DSP):リアルタイムよりも高速なレンダリングのためにOfflineAudioContextを構築します。
ハードコードされたボーカルチェーン(EQ -> コンプレッサー -> リミッター)を介してオーディオをルーティングします。
分析パスでピーク振幅を決定し、正確な正規化を行います。
エンコーディング:処理されたバッファをffmpeg.wasm仮想ファイルシステムに転送します。
192kbps VBRでLAME MP3エンコーディングを実行します。
結果のBlobをユーザーのダウンロードマネージャーに直接ストリームします。
信号チェーン仕様
HERTZは汎用プリセットを使用しません。
オーディオエンジンは、話し言葉やポッドキャストの明瞭度に最適化された特定のボーカルチェーンを実装しています。
1. ハイパスフィルター
カットオフ:80Hz
Q:1.4
目的:コンシューマーマイクにしばしば見られるサブベースのランブルやDCオフセットアーティファクトを除去します。
2. ダイナミクスコンプレッサー
ポンピングアーティファクトを導入することなく、ボーカルのダイナミックレンジを平準化するように設計されたハードニーコンプレッサー。
しきい値:-20.0 dB
比率:3.1:1
ニー:5.0 dB
アタック:0.03秒(30ms)
リリース:0.1秒(100ms)
3. 正規化
圧縮後のゲインステージングにより、放送ラウドネス規格への準拠が保証されます。
ターゲット:-3.0 dBピーク
方法:絶対最大振幅スキャンに基づく線形ゲイン計算。
技術的制約とブラウザセキュリティ
HERTZは、FFmpeg.wasmでのマルチスレッド処理を容易にするためにSharedArrayBufferに依存しています。
最新のブラウザでは、Spectre/Meltdown脆弱性を防ぐために、厳格なセキュリティヘッダーの背後でこの機能を制限しています。
HERTZをローカルまたは本番環境で実行するには、ホストが以下のヘッダーを提供する必要があります。
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
これらのヘッダーが欠落している場合、ffmpeg.wasmの初期化に失敗し、アプリケーションはバッファ割り当てエラーをスローします。
付属のvite.config.tsは、ローカル開発用にこれを処理します。
インストールと開発要件
Node.js 18.x 以降
NPMまたはBunパッケージマネージャー
WebAssemblyをサポートするモダンブラウザ(Chrome 90+、Firefox 90+、Safari 15+)
セットアップ
# リポジトリをクローン
git clone https://github.com/askpext/hertz.git
# ディレクトリに移動
cd hertz
# 依存関係をインストール
npm install
ローカルでの実行
npm run dev
アプリケーションは http://localhost:5173 で起動します。
本番環境向けビルド
npm run build
これにより、/dist に静的アセットバンドルが生成されます。
注意:index.htmlをローカルで直接開くことはできません。必要なCOOP/COEPヘッダーをサポートするWebサーバー(例:Vercel、Netlify、GitHub Pages)経由で提供する必要があります。