« 高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab) | トップページ | Bluetoothヘッドセット買ってみた »

2022年9月 4日 (日)

Raspberry PiでUSBマイクから連続録音させる

表題の通りです。Raspberry Piで録音させます。

とある仕事で、環境音を拾う必要性が出たため、一番手ごろなRaspberry Piを使おうと思った次第。

このため、

1.Raspberry Piを起動したら、録音開始

2.ある一定時間ごとのファイルを作っては、次々に保存していく

という、この2つの機能を有することが条件です。

1.については、/etc/rc.local あたりをいじって自動実行させればいいですが、2.についてはどうすればいいの?

と思って調べてみたら、思いの外、簡単でした。

ということで、手順を書いていきます。

と、その前に。

Img_2265

こういうものを買っておきました。USB接続のマイクです。なんと700円ほど。

Raspberry Piには、マイクがないですからね。USBで実装するのがもっともお手軽な方法。

にしてもこのパッケージ、どこかで見たような……妙に既視感があるので、過去に同じものを買ってる可能性があります。

Img_2268

で、こいつをシンプルに、USBポートにぶっ刺して起動します。

さて、録音する方法にもいろいろとあるんですが、一番手っ取り早いのは「arecord」というコマンドを使う、という方法。

今どきのRaspberry Pi OSには元々から入ってるみたいです。

まず、Raspberry Piにて、

> arecord -L

と入力。すると、

Raspi_mic_01

こんな感じの画面がずらずらっと出てきます。こいつの中で、最後の赤線の部分の名前を使います。

で、続いて、

> arecord --device "plughw:CARD=Device,DEV=0" --channels 1 --format S16_LE --rate 22050 --max-file-time 10 --use-strftime "%Y%m%d/%Y%m%d_%H%M%S_%v.wav"

と入力してやります。

少々長いですが、注意する点は

 --device の後ろに”(さっきのコマンドで調べた機器名)” を入れる

 --max-file-time の後ろに、区切りたい秒数を入れる(ここでは10秒おき)

の二つですかね。あとはそのまま使います。

なお、--rate の後ろの数値(サンプリングレート)を22050ではなく、44100を使いたいところですが、そうするとRaspberry Piがオーバーフローを起こしてしまうようで、上手くいきませんでした。

これを実行すると、あとは勝手に録音を開始、WAVファイルを生成し続けます。止めるときは、Ctrl+Cにて。

すると、arecordを実行したディレクトリに日付のフォルダができて、その下に”(日付)_(時刻)_(No.).wav”みたいなファイルができているはずです。

Raspi_mic_03

これをPCにもっていき、音声を確認。

マイクがヘボなおかげか、ちょっと音が小さかったですね。

が、確かに10秒おきの録音ができておりました。

で、ここまでで、目的のことは可能になりました。

が、これでおしまいでは面白くないので、音声をヒートマップ化して確認してみます。

引用元が分からなくなってしまったのですが、とあるところから入手したコードを、ちょっとだけいじって利用。


import sys
import numpy as np
import librosa
import matplotlib.pyplot as plt
import scipy.io.wavfile
import librosa.display
 
 
#音声ファイル読み込み
args = sys.argv
wav_filename = "20220904_162319_01.wav"
rate, data = scipy.io.wavfile.read(wav_filename)
 
#16bitの音声ファイルのデータを-1から1に正規化
data = data / 32768
# フレーム長
fft_size = 1024
# フレームシフト長
hop_length = int(fft_size / 4)  

# 短時間フーリエ変換実行
amplitude = np.abs(librosa.core.stft(data, n_fft=fft_size, hop_length=hop_length))
 
# 振幅をデシベル単位に変換
log_power = librosa.core.amplitude_to_db(amplitude)
 
# グラフ表示
librosa.display.specshow(log_power, sr=rate, hop_length=hop_length, x_axis='time', y_axis='hz', cmap='jet')
plt.colorbar(format='%+2.0f dB')  
plt.title('スペクトログラム' ,fontname="MS Gothic")
plt.show()

これを使い、WAVファイルをスペクトログラム表示させます。

Raspi_mic_02

こんな感じになりました。

マイクの特性か、8000Hzに妙な筋が入りますね。

ラジオの音を拾わせていたんですが、まあまあの周波数分布が得られます。

こちらは、ご参考まで。

とりあえず、狙いとする環境音の収集・分析には使えそうな感触。

ただし、マイクだけはもうちょっといいものを使うのが推奨かなぁ、と感じます。今どきはリモート会議用にいいものが売られているので、それを使うのが良さげですよね。

コンデンサーマイク USBマイク PCマイク 単一指向性 PCゲームマイク ノイズ軽減 ミュートボタン LED指示ライト マイクスタンド付き Skype 録音 生放送 YOUTUBE ゲーム実況 在宅勤務に適応

« 高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab) | トップページ | Bluetoothヘッドセット買ってみた »

Raspberry Pi・Arduino・電子工作」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« 高精度な画像生成AI「Stable Diffusion」を自分のPCで動かす方法(+ google colab) | トップページ | Bluetoothヘッドセット買ってみた »

無料ブログはココログ

スポンサード リンク

ブログ村