LoginSignup
2
3

More than 5 years have passed since last update.

PythonでPCが無音状態になったらなんか処理する

Last updated at Posted at 2019-03-09

はじめに

なんだかんだあって大変な悲劇が起き、二度目はなんとかして防がねばと書いてみたものをついでに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。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3