Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@maKunugi

myThings Developersを使って音声アシスタント機能を作ってみる

More than 3 years have passed since last update.

myThings Advent Calendar 2016 24日目の記事になります。

概要

音声アシスタント市場が近頃熱いですね。私は昔からロボットやBOTと人間が会話する様が好きなので、音声アシスタント市場が盛り上がった2016年はとても激アツな1年でした。
Amazon EchoやGoogle Homeなど注目のデバイスに実際に話しかけてみたいのはもちろんですが、試しに似たようなものを自作してみるのもかなりワクワク感があります。

というわけで、今回はmyThings Developersを利用してサクッと音声アシスタントを作ってみることについて記事を(夜な夜なスマートフォンに話しかけながら)書こうと思います。もしご興味をお持ちいただけましたら、しばしお付き合いください!

準備するもの

myThings Developers + 自分のサーバ

ba60d69b-0188-09bd-dc0e-643d2e656453.png

myThings Developersはさまざまなサービス、デバイスのAPIを共通のI/Fで利用を可能にしてくれるサービス連携プラットフォームで、すばやく音声アシスタントを構築してみるのにうってつけのサービスです。(詳しくは後述)
また、利用するにあたって自分のサーバを1台用意します。音声認識で得たテキストをmyThings Developersへ渡すときに利用します。

音声認識が可能なデバイス

音声認識を行うことのできるデバイスを用意します。今回はAndroid端末を音声認識用のデバイスとして利用します。
AndroidではSpeechRecognizerを利用すれば素早く音声認識機能を用意することができます。今回は画像のような音声認識用のアプリを用意しました。(据え置き型デバイス感を出すために当初Raspberry Piで作成予定でしたが連休が尽きそうだったため断念いたしました。)

banner.png

構成図

guide_tweet.png
上の画像は、「○○とツイートして」と発話した時の処理の流れを示しています。

1. 音声入力

音声認識用デバイスから自サーバへ発話したテキストを送信します。

2. ドメイン選択

ユーザから発話された内容が求める処理(ドメイン)が何であるかを判断します。ここで、「○○とツイートして」というユーザの発話が文字列をツイートすることを求めていることをプログラム上で選択する必要があります。

3. ドメインに対応するアクションの実行

myThings Developersに実行したい処理をリクエストし実行します。ここでは、後述するmyThings Developersのカスタムトリガーという機能と各サードパーティのアクションを紐づけて実行をします。この例の場合、ツイートをする引き金となるmyThings Developers上で設定されたトリガーへリクエストを送ると、それに紐づいたTwitterの「ツイートする」アクションが呼ばれ、ツイートが実行されます。本来、サードパーティへのリクエスト処理を1つ1つ実装する必要がありますが、サードパーティとの橋渡しをすべてmyThings Developersが代わりに行ってくれます。トリガーとアクションの組み合わせはmyThings Developers上のGUI操作で作成することができるため、この構成さえ作ってしまえば、ほとんどコードを書くことなく発話に対応する機能を追加していくことができるようになります。

作成手順

myThings Developrsの準備

myThings Developersへアクセスし、利用登録する。その後の進め方についてはこちらを参照→チュートリアル
組み合わせを作成する準備ができたら、先ほど上で説明したトリガーとアクションの設定を行う。まずは初めに「発話したらツイートする」と「発話したら自分にGメールを送る」という2つの組み合わせを作ってみた。
スクリーンショット 2016-12-24 6.12.32.png
スクリーンショット 2016-12-24 6.13.30.png
左側の緑アイコンがmyThings Developersのカスタムトリガーという機能、右側のTwitterアイコンがつぶやきを行うアクションです。
スクリーンショット 2016-12-24 6.16.40.pngスクリーンショット 2016-12-24 6.17.27.png
カスタムトリガーにはツイート内容をリクエスト項目に設定し、「ツイートする」アクションのツイート内容にはカスタムトリガーから送られてきたツイート内容が入るよう設定します。この設定により、「ツイートする」アクションと紐づいたカスタムトリガーが呼ばれると、カスタムトリガーにリクエストしたテキストをツイートできるようになります。

スクリーンショット 2016-12-24 6.20.23.png
組み合わせが作成できたら、ページ下部にある「テスト > 疎通確認」の設定を順番に行います。この過程でサンプルコードと一緒にこの組み合わせをリクエストするためのURLとアクセストークンを取得できます。チュートリアルに沿って自分サーバへ必要なプログラムを置けば、自分のサーバから作成した組み合わせを実行することができるようになります。

このように組み合わせを作成すると、1つの組み合わせにつき1つのリクエスト用URLが与えられます。このURLと先ほど上で説明をした「ドメインの選択」を紐づけることでユーザの発話に応じたアクションを実行できるようにしていきます。

発話とmyThings Developersカスタムトリガーを紐づける。

ユーザがどのようなドメインを想定して発話をしたか理解する箇所の実装は、音声アシスタントの肝となる部分です。正規表現のパターンを大量に用意してユーザの発話の意図を判断する方法や機械学習を用いて高度な判定を行う方法など様々な手法が考えられます。
(参考:発話理解API | DOCOMO )
この記事では発話理解部分については深く考えず、正規表現のパターンを用意してドメインに紐づけるということをやろうと思います。
ツイートするアクションに対しては例えば次のようなパターンを用意します。

send_tweet
    $parttern_self_tweet = array(
        "/(.*)(とツイート)(.*)/s" => 1,
        "/(.*)(とつぶやいて)(.*)/s" => 1,
    );

配列のkeyにパターン、valueには正規表現でマッチした場合カスタムトリガーにツイート内容として渡す文字列のインデックスを設定しておきます。「メリークリスマスとツイートして」と発話した場合、「メリークリスマス」という文字列がカスタムトリガーにリクエストされツイートされます。カスタムトリガーには複数のパラメータが渡せますが、ひとまずツイート内容だけ渡してみました。

動作

実際に音声でツイートをしてみた動画です。
IMAGE ALT TEXT HERE
ちゃんとツイートされました!

まとめ

ざっくりとした説明になってしまいましたが、myThings Developersを使って手軽に音声アシスタント機能を作ることができました。サードパーティへリクエストをする実装をしないですむため非常にスピーディに構築をすることができますね。
組み合わせの追加とパターンの追加をするだけで発話に対応するアクションを増やせるので、しばらく便利そうな音声コマンドを色々と考えながら遊んでみようと思います。

それではこの辺で24日目myThings Advent Calendar 2016の記事を終わらせていただこうと思います。良いクリスマスを〜!

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
maKunugi
アプリエンジニアやスクラムマスターをしています。 個人開発で音声アシスタントや対話システム関連のサービスを開発・運用しています。
globis
グロービスは 1992 年の創業以来、社会人を対象とした MBA、人材育成の領域で Ed-Tech サービスを提供し、現在は日本 No.1 の実績があります。これらの資産と、さらに IT や AI を活用することで、アジア No.1 を目指しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?