親子IoTワークショップ

マイコンとクラウドを使ってIoTとプログラミングを学ぼう

[ トップ | 開催予定・概要 | 2024-12開催 | お知らせ | Facebook ]

マイクを使って音を録音する

ここでは、ラズパイに接続されているマイクを使って録音する方法を説明します。前段階として、マイクの接続を終わらせておいてください。

録音する音の品質を調整する

録音をする最も単純なコマンドは、以下のとおりです。

arecord -d 5 test.wav

「-d 5」は、録音時間が5秒であることを指示しています。「test.wav」が、出力の音声ファイルです。このコマンドで、昔のアナログ固定電話(や3G携帯電話)の品質で録音されます。

上記コマンドが終了したら、「Bluetoothスピーカーを使う」を参考に、出力された音声ファイルを再生して、録音が正常にされたことを確認してください。例えば以下のようにします。

aplay test.wav

上記の録音例では、アナログ固定電話の品質を使いました。録音する音の品質を調整するには、以下のように「-f」というオプションを追加します。

arecord -d 5 -f cd test-cd.wav

ここで「-f cd」はCDの品質で録音、を意味しています。アナログ固定電話の品質で録音したファイル(test.wav)と、CD品質で録音したファイル(test-cd.wav)を聞き比べると、CD品質の方が音声がよりクリアで、背景の雑音(バックグラウンド・ノイズ)がより少なくなっていると思います。また、2つのファイルのサイズを比べると、CD品質のものの方が20倍程度大きくなっているはずです。このように品質を上げると、それにともなってファイルサイズも大きくなります。

美しい音の録音が目的ではなく、何かの記録を音声として残すことが目的なら(つまりIoT機器らしい目的では)、固定電話の品質で問題ないはずです。何回も繰り返し録音する場合や、録音した音をインターネット上で共有する場合(Kintoneなどを使う場合)には、特にそう言えると思います。低い品質で始めて、品質が悪すぎると実感したら(音がよく聞こえない、声を聞き取れないなど)、高い品質へ移行するのがよいと思います。

ただし、固定電話の品質は低すぎるが、CD品質では品質が高すぎる、ということもあります。そういう場合には次のセクションを読んでください。

サンプリングレートとビット深度

録音する音の品質は、サンプリングレートとビット深度(bit depth)で微調整できます。

先の例では、CDの品質で録音しました。これはサンプリングレートが44.1 kHz(44,100 Hz)ということです。サンプリングレートとは、1秒間に何回音を採取・測定しているかを示す数値です。つまり、CD品質の音には、1秒間に44,100回細分化された音が取り込まれています。一方、アナログ固定電話の品質では、サンプリングレートは8 kHz(8,000 Hz)です。

サンプリングレートが高いということは、1秒間により多くの音が細かく取り込まれており、逆にサンプリングレートが低いと、より少ない音が取り込まれています。したがって、サンプリングレートを上げると録音した音の質が上がり、サンプリングレートを下げると音の質も下がります。音の質が上がれば、データ(ファイル)サイズは大きくなり、音の質を下げると小さくなります。

アナログ固定電話は非常に低い音声品質の例(8 kHz)、CDは高品質の例(44.1 kHz)として使いました。日常生活でよく耳にする音は、この両者の間に位置しています。例えば、IP電話は16 kHz、最近の携帯電話は16 kHzか32 kHz、AMラジオは16 kHz、FMラジオは32 kHzです。TVやDVD、Blu-rayは48 kHzです。

録音する音の品質を微調整するもうひとつの道具が、ビット深度(bit depth)です。単純に「ビット」とか「ビット数」と言う時もあります。これは、音を採取・測定する際に使う情報量を表すものです。画像でいうところの「解像度」だと思ってもらえればよいと思います。ビット数を上げると、より多くの情報を使って音を表現するので、より鮮明な音になります。それにともない、データ(ファイル)サイズも大きくなります。ラズパイでarecordコマンドを使う場合は、ビット深度として8ビットか16ビットを使うことがほとんどです。

さて、アナログ固定電話よりは品質が高く、CDよりは品質が低い音を録音するには、以下のようにします。

ビット数 サンプリングレート コマンド例
8 bits 16 kHz arecord -d 5 -f U8 -r 16000 test.wav
16 bits 8 kHz arecord -d 5 -f S16_LE -r 8000 test.wav
16 bits 16 kHz arecord -d 5 -f S16_LE -r 16000 test.wav
16 bits 16 kHz arecord -d 5 -f S16_LE -r 32000 test.wav

「U8」は、「Unsigned 8 bits」、「S16_LE」は「Signed 16 bits, Little Endian」の略なのですが、詳細は省略します。また、「-f U8」にするとモノラル録音、「-f S16_LE」にするとステレオ録音になります。

このページに冒頭に書いたように、arecordコマンドに-fオプションを指定しない場合は、アナログ固定電話の品質での録音になります。これは以下のオプションで録音するのと同じことです(ビット深度が8ビットでサンプリングレートが8 KHz)。

arecord -d 5 -f U8 -r 8000 test.wav

また、arecordコマンドに「-f cd」のオプションを使うとCD品質での録音になりますが、これは以下のオプションで録音するのと同じことです(ビット深度が16ビットでサンプリングレートが44.1 kHz)。

arecord -d 5 -f S16_LE -r 44100 test.wav

ちなみに、最近巷では「ハイレゾ・オーディオ」(high-resolution audio)という言葉を聞くことがあります。これは、サンプリングレートとビット数が48 kHzと16ビットを超えている音のことを指します。サンプリングレートは96kHzや192kHzなど、ビット数は24や32が使われます。

音声ファイルをWAVからMP3やAACへ変換する

arecordコマンドで録音すると、音声ファイルはWAV(ウェイヴ、またはワヴ)形式で保存されます(.wavファイル)。この形式は、音の「生データ」のようなもので、データの圧縮はなされていません。したがって、通常.wavファイルのサイズは巨大です。ここで圧縮とは、音の品質をできるだけ落とさずに、データのサイズを小さくすることを意味します。

音声を圧縮したデータ形式として有名なのがMP3やAACです。.wavファイルを.mp3ファイルへ変換するには、以下のコマンドを実行します。

ffmpeg -i test.wav test.mp3

.wavファイルを.aacファイルへ変換するには、以下のコマンドを実行します。

ffmpeg -i test.wav test.aac

MP3やAACに圧縮すると、ファイルサイズは1/10程度になると思います。圧縮されたファイルを再生するには、以下コマンドを実行します(vlcコマンドについては「Bluetoothスピーカーを使う」を参照)。

vlc -I dummy test.mp3 --play-and-exit

vlc -I dummy test.aac --play-and-exit

WAVはデータ形式としては重要ですが、.wavファイルとして使用(配布・共有)することはほとんどありません。通常は、MP3やAACなどの圧縮データファイルにして使用します。そこで、arecordコマンドで録音したら、.wavファイルを作らずに直接.mp3ファイルや.aacファイルを作ることも可能です。以下のコマンドは、音声ファイルをMP3で保存しています。

arecord -d 5 -f cd | ffmpeg -i - test.mp3

コマンド最後の部分のmp3をaacに変えると、音声ファイルをAACで保存できます。

プログラムを使ってマイクから録音する

マイクから音声を録音するPythonプログラムが、record-sound.pyです。上記のようなコマンドをsubprocess.run()に渡すだけです。

自習プロジェクトの目次に戻る