Google AssistantにAmazon Alexaといえば、最近話題の「スマートスピーカー」を実現するプラットフォーム。範囲はスマートスピーカーに留まらず、受像機がセットになった「スマートディスプレイ」、各種家電に音声認識機能が組み込まれた「○○○ビルトイン」など製品ジャンルは多岐にわたり、一大潮流を形成しつつある。我らがAppleはやや出遅れている感はあるものの、SiriとHomePodにより独自のアプローチで"スマート"な機能を提供しようとしている。
だが、しかし。導入したスマートスピーカーを活用しているかと問われれば、返答に詰まってしまう。天気予報を訊くことはルーティン化したものの、もうピカチュウや豆しばと会話しても心ときめかない。スマートスピーカーを呼び出すウェイクワードも、気付けば怒気を帯びている有り様だ。もっとシンプルな使い方はできないものか? たとえば、子ども部屋に置いたスピーカーに「朝だ、起きろ」を連呼させるようリビングから指示を出すとか……。
そのくらいであれば、AirPlay対応スピーカーで用は足りる。でも、どうやって? それをTerminalから"あのコマンド"を使って実現しようというのが、今回のお題だ。
AirPlayデバイスはシステムにどう認識されるか
AirPlayに対応するオーディオ機器やApple TVなどの受像機(AirPlayレシーバー)は、iTunesなどAirPlayに対応した送り出し側の機器(AirPlayトランスミッタ)にデバイスとして認識されたうえで、オーディオ/ビデオ信号を受信する。
音声信号の送出先としての機能だけに注目することも可能だ。システム環境設定の「サウンド」パネルにある「出力」タブにはスピーカーとして表示されるし、macOSに付属の「Audio MIDI設定」でもAirPlayタイプのスピーカーとしてシステム(Core Audio)に認識されている。USB DACなど他の接続インターフェイスを利用したオーディオ機器も、Core Audioによって抽象化されるという点では共通だ。
つまり、AirPlay対応オーディオ機器(Apple TV含む)は、Macの内蔵スピーカーと同じ感覚で出力先として扱うことができる。前述した「サウンド」パネルで選択するもよし、メニューエクストラから切り替えるもよし、接続経路はどうあれ、システムにとっては同じオーディオデータの送出先なのだ。
あのコマンドでAirPlayスピーカーに直接出力
「朝だ、起きろ」をどうやって実現するかだが、答えはかんたん、Terminalから「say」コマンドを実行すること。このコマンド、「-a」オプションに続いてオーディオデバイスIDを指定すると、Text to Speechの結果を直接出力できるのだ。
オーディオデバイスIDを調べる方法は、sayコマンドに「-a」オプションと引数に「?」を与えて実行すればOK。つまり、以下のとおりコマンドラインを実行すれば、その時点で出力先にできるオーディオデバイスとそのIDが一覧表示される。
$ say -a ?
このスクリーンショットでいうと、AirPlay対応スピーカーのIDは「56」とわかるので、以下の要領でコマンドを実行すれば「朝だ、起きろ」という声が聞こえるはず。Macの内蔵スピーカーから声を出す場合は同様に「-a 46」でOK、実にかんたんだ。
$ say -a 56 "朝だ、起きろ"
ただ「朝だ、起きろ」だけでは効果が薄いので、sayコマンドのインタラクティブモードを使ってみよう。使いかたはかんたん、「-i」オプションをくわえるだけでいい(前述の例でいえば「say -ia 56」)。これで、次々とAirPlayスピーカーにしゃべらせることができるので、一方的にメッセージを伝える用途には結構使える。相手の声を認識することはできないが、人力スマートスピーカーと言えないことはない……と思うがいかがだろう。
なお、システム環境設定「アクセシビリティ」パネルの「スピーチ」タブで「Otoya」をインストールしておけば、「say -v Otoya...」で男性の声で日本語を話させることができる。基本的にはアナウンサーのような畏まったしゃべり方だが、「おい、コラ」や「まだわかんねえのか、アア」など結構ドスの効いた語り口も楽しめる(?)ので、ぜひトライしてほしい。