入力とデコード範囲
本ツールは,ユーザーが指定した音声ファイル(MP3,WAV,AAC,M4Aなど)をブラウザ上で読み込み,再生速度や音程の調整を行うためのWebアプリケーションです.ファイルの読み込みには,Web Audio APIのdecodeAudioDataメソッドを使用しています.
そのため,入力可能な音声フォーマットは,実行しているブラウザの種類やバージョン,OSのメディアコンポーネントに強く依存します.例えば,特定のブラウザでは再生可能な独自の圧縮形式であっても,別のブラウザではデコードに失敗する場合がある点に留意してください.
システムへの過度な負荷や端末のメモリ枯渇を防ぐため,入力データには厳格な制限を設けています.読み込めるファイルサイズは最大50MiBまで,音声の持続時間は5分(300秒)までとしています.さらに,チャンネル数はモノラル(1ch)またはステレオ(2ch)のみに対応し,ブラウザ内で非圧縮のFloat32Array形式として展開された後のデータサイズが64MiBを超過する場合は,エラーとして処理を即座に中断します.
長時間の音声ファイルや,極端にサンプリングレートが高いハイレゾ音源などを扱う場合は,あらかじめ別のソフトウェア等で短く分割するか,一般的な44.1kHzや48kHzといった適切なフォーマットにダウンサンプリングしてから本ツールに入力する必要があります.
ファイルの読み込みとデコードに成功すると,画面上に視覚的な波形シミュレーションが描画されます.この波形表示は,原音の音声データを48の区間に分割し,それぞれの区間における振幅のピーク値を算出して視覚化したものです.あくまで大まかな音量の推移を把握するための目安であり,音質の精密な評価に使用できるものではありません.
また,これは原音のピーク表示であるため,設定を変更した後の処理済みの波形を反映しているわけでもないことにご留意ください.
独立した速度と音程
一般的な音声再生において,AudioBufferSourceNodeのplaybackRateを単純に変更すると,再生速度とピッチ(音程)が同時に比例して変化してしまいます.早送りすれば甲高い声になり,遅くすれば低い声になるのがその典型的な動作です.本ツールでは,Mozilla Public License 2.0 (MPL-2.0) で提供されている「SoundTouchJS」ライブラリを組み込むことで,これら2つの要素を独立して制御する仕組みを実装しています.
ユーザーインターフェース上には,「再生速度(テンポ)」と「音高(ピッチ)」の2つのスライダーが配置されています.再生速度は,元のテンポを1.0倍とし,0.5倍(遅い)から2.0倍(速い)までの範囲を0.05刻みで精密に指定できます.一方,音高の調整は,音楽的な半音単位(キー)で行われます.
元の音高を0とし,-12半音(1オクターブ下)から+12半音(1オクターブ上)までの範囲を1刻みの整数で指定可能です.ピッチのみを変更した場合,音声の再生時間は元のバッファの長さから変わりません.
これら2つのパラメータは内部でSoundTouchJSの演算アルゴリズムに個別の引数として渡され,指定された速度倍率とピッチシフト量に基づいたタイムストレッチングおよびピッチシフティング処理が適用されます.ただし,速度や音程は独立した設定値として指定できるものの,デジタル信号処理(DSP)のアルゴリズムを介して変換が行われるため,処理の過程で音質の変化,波形の微細な変動,丸め誤差,または音声末尾のわずかな切り詰めなどが発生する可能性があります.
原音のあらゆる特性が完全な状態で保持されるわけではない点に注意が必要です.
処理とプレビュー
設定された速度および音程のパラメータを実際の音声波形に適用するプロセスは,設定が変更されるたびにオーディオ全体の再計算を要求します.本ツールでは,パラメータのスライダーが操作された時点で,現在の再生状態や前回生成済みのバッファを一旦破棄し,再生または書き出しの実行時に改めて全体の変換処理を行うアプローチを採用しています.
これにより,プレビュー再生時の音声と,最終的に書き出されるファイル音声との間に不整合が生じることを構造的に防いでいます.
実際の波形変換処理にはAudioWorkletを使用し,メインのUIスレッドとは異なるバックグラウンドのコンテキストでSoundTouchJSのアルゴリズムを実行します.具体的には,非同期のprocessOffline関数を呼び出し,入力されたAudioBuffer全体に対して指定されたplaybackRateとpitchSemitonesを適用した新しい処理済みのAudioBufferを生成します.
再生ボタンが押されると,この変換後のAudioBufferが新しく生成されたAudioBufferSourceNodeにセットされ,GainNodeを経由してブラウザの出力先(AudioContext.destination)へとルーティングされます.
このメモリ上での変換プロセスでは,安全性のために2つの異なる上限値を設けています.変換後の出力に使用されるFloat32バッファのサイズが128MiBを超える場合,または後段で生成されるWAV PCMデータのサイズが128MiBを超える場合は,ブラウザのメモリ保護のために例外エラーを表示して処理を即座に停止します.
プレビュー再生中は,requestAnimationFrameを用いて現在の再生時間を高頻度で算出し,変換後の持続時間に基づいたプログレスバーを滑らかに更新し続けます.
音量・シーク・再選択
プレビュー再生中のインターフェースでは,変換後の音声バッファに対する柔軟な操作を提供しています.プログレスバーによるシーク機能は,変換「後」の音声の長さを基準として動作します.例えば,再生速度を2.0倍に設定した場合,音声の物理的な持続時間は半分になりますが,シークバーもこの半減した持続時間を最大値として動的に再構成されます.
シーク操作において,ユーザーがシークバーのつまみを任意の位置へ移動させた際の挙動は現在の状態に依存します.再生中であれば,現在稼働中の再生ノードは即座に停止されて指定された秒数をオフセットとして新たなAudioBufferSourceNodeが生成され,再生が再開されます.
一方,停止中にシークバーを動かした場合は,再生位置のインジケーターのみが移動し,勝手に再生が始まることはありません.
音量調整は,再生経路に挿入されたGainNodeのgain.valueプロパティを操作することで実現しています.0.0(無音)から1.0(元の信号と同等の倍率)までの範囲でゲイン係数を設定でき,ミュート(消音)ボタンを押した場合は即座にゲイン値が0に強制設定されます.
ここで設定できる音量1.0という値は,あくまで元のデジタル信号に対する倍率を示すものであり,物理的なdB(デシベル)単位での絶対的な音圧を保証するものではありません.
また,ドラッグ&ドロップまたはファイル選択ダイアログを通じて別の音声ファイルが再選択された場合は,現在再生中のソースや適用済みの古いバッファなどを外して初期化しますが,AudioContext自体は破棄せずに同じContextを再利用して次の処理に備えます.AudioContextのcloseメソッドが呼び出され完全に破棄されるのは,ユーザーがタブを閉じるなどしてページ自体が破棄されるタイミングのみとなります.
WAV書き出し
本ツールでは,変換処理が完了した音声を最終的なファイルとして保存する際,実時間の録音(MediaRecorder APIを用いた再生音のキャプチャなど)は行いません.プレビュー再生に使用するものと全く同じオフライン処理関数を呼び出し,メモリ上に生成された全体のAudioBufferから直接バイナリデータを構築します.
これにより,実時間再生を待つことによる無音の混入リスクや,バックグラウンドタブへ移行した際の処理の中断,録音タイミングのずれといったトラブルを回避しています.
WAV書き出し機能が実行されると,内部のencodePcmWav関数が呼び出されます.この関数は,AudioBufferの各チャンネルに含まれるFloat32Arrayデータ(-1.0〜1.0の浮動小数点数)を先頭から順に走査し,16bitの符号付き整数(-32768〜32767)に量子化します.
同時に,RIFFヘッダ,fmtチャンク,dataチャンクからなる正規のWAVEファイルヘッダをDataViewを用いてエンディアンを意識しながらバイトレベルで構築し,PCMデータと結合して一つのBlobオブジェクト(audio/wav)を生成します.
この際,画面上で設定された音量スライダーの数値やミュート状態も,各サンプルデータに対する振幅の乗数として適用されます.そのため,ミュート状態で書き出しを行った場合,出力されるWAVファイルは完全な無音のデータとなります.生成されたBlobはURL.createObjectURLを通じて一時的なダウンロードリンクに変換され,元のファイル名に「_processed」を付与したWAVファイルとしてユーザーのローカル端末に保存されます.
負荷と音質・通信範囲
本ツールが提供するタイムストレッチングおよびピッチシフティング機能は,実行環境のCPUリソースに依存した集中的なデジタル信号処理を行います.特に,長時間の音声ファイルに対して極端な速度変更や音程変更を適用する場合,処理の完了までに一定の演算待機時間が発生します.
また,原音から大きく離れたパラメータ(例えば+12半音への急激なシフトや,0.5倍速の大幅な時間伸長など)を設定した場合は,オーバーラップアドアルゴリズムの特性上,音質の顕著な変化やアーティファクト(不自然な残響,音の揺れ,位相の乱れ)が目立つようになります.
これはブラウザ上でのJavaScriptベースの処理における技術的な限界も含まれています.
セキュリティとデータ通信の観点について,本ツールはユーザーが入力した音声データ自体や,変換後のバイナリデータを,保存や解析,機械学習の目的で外部の処理サーバーへ送信することはありません.波形のデコード,SoundTouchJSによる演算変換,WAVフォーマットへのエンコードといった一連の処理は,すべてユーザーが使用している端末のブラウザメモリ上で完結します.
ただし,変換処理を行うためのAudioWorkletプログラム(soundtouch-processor.js等)は,本ツールがホストされているのと同じウェブサイトからその都度非同期でスクリプトとして読み込まれる実装となっています.そのため,ネットワーク接続を完全に遮断したオフライン環境でページを初めて開いたり,キャッシュを削除した状態で再読み込みしたりした場合などは,モジュールのロードに失敗し,変換機能が実行できなくなります.
利用時にはインターネット接続環境でのロードを前提としています.