PyAudioを使う時、オーディオデバイスのチャンネル、すなわちインデックス番号を確かめないと正確に使うことはできません。本記事ではマイクのチャンネル番号を確かめる方法を紹介します。
こんにちは。wat(@watlablog)です。
PyAudioで録音する時、デバイスインデックス番号を選びますよね。この番号はPCによって固有の番号なので、ここではインデックス番号の確認方法を紹介します!
オーディオデバイスのインデックスとは?
前回の記事「PythonのPyAudioで音声録音する簡単な方法」では、PyAudioを使って録音を行いました。
この時、録音にはPCで利用できるオーディオを指定していますが、ここで指定している番号がオーディオデバイスのインデックス番号です。
PCには音を再生するためのスピーカーがありますが、これは再生デバイスと呼び、マイクのような音を収集するものは録音デバイスと呼びます。これらをひとまとめにオーディオデバイスと呼んでいます。
ここで、各デバイスには固有の番号が振られており、PyAudioではこの番号をindexとして指定します。
PyAudioのオーディオデバイス一覧取得
デバイス番号一覧を取得するPythonコード
Pythonでデバイスを利用するために、オーディオデバイスのインデックス番号は以下のコードで取得可能です。
1 2 3 4 5 |
import pyaudio pa = pyaudio.PyAudio() for i in range(pa.get_device_count()): print(pa.get_device_info_by_index(i)) |
for文のループ回数をget_device_countで取得し、get_device_info_by_indexに引数としてループ指標を渡し、文字列として情報を取得する、というものです。
実行結果
今回は内蔵マイクを壊してしまったMyPCを題材に実行結果を説明します。前回の記事ではUSBマイクを接続してindex=1で録音しましたが、USBマイクをさす前はヘッドホンの項目しかありませんでした。
USBマイクを接続した後は様々なデバイスが追加されたことがわかります。
あとはプログラムでこの中のどれかを使えば良いわけですね。
マイクチャンネルのみ自動取得するPythonコード
先ほどのコードはマイクもスピーカーも種類を問わず、全てのチャンネルを抽出する内容でした。
せっかくPythonでコーディングするのであれば、録音に至るまで全てを自動化したいものです。
そのためにはマイクのチャンネル(入力チャンネル)のみを自動取得する必要があります。
以下のコードはmaxInputChannels(入力チャンネルの数)が0でないことを根拠にマイクチャンネルのみをリストに追加する関数です。辞書型の検索で取得するという仕様になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import pyaudio def get_mic_index(): ''' マイクチャンネルのindexをリストで取得する ''' # 最大入力チャンネル数が0でない項目をマイクチャンネルとしてリストに追加 pa = pyaudio.PyAudio() mic_list = [] for i in range(pa.get_device_count()): num_of_input_ch = pa.get_device_info_by_index(i)['maxInputChannels'] if num_of_input_ch != 0: mic_list.append(pa.get_device_info_by_index(i)['index']) return mic_list if __name__ == '__main__': mic_list = get_mic_index() print(mic_list) |
まとめ
PyAudioではマイクという録音デバイスを使って音を収集することができますが、デバイスの番号を参照する必要があります。
本記事では、オーディオデバイスの概要を説明し、Pythonコードによるデバイスのインデックス番号を取得する方法を紹介しました。
これでPyAudioを使って自由にデバイスを選択することができるね!ここまでわかれば、自動で有効なマイクをindexに割り当てることもできそうだ!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!
初めまして、コメント失礼致します。
デバイス関係のことでお聞きしたいのですが、USB接続したオーディオインターフェイスのデバイス番号を本記事にて取得することができました。
現在オーディオインターフェイスのLINE OUTPUTが4つあるうち、2個をモノラルスピーカーに接続しています。
やりたいこととして、pyaudioでデバイス指定をすることで出力させたい音をスピーカー別に再生できることと思いますが、LINE OUTPUTのデバイス番号の取得はどのように行えばいいのでしょうか。
お返事をお待ちしております。
よろしくお願い致します。
記事をご覧頂きありがとうございます!
LINE OUTPUTとは、一般に言われるライン入出力端子のことでしょうか?
実は僕もこの記事を書いた時に複数デバイスの操作(具体的には複数スピーカーから逆位相波を出したかった)をしたかったのですが、残念ながら実現には至っていません…。
ライン出力はUSB接続のオーディオデバイスと信号の種類が全く違うらしいので、別の方法がよいかもしれません。
例えば、ラズベリーパイというPythonの動く安価な小型PCのGPIOからアナログ信号を出し、別途用意したアンプを介してスピーカーから音を出す…という方法が良いのではと思っていますが、まだ思っているだけです。。
お力になれそうもなく申し訳ございません!
wat様
お返事ありがとうございます。
はい、ライン入出力端子のことです。(説明不足で申し訳ございません。)
そうなのですね…オーディオ関係は初めて扱っているため勉強になります。
別の方法で探してみますね。
また何かありましたら質問させて下さい!