現場でPC1つ!簡単に録音・FFT・wav保存するPythonコード

  • このエントリーをはてなブックマークに追加
Advertisements

ものづくりの現場で、精密な計測器はないけど今すぐに音声を録音して周波数分析したい!さらにwavファイルに保存して後でゆっくり分析したい!というPython使いのための記事です。ここでは当ブログのコードを寄せ集めてこのようなニーズにマッチするプログラムを紹介します。

こんにちは。wat(@watlablog)です。ここではPCしかない状況を想定し、Pythonによる録音/周波数分析/wavファイル保存を行うためのコードを紹介します

ちょっと録音して周波数分析したい状況

急に付近から異音が発生して原因を分析したい時

NVHNoise-Vibration-Harshness)エンジニアは通常音振動の分析に専門の計測器とソフトウェアを使います。

小野測器さんやB&Kさんといった専門の機器とソフトを使う事で、信頼性の高い計測結果を得る事が可能ですが、一般にそれらを一式そろえるとかなり高額になってしまいます。

そのため専門の計測器は予約表を使ってシェアしている企業が多いのではないでしょうか。

そんな背景で仕事中に付近から異音が発生、すぐに原因を調査したい状況があった場合、いちいち計測器を予約して置き場まで取りに行ってからいざ計測しようと思ったら音が消えていた…という事にもなりかねません。

異音が周期的に鳴っている場合は周波数分析をする事で、熟練したエンジニアなら原因をすぐに特定する事が可能です。

デジタル化の進んできた現代であれば、社員1人1人にPCが渡されている企業も多いと思いますが、普通のPC1台で録音、周波数分析、証拠である音声ファイルの保存ができればこの状況に対応する事が可能です。

スマホが使えない時もある

スマホで録音してフーリエ変換すれば良いじゃん!

…と思いますが、機密情報を扱う企業であれば通常カメラ付き携帯やスマホの使用は業務利用禁止になっている場合が多いです。仕事中に持ち込みすらできない職場もあります。

このような状況でも信号処理プログラミングの知識があれば、すぐに録音や分析、ファイル保存ができます。

この記事ではプログラミングのハードルが比較的低いPythonを使って気軽に自分のPCで音声録音、周波数分析、音声ファイル(wavファイル)保存ができるようになる事を目標とします。

Python環境の準備

Advertisements

今回は以下の記事で紹介している内容を組み合わせたコードを書いています。それぞれの記事におけるコードが実行できる環境である事が前提です。

録音(PyAudio)

当ブログでは、以下の記事でPyAudioを使った録音コードを紹介しました。

PythonのPyAudioで音声録音をする簡単な方法

PyAudioは録音関係でかなりデファクトスタンダードなライブラリですが、インストール時にエラーが発生しやすく、先の記事で紹介している方法を使って対応する必要があります。

フーリエ変換(Scipy)

また、「PythonでFFT実装!SciPyのフーリエ変換まとめ」や「ただPythonでcsvから離散フーリエ変換をするだけのコード」でフーリエ変換による周波数分析方法を紹介しました。

wavファイル保存(PySoundFile)

さらに、「Pythonでモノラルとステレオのwavファイルを保存する方法」という記事でwavファイルの保存に関する知見を得ました。

今回はこれらの記事をコラボして、冒頭で紹介しました状況に対応するコードを組み上げます。

PC1台で録音とフーリエ変換とwav保存を行うコード

全コード(コピペ用)

以下は全コードです。上で紹介した記事のコードが動く環境であれば、コピペ動作するはずです。

使い方は後述します。

使い方

計測時間を変更する

録音する時の計測時間はtimeの値を変更します。単位は秒です。

マイクチャンネルを設定する

マイクのチャンネルはindexで指定しますが、これはPCによって異なります。コードを実行すると、オーディオデバイスの一覧を表示させるようになっています。

もし録音デバイスのエラーが出る場合は、出力ウィンドウに表示されるメッセージを見てデバイス番号が正しいかを確認してみてください。

wavファイル名を設定する

filenameを変更すると録音した後に保存されるwavファイルの名前を変える事ができます。

dB変換と聴感補正有無を変更する

周波数分析は以下の関数で行います。dbrefが0の時はdB変換聴感補正を行いません。

今回はPCマイクを使って「音」を測定しているため、dB変換と聴感補正をデフォルトで行っていますが、もしdB変換は行いたいけど、聴感補正は行いたくないという場合は引数AをFalseにしてください。

dB変換や聴感補正は以下の記事を参考にしてください。

Pythonで音圧のデシベル(dB)変換式と逆変換式!
Pythonで聴感補正(A特性)の曲線を作る!

実行結果

以下が実行結果です。時間波形と周波数波形がプロットされます。
いつも通り、口笛を吹いてみました。1000[Hz]を狙ったのですが、オシイ。

結果

wavファイルも出来ているはずです。

ただ、インパルス信号が入ってしまうとwavファイルのレンジが大きくなってしまい、後で再生する時にほとんど音が聞こえなくなるかも知れません。
この辺はレンジを固定にする等の改善をした方が良いかも知れません。

追記:自動でマイクチャンネルを取得して録音するコード

Python/PyAudioでマイクのチャンネルを確認する方法!」に自動でマイクチャンネルを取得するコードを追記しました。これにより手動でマイクを選択する必要がなくなります。

新たにget_mic_index()関数を作成し、index = get_mic_index()[0]で最初のマイクチャンネルを選択しています。もしマイクチャンネルが複数ある場合はユーザーに選択させる処理を別途追加すると良いかもしれません。

まとめ

この記事では、PyAudioによる録音、Scipyによるフーリエ変換、PySoundFileによるwav保存をまとめてみました。

これでちょっと思い立った時に、高価な測定器を予約しなくてもとりあえずの音声分析ができるようになりました。

もちろんここで紹介しているコードによる音声分析結果は、

  • 音響校正されていない。
  • アンチエリアジングフィルタが付いていない。
  • PCマイクの素性がよくわからない。

…といった事から信頼性がとても低い事に注意してください。

正式なデータはしっかり定期点検されている専門機器で測定しましょう。

間に合わせ程度ですが、PCマイクによる録音を活用してみました!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

SNSでもご購読できます。

コメントを残す

*