Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】【Android】AudioRecordで録音機能を実装する(PCM→WAV変換まで)

2025年09月29日に「Qiita」が公開したITニュース「【Android】AudioRecordで録音機能を実装する(PCM→WAV変換まで)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Androidで録音機能を実装する記事。AudioRecordを使い、生の音声データ(PCM)をWAV形式に変換し保存する方法を解説する。MediaRecorderとの違いも言及する。

ITニュース解説

Androidアプリで音声を録音する機能は、ユーザーの声を記録したり、音声認識に利用したりと、様々な用途で活用されている。Androidには録音を実現するためのAPIがいくつか存在するが、その中でも特に柔軟性の高いAudioRecordというAPIを使って、録音から音声ファイルの保存までを実装する手順について解説する。

一般的な録音にはMediaRecorderというAPIも使われる。これは録音から音声形式のエンコード、そしてファイル保存までを自動で行ってくれる手軽なAPIだ。しかし、MediaRecorderでは録音された生の音声データ、つまり「加工されていないそのままの音のデータ」を直接扱うことができない。例えば、録音中にリアルタイムで音声にエフェクトをかけたり、独自の圧縮方式で保存したりといった、より高度な処理をしたい場合には不向きである。そこで活躍するのがAudioRecordだ。AudioRecordは、生の音声データを「PCM」という形式で直接取得できるため、開発者が音声データを自由に加工・処理できるという大きなメリットがある。

AudioRecordを使って録音を開始する前に、いくつかの準備と設定が必要になる。まず、アプリがマイクにアクセスし、録音したデータをストレージに保存するための権限、すなわち「パーミッション」をユーザーから許可してもらう必要がある。具体的には、アプリのマニフェストファイルに録音と書き込みの権限を記述し、さらにAndroid 6.0以降のデバイスでは、アプリの実行中にユーザーに対して明示的にこれらの権限を要求する処理を実装しなければならない。

次に、AudioRecordオブジェクトを初期化する。この初期化の際に、録音の品質や形式に関する様々な設定を指定する。設定項目は多岐にわたるが、主要なものは以下の通りである。オーディオソースは、どこから音を取り込むかを指定する。通常はデバイスのマイク(MediaRecorder.AudioSource.MIC)を使用する。サンプリング周波数は、1秒間に何回音の波形を記録するかを示す数値で、音質の細かさを決定する。高いほど音質は向上するが、データ量も増える。例えば、CD品質は44.1kHz(1秒間に44100回記録)が一般的である。チャンネル設定は、モノラル(AudioFormat.CHANNEL_IN_MONO)かステレオ(AudioFormat.CHANNEL_IN_STEREO)かを指定する。モノラルは一つのチャンネルで音を記録し、ステレオは左右の2つのチャンネルで音を記録する。オーディオフォーマットは、記録する音声データの形式を指定する。最も一般的なのは、16ビットの符号付き整数で音の振幅を表すAudioFormat.ENCODING_PCM_16BITである。16ビットは音の強弱を65536段階で表現できることを意味し、一般的な音声録音に十分な品質を提供する。最後にバッファサイズは、録音された音声データを一時的に保持するためのメモリ領域のサイズを指定する。このバッファに一定量のデータが溜まると、そのデータがファイルに書き込まれる。適切なバッファサイズを設定することで、スムーズな録音処理が可能になる。

これらの設定が完了したら、AudioRecordオブジェクトを生成し、いよいよ録音処理を開始する。startRecording()メソッドを呼び出すことで、マイクからの音声データの取得が始まる。録音されたデータは、指定したバッファサイズに基づいて、メモリ上のバッファに順次書き込まれていく。このバッファから実際に音声データを読み出すには、繰り返しread()メソッドを呼び出す必要がある。read()メソッドは、バッファに溜まったPCM形式の生データをバイト配列として取得する。PCMデータとは、アナログの音の波形をデジタル化する際に、一定時間ごとにその瞬間の音の大きさを数値として記録したものだ。この処理は録音中ずっと続ける必要があり、時間がかかる処理であるため、Androidアプリのユーザーインターフェース(UI)を操作する「UIスレッド」とは別の「ワーカースレッド(バックグラウンドスレッド)」で実行することが非常に重要である。UIスレッドで重い処理を行うと、アプリが固まったり、動作が遅くなったりする原因となるからだ。録音を終了する際には、stop()メソッドを呼び出して録音を停止し、その後release()メソッドを呼び出してAudioRecordオブジェクトが使用していたシステムリソースを解放する。リソースの解放は、メモリリークや他のアプリとの競合を防ぐために不可欠な手順である。

AudioRecordで取得したデータは、前述の通りPCM形式の生データである。このPCMデータは、それ単体では多くのメディアプレーヤーで直接再生することは難しい。なぜなら、そのデータがどのような設定(サンプリング周波数、チャンネル数、ビット数など)で記録されたものなのかという情報が含まれていないためだ。そこで、この生データをより汎用的な音声ファイル形式に変換する必要がある。最も一般的な方法の一つが、WAV(Waveform Audio File Format)形式への変換である。WAV形式は、PCMデータを格納するための「コンテナフォーマット」の一つであり、録音されたPCMデータだけでなく、そのデータを再生するために必要なメタデータ(付帯情報)を「ヘッダ」と呼ばれる部分に含んでいる。このヘッダ情報があることで、再生プレーヤーはWAVファイルを正しく解釈し、音声を再生できるようになる。

WAVファイルを作成するプロセスは次のようになる。まず、録音中に取得したPCMデータを、一時的なファイル(または直接WAVファイルの一部)として順次書き込んでいく。録音処理がすべて完了し、PCMデータの書き込みが終わった時点で、このデータ量と録音時の設定情報(サンプリング周波数、チャンネル数、ビット数など)に基づいてWAVヘッダの情報を計算し、ファイルの一番先頭に書き込む。WAVヘッダには、ファイル全体のサイズ、PCMデータのサイズ、サンプリング周波数、チャンネル数、1秒あたりのデータ量(バイトレート)、1サンプルあたりのバイト数などの情報が含まれる。これらの情報を正確に設定することで、標準的なWAVファイルとして完成し、様々なプレーヤーで再生可能になる。このヘッダの書き込みは、バイナリデータとしてファイルの特定の位置に正確な値を書き込む必要があるため、バイトオーダーやデータの型に注意が必要である。

このように、AndroidのAudioRecord APIを利用することで、単に音声を録音するだけでなく、その生の音声データを直接扱い、WAV形式のような汎用的なフォーマットに変換するまでの詳細なプロセスを開発者自身で制御できる。MediaRecorderのような手軽なAPIでは実現できない、音声データへの深い理解と、より高度なカスタマイズ性・柔軟性が得られる点がAudioRecordの最大の魅力である。音声認識やリアルタイムのエフェクト処理、特定の圧縮アルゴリズムの適用など、将来的に多様な音声処理機能を実装したいと考えるシステムエンジニア志望者にとって、AudioRecordの習得は非常に価値のあるステップとなるだろう。

関連コンテンツ

関連IT用語