はじめに
なんだかんだあって大変な悲劇が起き、二度目はなんとかして防がねばと書いてみたものをついでにQiitaに投げてみます。初投稿です。
なにするの?
パソコンが一定時間音を出さなかったらなにか処理します。
今回はpyautoguiを使ってf5キー押してブラウザを力技でリロードします。
ステレオミキサー使うのでとりあえずwindowsでしか動きません。
参考
Pythonで音を監視して一定以上の音量を録音する
(メインのコードはほぼほぼここを参考にさせてもらいました……)
やること
ステレオミキサーを有効化してパソコンの出力音をパソコンに入力する
↓
pyaudioで音を拾う
↓
音がしばらく切れたらなんやかんやの処理をする
以上。シンプル。
ステレオミキサーの有効化
ステレオミキサーを有効化するとパソコンが出す音を入力として拾えるようになります。
マイクの音とPCの音を同時に録音するためとかに使うらしいですね、そういう目的だと今はステレオミキサー使わなくていいみたいですけども。
コントロールパネル→ハードウェアとサウンド→サウンドの録音タブを右クリック、無効なデバイスの表示にチェック。
ステレオミキサーを規定のデバイスに設定。
realtekのドライバだと、更にPCにスピーカーなりイヤホン・ヘッドホンなり接続した後再生タブのrealtekのドライバのスピーカーを規定にしないとステレオミキサーに音が行きません。ちょっと引っかかった。
Pythonのコード
pyaudioとかpyautoguiとかは適当にpipで入れます。
pip3 install pyaudio
pip3 install pyautogui
これが本体。
import pyaudio
import pyautogui
import numpy
chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 48000
waitseconds = 5.0#待ち時間
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT,
channels = CHANNELS,
rate = RATE, #サンプリングレート
input = True,
frames_per_buffer = chunk
)
cnt = 0
while True:
data = stream.read(chunk)
x = numpy.frombuffer(data, dtype="int16") / 32768.0
if x.max() < 0.003:#音量、無音とみなす
cnt += 1
else:
cnt = 0
if cnt > waitseconds / (chunk / RATE): #chunk / RATEは一度に処理する時間、ここでは0.021秒くらい
pyautogui.typewrite(['f5'])#f5入力
cnt = 0
stream.close()
p.terminate()
x.max()の値はマイクオフにしてパソコンも完全に無音にしても何かを拾っているのか0にはならなかったので適宜調節。値も環境によると思います。
音とったりキーボードの入力飛ばしたり、微妙に面倒な予感がしていたけど想像以上にあっさり&短いコードでまとまりました。流石Python。