JavaScriptでWeb Audio APIを使って音声を収録する方法

4682 ワード

この記事について

この記事ではJavaScriptで Web Audio API を使って音声を収録する方法について紹介します。関連リソースを下記に示します。

おおまかな手順

おおまかな手順を下記に示します。

  1. コーディングの準備
  2. コーディング
  3. 動作確認

コーディングの準備

下記のコマンドを実行してコーディングの準備をします。

mkdir javascript-audio-recorder
cd javascript-audio-recorder
npm init -y
npm install --save-dev http-server
touch audio-recorder.js encode-audio.js index.html main.js

コーディング

index.html

エディタでindex.htmlを開き、下記の内容を入力します。

audio-recorder.js

エディタでaudio-recorder.jsを開き、下記の内容を入力します。

ポイントを下記に示します。

  1. isRecordingパラメーターを定義します。
  2. isRecordingパラメーターが1の時にバッファーにサンプルを格納します。
  3. バッファーの要素数が1以上の時にメッセージを送信します。
  4. AudioRecorderをAudio Workletとして登録します。

encode-audio.js

エディタでencode-audio.jsを開き、下記の内容を入力します。

main.js

続いてエディタでmain.jsを開き、下記の内容を入力します。

ポイントを下記に示します。

  1. マイクから音声を取り込むためのメディアストリームを取得します。
  2. 分解能やサンプリング周波数などの設定値を取得します。
  3. audio-recorder.jsからモジュールを読み込みます。
  4. メディアストリームを扱うためのノードを作成します。
  5. ワークレットを利用するためのノードを作成します。
  6. ワークレットからメッセージを受信した時のイベントハンドラを設定します。
  7. ワークレットからのメッセージを受信を開始します。
  8. メディアストリーム、ワークレット、スピーカーを接続します。なお、ワークレットは何も出力しないのでスピーカーから音声は再生されません。
  9. ワークレットのisRecordingパラメーターを1に設定して収録を開始します。
  10. ワークレットのisRecordingパラメーターを0に設定して収録を停止します。
  11. encodeAudio関数を呼び出して収録された音声をWAVE形式に変換します。

動作確認

index.htmlをWebブラウザで開くだけではaudioContext.audioWorklet.addModuleの呼び出しに失敗するため、下記のコマンドを実行してWebサーバーを起動します。

npx http-server -c-1

Webブラウザを開いて http://localhost:8080 にアクセスします。

Webブラウザのアドレスバーに http://localhost:8080 と入力しています。

マイクへのアクセスの許可を求められるので「許可」ボタンをクリックします。

Webブラウザのアドレスバーの下に「http://localhost:8080が次の許可を求めています」「マイクを使用する」のメッセージに加え、ブロックボタンと許可ボタンが表示されています。

「Start」ボタンをクリックすると収録を開始します。

StartボタンをクリックするとStartボタンが無効になり、Stopボタンが有効になります。

「Stop」ボタンをクリックすると収録が停止します。

StopボタンをクリックするとStopボタンが無効になり、Startボタンが有効になります。

再生ボタンをクリックすると音声が再生されます。

再生ボタンをクリックすると再生ボタンが一時停止ボタンに変化します。

参考Webページ

記事を作成する上で参考にしたWebページを下記に示します。

おわりに

音声を収録するには MediaStream Recording API を利用する方法もあり、こちらの方が圧倒的に簡単です。MediaStream Recording APIの使い方については JavaScriptでMediaStream Recording APIを使って音声を収録する方法の記事 で紹介していますので興味がありましたら併せてご覧いただければ幸いです。最後までお読みいただきありがとうございました!