音声ファイルピッチ・速度変更

音声ファイルの再生速度(テンポ)と音程(ピッチ)を,ブラウザ上で個別に調整するツールです.変換後の音声は16bitのWAV形式で保存できます.ファイルの処理は端末のメモリ内で行われます.

読み込み中...

このツールが向いている用途

操作欄に戻る ↑

ブラウザー上で音声ファイル(最大50MiB/5分)の再生速度(0.5〜2倍)とピッチ(-12〜12半音)を個別に調整し,16bit PCM WAVとして出力します.

まず試せること

サンプルボタンで440Hz・2秒音源を読み込み,速度2倍・ピッチ0でWAV生成すると,約1秒の440Hz音源が出力されます.

利用条件

対応形式はブラウザーに依存し,展開後64MiB・処理後128MiBまでです.音量とミュートもWAVに反映されます.設定変更後は再生成が必要で,大きな変更では音質が変わる場合があります.

ZeroToolsのブラウザ内処理とプライバシー

ZeroToolsは,入力内容を端末内で処理するツールを中心に提供しています.各ツールの対応範囲と制限を確認して利用してください.

データの取り扱い・プライバシー方針
第1章

入力とデコード範囲

本ツールは,ユーザーが指定した音声ファイル(MP3,WAV,AAC,M4Aなど)をブラウザ上で読み込み,再生速度や音程の調整を行うためのWebアプリケーションです.ファイルの読み込みには,Web Audio APIのdecodeAudioDataメソッドを使用しています.

そのため,入力可能な音声フォーマットは,実行しているブラウザの種類やバージョン,OSのメディアコンポーネントに強く依存します.例えば,特定のブラウザでは再生可能な独自の圧縮形式であっても,別のブラウザではデコードに失敗する場合がある点に留意してください.

システムへの過度な負荷や端末のメモリ枯渇を防ぐため,入力データには厳格な制限を設けています.読み込めるファイルサイズは最大50MiBまで,音声の持続時間は5分(300秒)までとしています.さらに,チャンネル数はモノラル(1ch)またはステレオ(2ch)のみに対応し,ブラウザ内で非圧縮のFloat32Array形式として展開された後のデータサイズが64MiBを超過する場合は,エラーとして処理を即座に中断します.

長時間の音声ファイルや,極端にサンプリングレートが高いハイレゾ音源などを扱う場合は,あらかじめ別のソフトウェア等で短く分割するか,一般的な44.1kHzや48kHzといった適切なフォーマットにダウンサンプリングしてから本ツールに入力する必要があります.

ファイルの読み込みとデコードに成功すると,画面上に視覚的な波形シミュレーションが描画されます.この波形表示は,原音の音声データを48の区間に分割し,それぞれの区間における振幅のピーク値を算出して視覚化したものです.あくまで大まかな音量の推移を把握するための目安であり,音質の精密な評価に使用できるものではありません.

また,これは原音のピーク表示であるため,設定を変更した後の処理済みの波形を反映しているわけでもないことにご留意ください.

第2章

独立した速度と音程

一般的な音声再生において,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)のアルゴリズムを介して変換が行われるため,処理の過程で音質の変化,波形の微細な変動,丸め誤差,または音声末尾のわずかな切り詰めなどが発生する可能性があります.

原音のあらゆる特性が完全な状態で保持されるわけではない点に注意が必要です.

第3章

処理とプレビュー

設定された速度および音程のパラメータを実際の音声波形に適用するプロセスは,設定が変更されるたびにオーディオ全体の再計算を要求します.本ツールでは,パラメータのスライダーが操作された時点で,現在の再生状態や前回生成済みのバッファを一旦破棄し,再生または書き出しの実行時に改めて全体の変換処理を行うアプローチを採用しています.

これにより,プレビュー再生時の音声と,最終的に書き出されるファイル音声との間に不整合が生じることを構造的に防いでいます.

実際の波形変換処理にはAudioWorkletを使用し,メインのUIスレッドとは異なるバックグラウンドのコンテキストでSoundTouchJSのアルゴリズムを実行します.具体的には,非同期のprocessOffline関数を呼び出し,入力されたAudioBuffer全体に対して指定されたplaybackRateとpitchSemitonesを適用した新しい処理済みのAudioBufferを生成します.

再生ボタンが押されると,この変換後のAudioBufferが新しく生成されたAudioBufferSourceNodeにセットされ,GainNodeを経由してブラウザの出力先(AudioContext.destination)へとルーティングされます.

このメモリ上での変換プロセスでは,安全性のために2つの異なる上限値を設けています.変換後の出力に使用されるFloat32バッファのサイズが128MiBを超える場合,または後段で生成されるWAV PCMデータのサイズが128MiBを超える場合は,ブラウザのメモリ保護のために例外エラーを表示して処理を即座に停止します.

プレビュー再生中は,requestAnimationFrameを用いて現在の再生時間を高頻度で算出し,変換後の持続時間に基づいたプログレスバーを滑らかに更新し続けます.

第4章

音量・シーク・再選択

プレビュー再生中のインターフェースでは,変換後の音声バッファに対する柔軟な操作を提供しています.プログレスバーによるシーク機能は,変換「後」の音声の長さを基準として動作します.例えば,再生速度を2.0倍に設定した場合,音声の物理的な持続時間は半分になりますが,シークバーもこの半減した持続時間を最大値として動的に再構成されます.

シーク操作において,ユーザーがシークバーのつまみを任意の位置へ移動させた際の挙動は現在の状態に依存します.再生中であれば,現在稼働中の再生ノードは即座に停止されて指定された秒数をオフセットとして新たなAudioBufferSourceNodeが生成され,再生が再開されます.

一方,停止中にシークバーを動かした場合は,再生位置のインジケーターのみが移動し,勝手に再生が始まることはありません.

音量調整は,再生経路に挿入されたGainNodeのgain.valueプロパティを操作することで実現しています.0.0(無音)から1.0(元の信号と同等の倍率)までの範囲でゲイン係数を設定でき,ミュート(消音)ボタンを押した場合は即座にゲイン値が0に強制設定されます.

ここで設定できる音量1.0という値は,あくまで元のデジタル信号に対する倍率を示すものであり,物理的なdB(デシベル)単位での絶対的な音圧を保証するものではありません.

また,ドラッグ&ドロップまたはファイル選択ダイアログを通じて別の音声ファイルが再選択された場合は,現在再生中のソースや適用済みの古いバッファなどを外して初期化しますが,AudioContext自体は破棄せずに同じContextを再利用して次の処理に備えます.AudioContextのcloseメソッドが呼び出され完全に破棄されるのは,ユーザーがタブを閉じるなどしてページ自体が破棄されるタイミングのみとなります.

第5章

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ファイルとしてユーザーのローカル端末に保存されます.

第6章

負荷と音質・通信範囲

本ツールが提供するタイムストレッチングおよびピッチシフティング機能は,実行環境のCPUリソースに依存した集中的なデジタル信号処理を行います.特に,長時間の音声ファイルに対して極端な速度変更や音程変更を適用する場合,処理の完了までに一定の演算待機時間が発生します.

また,原音から大きく離れたパラメータ(例えば+12半音への急激なシフトや,0.5倍速の大幅な時間伸長など)を設定した場合は,オーバーラップアドアルゴリズムの特性上,音質の顕著な変化やアーティファクト(不自然な残響,音の揺れ,位相の乱れ)が目立つようになります.

これはブラウザ上でのJavaScriptベースの処理における技術的な限界も含まれています.

セキュリティとデータ通信の観点について,本ツールはユーザーが入力した音声データ自体や,変換後のバイナリデータを,保存や解析,機械学習の目的で外部の処理サーバーへ送信することはありません.波形のデコード,SoundTouchJSによる演算変換,WAVフォーマットへのエンコードといった一連の処理は,すべてユーザーが使用している端末のブラウザメモリ上で完結します.

ただし,変換処理を行うためのAudioWorkletプログラム(soundtouch-processor.js等)は,本ツールがホストされているのと同じウェブサイトからその都度非同期でスクリプトとして読み込まれる実装となっています.そのため,ネットワーク接続を完全に遮断したオフライン環境でページを初めて開いたり,キャッシュを削除した状態で再読み込みしたりした場合などは,モジュールのロードに失敗し,変換機能が実行できなくなります.

利用時にはインターネット接続環境でのロードを前提としています.

よくある質問(FAQ)

A.
はい,可能です.SoundTouchJSライブラリを使用しており,再生速度(0.5〜2.0倍)と音程(-12〜+12半音)のそれぞれを独立して設定できます.速度のみを変更しても音程の基準は維持され,音程のみを変更しても再生時間は変わりません.設定変更後は都度処理をやり直して再生します.
A.
お使いのブラウザのdecodeAudioData APIが対応している形式(一般的にMP3,WAV,M4Aなど)を読み込めます.ただし,1ファイルあたり上限50MiB,長さ5分,展開後のデータサイズが64MiB以内である必要があります.モノラルまたはステレオ音声に対応しています.
A.
実時間のマイク録音や再生キャプチャは行いません.変換処理後のオーディオバッファから直接16bit PCM WAV形式のファイルを生成して書き出します.このとき,画面上の音量スライダーやミュートの設定もWAVデータに反映されます(ミュート時は無音となります).
A.
選択した音声データ自体を外部の処理サーバーへ送信することはありません.波形のデコードや変換処理は端末のブラウザ内で行われます.ただし,変換処理に必要なAudioWorkletプログラム(SoundTouchJS関連ファイル)を同じウェブサイトから都度読み込むため,ネットワーク通信は発生します.