「MacでAlexa」の2回目は、MacからAlexaへの命令について。音声コマンドはシンプルでわかりやすいが、使いたくない気分のときもあるはず。数年におよぶSiriとの関係がある我々Apple製品ユーザは、音声コマンドが万能ではないことをよく理解しているだけに、肯く向きも多いことだろう。そのあたりを実践的な方法で解決してみよう。
音楽は「Webから命令」が現実的かも
狭義の音声認識に関して言うと、Google Assistantと比較したAlexaのメリットは「認識率の高さ」といえる。これはAlexaとGoogle Assistantにおける処理の違いに由来しており、音声認識エンジンの優劣とは直接関係ないが、用途に応じた"向き不向き"を決めるひとつの原因となっている。
まず、クラウドにおける初動から違う。Google Assistantでは、受け取ったユーザの発話を最初にテキスト化し、それを分析しインテント(音声リクエストの内容を伝えるアクション)として分類する。一方のAlexaでは、最初にインテントとスロット値(インテントの目的/対象)に分類するため、ユーザの発話全体をテキスト化する用途には向いていないが、インテントに発話例をいくつか登録しておけばかなりの精度で認識してくれるのだ。
実際、試作したAlexa Skills(スマートフォンではアプリに相当する拡張機能)では、こちらの発話に対しかなり的確に反応してくれた。発音が似た言葉をインテントに登録しておく必要はあるものの、"発音の揺れ耐性"があるとでもいえばいいのか、ゴニョゴニョとした発話でも意図どおり解釈してくれる傾向がある。
しかし、外国語は事情が異なる。Alexaへの命令に海外ミュージシャンの名前や曲名が含まれる場合、筆者の発音がネイティブスピーカーとほど遠いのか、なかなか認識してくれないのだ。たとえば、Amazon Musicで聴ける「Emerson, Lake & Palmer」の曲を聴こうと、「エマーソンレイクアンドパーマーをかけて」とか「イーエルピーを再生して」と発話しても、「なんだかうまくいきません」で片付けられたり、とんでもない聞き違いをされてしまう。
この問題に対処する現実的な方法は、GUIで命令することだろう。スマートスピーカーにGUIで命令するとは本末転倒な感もあるが、スマートフォンアプリ(iOS/Android OS版「Amazon Alexa」)があるし、macOSの場合WEBブラウザで「alexa.amazon.co.jp」にアクセスすればいい。発音を変える以外にエンドユーザが認識率を向上させる方法はないため、ストレスをためるよりよほど建設的だろう。
Alexaと文字ベースで会話しよう
実際のところ、エンドユーザの立場でmacOSから直接Alexaを"どうにかする"余地は少ない。WEBサーバを用意してクラウドからアクセスできるようにすれば、クラウド上の関数(Lambdaなど)から命令を下すこともできるが、誰にでも勧められるものではない。AWS(Amazon Web Service)などの開発環境や、HerokuといったPaaS(Platform as a Service)はなおさらだ。
第204回でも紹介した「IFTTT(イフト)」は一般ユーザでもじゅうぶん扱えるが、Alexaの場合Google Assistantと比べると機能的に見劣りしてしまう。Alexa Skillsは各国/地域によりできることが制限されており、2018年1月現在では日本語で命令することができないのだ。リマインダーなどiCloudのサービスと連携するアプレットは用意されているものの、積極的に取りあげるほどでもない。
だからといって、実際に試すことが基本コンセプトの当連載としては諦めるわけにもいかない。そこで見つけたのが「AlexaNotificationCurl」。このシェルスクリプトを利用して、Alexaと文字ベースの会話を行おうという算段だ。
AlexaNotificationCurlは、引数に与えられた文字を音声に変換(Text-to-Speech)したうえでAVSのエンドポイントへ送信、その戻り値といえるAlexaの音声(MP3)を再生する。AVSに送信するのが人間の声ではなく合成音声というところがポイントだ。
公開されているシェルスクリプトはLinux用だが、Text-to-Speech用のコマンド「pico2wave」をsayコマンドに置き換えればmacOSでも動作しそう。ほかにも、サンプリングレートと量子化ビット数を16kHz/16bitに変換するための「sox」と、AVSから受け取ったAlexaの音声を再生するための「play」(afplayはパイプ経由で再生できない)という2つのコマンドが必要となるが、Homebrewでsoxパッケージをインストールすれば補えるはず。この目論見のもと作業したところ、Macでも支障なくAlexaと会話できることを確認できた。
$ brew install sox
「alexa.sh」の変更箇所は以下のとおり。sayコマンドをAlex(米国英語を話す男性の声)で実行するよう変えたくらいのもので、他はオリジナルのままだ。あとはCLIENT IDとCLIENT SECRETをAVSの開発者コンソールで取得し、「auth_code.sh」に書き込み実行することでAuthResponseを取得(この辺りの手順はAlexaNotificationCurlのREADMEを参照してほしい)すれば、Alexaとテキストで会話するための準備は完了だ。
pico2wave -w /tmp/pipe.wav "${QUESTION}" | tee pico2wav.wav | sox - -c 1 -r 16000 -e signed -b 16 -t wav - >> multipart_body.txt
↓ ↓ ↓
say -v Alex "${QUESTION}" --output-file=/tmp/voice.wav --data-format=LEF32@22050
cat /tmp/voice.wav | tee voice.wav | sox - -c 1 -r 16000 -e signed -b 16 -t wav - >> multipart_body.txt
引数を「Hello」として「alexa.sh」を実行すると……「Hi, there」とレスポンスが。「What time is it」とすると、なぜかロンドン時間ではあるが現在時刻を英語で返してくれた。お約束の「Tell me a joke」もバッチリだ(面白さはいまひとつ伝わらないが)。AVSのエンドポイントを日本語のものに変更すれば、日本語対応にすることもできそうだが、それはまた別の機会に。