ぷるぷるした直方体

エンジニアの雑記です。My opinions are my ownというやつです

Macの標準機能で音声コントロール

音声で操作するのって近未来感があっていいですよね。 スマホであればSiriなりGoogle Assistantなりが搭載されており、簡単に試すことができます。

が、日頃PCでやる作業を効率化するためには、PCが音声を認識しコマンドを実行しないといけません。 標準で搭載されるようになったSiriではコマンドを叩いてくれないので、別の手段を使う必要があります。

幸いMacには音声コントロール機能が存在するので、それを使って実現してみます。

できること

  • 音声でスクリプトを呼び出せる
    • 正確にはAutomatorのWorkflowを呼び出すため、色々なことができます
  • 好きな呼び出し単語を設定できる
    • 意外とこの機能は他にない(”Siri”も”Ok, Google”も今のところ変更できません)
    • よい名前を付けると愛着が湧くかも……
  • 並列作業ができる
    • 新しいターミナルタブを起動しなくても、勝手にバックグラウンドでコマンドが実行できます

概要

手順は以下の通りです。

  1. Dictationを有効にする
  2. AutomatorでWorkflowを作成する
  3. Dictation CommandでWorkflowを呼び出す

では設定をみてゆきます。

設定

OSのバージョンはSierraを想定しています。

Dictationを有効にする

“Setting”→”Keyboard”→”Dictation”から、”Dictation”をOn、”Use Enhanced Dictation”を有効にします。

また、”Setting”→”Accessibility”→”Dictation”から、”Enable the dictation keyword phrase:”の設定を行います。 デフォルトでは”Computer”になっているので、ここを好きな名前にします。

“Dictation Commands”を見ると色々設定されていますが、使わなさそうなら消しておくのが無難です。 ここに独自コマンドを追加してゆきます。

AutomatorでWorkflowを作成する

コマンドはWorkflowを経由して実行させます。 Automatorを起動し、新規Workflowを作成します。

種類は”Run Shell Script”、Shellは”/bin/bash”が無難です。 下のテキストエリアにシェルスクリプトの絶対パスを記入、もしくはコマンド列を直書きします。 管理をしやすくするため、シェルスクリプトを別途用意し、それを呼び出すだけにすることをおすすめします。

試しに実行してみて問題無さそうであれば、いよいよ音声との連携設定です。

Dictation CommandでWorkflowを呼び出す

”Setting”→”Accessibility”→”Dictation”→”Dictation Commands”で新規項目を追加します。 “When I say:”に認識させたい語句を入れ、”Perform:”→”Run Workflow”から先程作成したWorkflowを指定します。

実際に”${prefix} ${when I say}”と呼びかけ、タスクバーに歯車が出てくれば成功です!

スクリプトの工夫

ちゃんと実行されたかどうかを確認するため、起動・終了ログは残しておきたいものです。 また、すぐ結果が見える処理であればいいですが、そこそこ時間がかかるものだと終わった時に通知してほしいです。

私の場合は、以下のような汎用ライブラリを作っておき、個別のコマンドはこれを読み込んで作成しています。

##!/bin/bash

SCRIPT_DIR=$(cd $(dirname $0);pwd)

function display_notification () {
  osascript -e 'on run argv
    display notification current date as text with title item 1 of argv
  end run' -- "$*"
}

slog() {
  echo "[$(date)] $0 start" >> ${SCRIPT_DIR}/log.txt
}

elog() {
  echo "[$(date)] $0 end" >> ${SCRIPT_DIR}/log.txt
  display_notification $0
}

個別のコマンドはこのようになります。

##!/bin/bash

set -eux
SCRIPT_DIR=$(cd $(dirname $0);pwd)
. ${SCRIPT_DIR}/common_util.sh

slog

## ここに処理が入る

elog

このようにすると、スクリプトと同じディレクトリにlog.txtが生まれ、ログが書き込まれてゆきます。 また、終了時にOSの通知が飛んできます。

難点

標準のDictation Commandだと、複雑なことはできません。 引数を取ったりするスクリプトには向いていませんので、Siriなど他のアプリに期待です。

フィードバックが無いので、key phraseが認識されたかどうかが謎なことがよくあります。

あと、短いkey phraseとcommandの組だとよく誤爆します。 影響の大きいコマンドは、複数のコマンドを組み合わせないと実行できないとか、そもそも音声でコントロールしないとか()にしましょう。

まとめ

シェルスクリプトを音声から呼び出して未来感を味わう方法でした。 ちなみに、処理をシェルスクリプトにまとめる仮定で、ちょっとした効率化を意識するようにもなるという副次効果もあります。

Macがあれば無料でできるので、ぜひ試してみてください。