PyQt5で録音機能付きwav音声分析ソフトをつくってみた

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

 PythonでGUIアプリを作成できるPyQt5を使って、WATLABブログでは幾度も挑戦してきた音声分析ソフトをつくってみます。今回はChatGPTのヘルプももらってドラッグ操作やダブルクリック操作の実装、マルチウィンドウ機能といった本格的なGUIアプリにしてみました。

こんにちは。wat(@watlablog)です。ここではPyQt5を使ったGUIアプリの作成例として、録音機能付きのwavファイル音声分析ソフトを紹介します!

 本内容は#大晦日ハッカソン (connpass)で実施した内容です。

本記事の概要

モチベーション

Advertisements

 この記事では録音機能付きwavファイル音声分析ソフトをつくりますが、これまでもWATLABブログでは信号処理関連で似たような記事をたくさん書いてきました。ただ、やはり理想の音声処理ソフトにはほど遠いので、N番目のチャレンジとなります。

 以下モチベーションです。

もっと直感的に操作できる、自分が使いやすい音声分析ソフトが欲しい!
PyQt5は色々細かい実装ができると聞いたので使ってみたい!
(ChatGPTがある現代ならやってみればできるのでは!?)

なぜPyQtを選択したか?

 これまでWATLABブログでは色々なライブラリを使ってGUIアプリを作ってきました。例えばwxPythonはGUIコードを自動生成してくれる補助ツールwxFormBuilderを使って信号処理アプリをつくったことがあります。

 また、kivyを使ってモバイル適用を意識したFFTアナライザーをつくったりもしました。kivyはモダンなUIが揃っていることで最近人気があると思います。

 これまで習得したこれらwxPythonやkivy、Python標準であるTKinterを使わず、今回はPyQt5というライブラリを使ってGUIアプリをつくってみましたが、いくつかの理由があります。

Maplotlibの直感的な操作がやりたかった

 PyQt5を選択した理由は「Maplotlibの直感的な操作がやりたかった」からです。ChatGPTを駆使しながら、上記複数のライブラリでMatplotlibへのカーソル操作やドラッグ操作の追加を実装しようとしました。それが簡単にできたのがPyQt5だったということでこのライブラリで書いていこうと決めました。

 Matplotlibへのカーソル操作とドラッグ操作というのは以下の動画のことです。こんなことがやりたかった!

 本当はkivyでやりたかったのですが、自分の腕ではChatGPT o1を駆使しても満足のいく結果は得られませんでした(他のつよつよエンジニアならできそう)。

 本記事は1500行くらいのコードを紹介します。そのためそのすべてを詳細に紹介すると筆者が大変なので、アプリの使い方を抜粋して紹介する形式とします。

動作環境

 ここで紹介するコードは以下の環境で動作確認をしました。まだ未確認ですがmacOSにしか対応していない可能性が濃厚で、後でWindows版に対応したものを載せようと思います。

           
PC M3 Macbook Air, RAM:16GB, macOS:Sanoma14.5
Python 3.12.4
numpy 1.26.4
scipy 1.14.0
matplotlib 3.10.0
librosa 0.10.2.post1
torchaudio 2.5.1
sounddevice 0.5.1
PyQt5 5.15.11
pyaudio 0.2.14

録音機能付きGUIアプリの概要

全コード

 まずは以下のコードブロックに全コードを示します。ただしコードが長いので、すぐに読まない人は「」マークで折りたたむと次のコンテンツにスクロールせずにいけます。

Wav Analyzer Toolsの全コード

リアルタイム録音機能

 最初に紹介する機能はリアルタイム録音機能です。次の画像はプログラムを実行した直後の画面ですが、ボタン群は3つのグラフの下にまとめています。それぞれの説明は順にしていくとして、録音機能はRecord WAVボタンをクリックします。

wav record1

 Record WAVウィンドウが表示されます。

wav record2

 ここでは次の設定を順に行います。

  • Record Time [s]
     録音時間です。指定した秒数経過すると自動的に録音が停止します。
  • Select Microphone
     録音に使用するマイクを選択します。コードを立ち上げた段階で、自動的に使用可能なマイクがプルダウンリストに登録されます。もしUSB接続タイプやBluetooth通信タイプのマイクを使用したい場合はプルダウンから選択してください。
プルダウンから選択している例
  • Filename
     録音した音声を保存するwavファイルの名称です。デフォルトではrecordedと入力されているため、何も入力しないとrecorded.wavがプログラム実行フォルダに作成されます。同じ名前のwavファイルがすでにある場合は上書きされてしまうので注意しましょう。拡張子の入力は不要です。

 設定が終了したら青くなっているRecordボタンをクリックすることで録音が開始されます。録音中はボタンのラベルがStopに変わり色も赤くなりますが、このStopボタンをクリックすると指定秒数以内であっても録音を停止させることができます。

 こちらが録音機能のデモ動画です。録音中もリアルタイムにスペクトログラムの更新を確認できます。録音後に出てくるウィンドウをOKボタンで閉じると、メインの波形にデータが渡されます(画面の説明はwav読み込みの後)。

 リアルタイムにスペクトログラムを表示する方法は以下の記事で紹介しているので、気になる方は是非記事を読んでみてください。

参考)リアルタイムスペクトログラム更新のコード

wavファイル読み込み機能

 次はwavファイル読み込み機能の紹介です。メイン画面のLoad WAVボタンをクリックします。

wav読み込み1

 既に保存されたwavファイルを選択し、開きます(画面はPC毎に異なると思います)。

wavファイルの選択とオープン

グラフの説明

 録音したりwavファイルを読み込むと、メイン画面の3つのグラフにデータが入ります。このそれぞれの波形は次の画像の通り、時間波形(時間[s]×振幅[Lin])・スペクトログラム(時間[s]×周波数[Hz]×振幅[dB])・FFT波形(時間[s]×振幅[dB])です。

グラフの説明

音声再生機能(カーソル範囲指定と再生速度変更)

 カーソルで指定した範囲で音声を再生できます。カーソルは赤(初期位置)と青(停止位置)があり、Playボタンをクリックすることでこの範囲の音声が再生されます。再生途中でStopボタンをクリックすると、再生は途中で止まります。再度PlayボタンをクリックすることでStopしたところから再生を始めます。

 赤カーソルの位置が音声再生と連動して進行しますが、このカーソルの位置でリアルタイムにFFT波形が更新されます(マウスでドラッグしている時も更新されています)。

 また、Speed Factorの欄に0.1〜10までの再生速度を入力することができます。例えば0.5であれば半分の速度、2.0であれば倍速再生が可能です。

 こちらの動画は音声再生のデモ動画です(音声はwatのくちぶえ)。説明を読むより動画を見た方がはやいかもしれません。ちなみに再生中に色々な操作をするとどうなるかといった細かいバグ出しはまだしていないので、不具合が出たらアプリを落としたり、処理が完了するまで待ちましょう(ここは筆者怠慢ですがご容赦ください)。

グラフの軸設定変更

 時間波形、FFT波形、スペクトログラムの3つのグラフは軸設定を変更できます。それぞれのグラフ内任意の部分をダブルクリックすると、次の軸設定ウィンドウが表示されます。XYZ軸それぞれの値を任意の数に変更したら、OKで適用されます。

グラフの軸設定

 変更した軸設定はいつでもHomeボタンをクリックすることでデフォルトに戻すことができます。

Homeボタン

 こちらが軸設定変更のデモ動画です。

スペクトログラム情報取得(矩形範囲ドラッグ計算)

 最後はスペクトログラムからの情報を取得する方法についてです。スペクトログラムは時間・周波数・振幅と多くの情報を持っていますが、音声分析の分野で最も頻出するのが最大値の取得O.A.オーバーオール)の取得だと思います。今回はこれらを直感的に取得できるよう、ドラッグ操作による計算を実装しました。

 まず、録音直後やwavファイル読み込み直後は、スペクトログラム全体の中で最大振幅値・最大振幅時の周波数・O.A.の情報が画面右上に表示されています。ここで、全体から計算した情報であることを示すために(whole)と記載しています。

スペクトログラム情報

 スペクトログラム内でマウスをドラッグすると黄色い四角形が描画できます。この四角形が計算範囲を示し、マウスボタンをリリースすると右上の情報が選択範囲のものに変化します。全体からの計算と区別するために、(sel)という文字がつきます。

スペクトログラムの中でドラッグして選択範囲内の計算を行う

 こちらがドラッグ操作による範囲指定デモ動画です。

まとめ

 今回は年末年始の連休を使って録音機能付きwav音声分析ソフトをつくってみました。初めてのPyQt5によるGUIアプリですが、ChatGPTを使いながらであればどんどん進んでいきました。ただ、あくまで趣味的に爆速で作成したソフトであるため細かいバグや計算が理論値と異なるといった不具合は色々ありそうです。もしこのコードを皆さんが使う時は、最低限その辺の検証はご自分の責任で実施していただきたいと思います(そんな人いないと思いますが、会社で使って顧客に間違ったデータ出しちゃった…とかは気をつけてくださいね)。

 今後はWindowsやLinuxでの動作確認と、wat自身も計算の検証等を行なって最終版はGitHubにでも上げようと思います。では今年もよろしくお願いいたします。

直感的に操作できるGUIアプリがつくれました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

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

SNSでもご購読できます。

コメントを残す

*