AppleScriptでサウンド設定を自動化


はじめに

Macにテレビ会議用のUSBマイク兼スピーカー(YAMAHA PJP-20UR)を接続してテレビ会議を行なっているのですが、時々サウンド設定が勝手に変わってしまって、こちらの声が相手に聞こえなかったり、向こうの声が聞こえなかったりすることがあります。
こちら側に原因がある時は比較的簡単に対処できますが、向こう側に原因がある場合は、画面共有でシステム環境設定を開いたり、電話越しに指示を出しながら向こうにいる人に操作してもらったりしていました。
しかし、トラブルが起きるときに限ってネットワークが遅延して画面共有の反応が悪かったり、指示内容がうまく伝わらなかったりすることが多くて困っていたので、AppleScriptで自動化してみることにしました。
実行環境はmacOS Sierraです。

機能要件

音声トラブルが起きたときに手動で実施していることをまとめると、以下のようになりました。

  1. システム環境設定→サウンドを開く
  2. 出力タブをクリックして、「サウンドを出力する装置」にYAMAHA PJP-20UR以外が選択されている場合はYAMAHA PJP-20URに変更する
  3. 入力タブをクリックして、「サウンドを入力する装置」にYAMAHA PJP-20UR以外が選択されている場合はYAMAHA PJP-20URに変更する
  4. 主音量をMaxにする
  5. 入力音量をMaxにする
  6. ミュートを解除する(主音量を変更すると自動で解除されるが念のため)

これをAppleScriptで書くと以下のようになります。
こちらの記事を参考にさせていただきました。)

sound_setting.scpt
tell application "System Preferences"
    reveal anchor "output" of pane id "com.apple.preference.sound"
    activate
    tell application "System Events"
        tell process "System Preferences"
            select (row 1 of table 1 of scroll area 1 of tab group 1 of window "サウンド" whose value of text field 1 is "Yamaha PJP-20UR")
        end tell
    end tell
    reveal anchor "input" of pane id "com.apple.preference.sound"
    activate
    tell application "System Events"
        tell process "System Preferences"
            select (row 1 of table 1 of scroll area 1 of tab group 1 of window "サウンド" whose value of text field 1 is "Yamaha PJP-20UR")
        end tell
    end tell
    quit
end tell
set volume output volume 100
set volume input volume 100
set volume without output muted

アクセシビリティの許可

上記のAppleScriptを実行すると、初回はエラーになります。
こちらの記事で詳しく紹介されていますが、OSX10.9以降はアプリケーションごとにアクセシビリティを許可してあげないと上記スクリプトは実行できません。
スクリプトエディタで実行した場合は下記のようなダイアログが出るはずなので、「システム環境設定を開く」をクリックします。

するとシステム環境設定→セキュリティとプライバシー→アクセシビリティが開き、「下のアプリケーションにコンピュータの制御を許可」の一覧に「スクリプトエディタ」が表示されるので、左下の鍵アイコンをクリックして変更可能にしたらチェックボックスをONにします。
これで次回以降はスクリプトエディタからは上記のスクリプトを実行できるようになります。

その他のアクセシビリティの許可

スクリプトエディタから実行できるようになりましたが、リモートから操作するには使い勝手がよくないので、以下の方法でも実行できるようにします。

  • スクリプトメニュー
  • ターミナル
  • SSH経由
  • cron

スクリプトメニュー

スクリプトエディタの環境設定で「メニューバーにスクリプトメニューを表示」をチェックして、ユーザー・スクリプト・フォルダにスクリプトを格納します。
メニューからスクリプトを実行するとスクリプトエディタで実行したときと同じようなダイアログが出るので、同様の手順で「SystemUIServer」にアクセシビリティを許可します。

ターミナル

ターミナルを開いて下記のコマンドを実行すると同様にダイアログが出るので「ターミナル」にアクセシビリティを許可します。

$ osascript sound-setting.scpt

ただ、私の場合、エラーにはなるのにダイアログが出ない状況が続いてしばらく嵌りました。しばらくしてから実行したらあっさりダイアログが出て設定できましたが、どうにも気持ち悪い動きです。
後述のSSHとcronも同様でした。

SSH経由

SSHで接続してからターミナルと同様にosascriptで実行します。ダイアログが出たら「sshd-keygen-wrapper」に許可を与えます。

cron

crontabに今より少し先の時間に実行するよう記述して実行します。ダイアログが出たら「cron」に許可を与えます。

下記はデスクトップに配置したスクリプトを毎朝8時に実行する場合の例です。

0 8 * * * cd ~/Desktop && osascript sound-setting.scpt

全部の設定が終わるとこんな感じになります(「ターミナル」は隠れて見えていません)。

cronで毎朝自動実行して、不具合があったときはまずSSH経由で実行、それでもダメなら現地の人にスクリプトメニューから実行してもらうという三段構えの体制がこれで整いました。
アクセシビリティの設定がもっと簡単にできるようになればいいのに、とは思います。