WindowsPCの音声制御をPythonで実現する方法[python pycawの活用]

今回はWindowsPCの音声制御(Mute Volume調整)する方法について調整してみましたので、その方法をシェアします。

使用ライブラリ

今回必要となるライブラリは以下です。

  • pycaw
  • comtypes

インストール方法は、以下です。

pip install pycaw

↑のコマンドをコマンドプロンプトで実行することで、pycaw・comtypesともにインストールされます。

プログラムと実行結果

プログラムはこちらです。

from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume


def main( ):
    devices = AudioUtilities.GetSpeakers()  # スピーカーデバイスの取得
    
    interface = devices.Activate(IAudioEndpointVolume._iid_,CLSCTX_ALL, None)  # 動作中のIFを取得
    volume=interface.QueryInterface(IAudioEndpointVolume)
    print("MuteState %s",volume.GetMute())  # Mute 状態を取得
    volume.SetMute(0,None)                  # Mute解除  
    print("MasterVolume %s",volume.GetMasterVolumeLevel())  # 現在Vol 取得
    print("VolumeRange %s",volume.GetVolumeRange())         # Volのレンジを取得
    volume.SetMasterVolumeLevel(-40,None)                   # MasterVolの設定


if __name__ == '__main__':
    main()

実行結果としては、このプログラムを実行して、以下のように表示され、Volが変われば実行できています。

プログラム解説

プログラムの解説です。

このプログラムは以下のような流れとなっています。

  1. インターフェース取得
  2. Mute状態の取得とミュート解除
  3. 現在Volume取得
  4. インターフェースのVolで制御できる値の取得
  5. Volume設定

では順番に解説していきます。

インターフェース取得

まず、スピーカのインターフェースを取得します。

from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume

devices = AudioUtilities.GetSpeakers()  # スピーカーデバイスの取得

interface = devices.Activate(IAudioEndpointVolume._iid_,CLSCTX_ALL, None)  # 動作中のIFを取得
volume=interface.QueryInterface(IAudioEndpointVolume)

from XXXとなっている部分は使用するライブラリをインポートしています。
つづいて、AudioUtilities.GetSpeakers()で、PC内に存在するスピーカを取得。
devices.Activate()でスピーカーのインターフェースを取得。
最後に、interface.QueryInterface()で、制御するVolのインスタンスを取得します。
※pycawは、IFの説明がなくサンプルコードからの推測で説明を記載しておりますので、ご了承ください。。

Mute状態の取得とミュート解除

続いて、Mute制御部分です。

print("MuteState %s",volume.GetMute())  # Mute 状態を取得
volume.SetMute(0,None)                  # Mute解除  

volume.GetMute()で現在のミュート状態を取得できます。
戻り値として、Muteの場合は 1 Mute解除状態の場合は0が応答されます。
Muteの制御をするには、volume.SetMute( x ,None)を呼び出すことで制御できます。
xに、Mute: 1 Mute解除 : 0を入れれば、Mute制御ができます。

現在Volume取得

現在のVolumeの取得は、volume.GetMasterVolumeLevel()で取得します。
今回は、Masterボリュームを取得しているので、GetMasterVolumeLevel APIで取得をしています。
※その他個別のVolumeを取得できるようですが、今回は試していません。
ドキュメントがこのライブラリはないので、ソースコードからAPIを確認してみてください。

Volumeは取得すると、float方で応答されます。現在どれくらいのレベルなのかは、次の敷居値の取得APIで取得した値~0までの間で比較すれば確認できます。

インターフェースのVolで制御できる値の取得

volume.GetVolumeRange()で、IFが使用できる値の敷居値が取得できます。
今回取得した結果は以下の通りとなります。

 (-96.0, 0.0, 1.5)

上記の値が取得でき、先頭の数値が、Volの最低値となります。
つまり、-96.0 -> 0%(音声なし)、0->100%のように設定することを意味します。
※どのような値が取得できているのかドキュメントがなく、詳しく説明できませんが、試してみたところ↑のように動作しておりました。

Volume設定

最後にVolume設定は、volume.SetMasterVolumeLevel(x,None)を呼び出すことでVolの設定ができます。
こちらも今回はMasterVolumeを設定するAPIを使用しています。
xの部分に、一つ前の取得した敷居値の範囲内の数値をfloat型で入れればVolumeが変わります。

まとめ

今回は、Windowsマシンの音声関連の制御をPythonでできるのかちょっと興味があってやってみました。今回のライブラリはAPIのドキュメントがなく詳細を理解できないまま使用しているので、ちょっと時間ができれば、もう少し何ができるのか調べてみたいなぁと思っています。

ただ、やはり、Pythonはライブラリが豊富でなんでも簡単にできてしまいいいなぁと改めて思いました。

音声系のライブラリについては、↓のよう色々と記事にしていますので、興味があれば見てみてください!!

最後に、Pythonの基礎を学びたい方は以下がおすすめです。私も持っていてたまに眺めて勉強していますものですのでぜひ購入して学習してみてください。

にいやん

出身 : 関西 居住区 : 関西 職業 : 組み込み機器エンジニア (エンジニア歴13年) 年齢 : 38歳(2022年11月現在) 最近 業務の効率化で噂もありPython言語に興味を持ち勉強しています。 そこで学んだことを記事にして皆さんとシェアさせていただければと思いブログをはじめました!! 興味ある記事があれば皆さん見ていってください!! にほんブログ村