はじめに
Clovaスキル(審査中)を自分で作ってみました。フロントエンドはClovaとLINEで、バックエンドにApitoreのツイート要約コンシェルジュAPIを使っています。最近、LINE BOOT AWARDS 2018関連のハンズオンやハッカソンで技術サポーターとしてお手伝いすることもあって、自分で一回Clovaスキルを作ってみました。サポーターになるにあたって必ずしもClovaスキルを作る必要はないのですが、個人的に「ジムでヒョロヒョロのトレーナーに筋トレのフォームを指示されるとイラッとする」性分なので・・・。今回の内容はAPI Meetup Tokyo #28のAPIデモ大会でLTさせていただきました。ソースコードも公開しているので、これからClovaスキル作ってLINE BOOT AWARDS 2018に応募しようという方にも役に立つと思います。
使い方
※まだ審査中です。使い勝手は変わる可能性があります。 「ねえClova、ツイート要約を起動して」 『はい、何を調べましょうか?』 「最新のiPhoneについて教えて」 『直近のツイートの要約です。○○○○。以上です。』 「他には?」 『次の要約です。□□□□。以上です。』 Clovaに話しかけると、気になるキーワードに関する直近のツイートを収集し、内容を要約して通知してくれるスキルです。要約結果はLINEにも通知してくれます。
システム構成
ソースコード
https://github.com/keigohtr/clova-apitore-tweet-bot
開発環境
- Python 3.6
- Flask
- sqlite
利用サービス
- Clova
- LINE
- Apitore
技術解説
初期設定
初めてClovaスキルを起動した場合は初期設定を案内します。まずLINEで「ツイッター検索の要約くん」botを「友だち追加」します。LINE botのバックエンドもClovaスキルのバックエンドと同じものにしていて、エンドポイントを分けて運用しています。スケーラビリティ度外視なので、内部はsqliteでデータを管理しています。 まず、Twitterでアカウントを作ります。既にある場合は作らなくてOKです。このTwitterアカウントには後からApitoreでアカウント連携を行います。Twitterはアカウントごとに検索APIの利用回数制限(RateLimit)を設けているため、アカウント連携をすることで各自のTwitterアカウントからTwitter検索APIを使うことができます。 次に、Apitoreのアカウントを作ります。こちらも既にある場合は作らなくてOKです。アカウントを作ったら、マイページのSNS連携からTwitter連携をします。内部的にはTwitterにOauthの認可を貰いにいってます。 アカウント連携が終わったら、ツイート要約コンシェルジュAPIの利用登録をします。Apitoreは無料枠がたっぷりありますし勝手に課金はしないので(そもそもクレジットカード登録しないし)無料で使うことができます。 次は、Apitoreのアクセストークンを取得します。登録APIのページから「アクセストークン表示」をクリックし、既にアクセストークンを持っている場合はそれを使い、なければ「作りなおす」を選択してアクセストークンを発行します。こちらは後でLINE botに登録するのでコピーしておきます。 最後に、LINE botに「アクセストークンはxxxxxxxxxxxx」と投稿すれば準備完了です。内部的にはsqliteにApitoreのアクセストークンを保存している形になります。
スキル発動
「ねえClova、ツイート要約を起動して」 でスキルが発動します。ユーザーからキーワードを聞き取って、Apitore経由でTwitterからツイートを検索し、Apitoreで要約してClovaとLINE botに通知します。LINE側のサーバーエラーを考慮して、エラー発生時はバックエンドサーバーのsqliteに要約結果をdumpして、後からLINE botで引き出せるようにしています。 Apitoreで使っている要約のアルゴリズムは最大被覆モデルです。それを性能保証付き貪欲法で計算しました。以前Qiitaで少し紹介したのでそちらを見てみてください。
苦労した点
Clova Developer CenterでLINEアカウント認証をすると、自分のスキルを作ることができます。スキルの作り方は他の方のブログ等を参考にするとして・・・スキルを作って審査する上で私がハマったポイントをシェアします。
ExtensionIDは保有ドメインを使う
Clovaスキルを作る最初期に「ExtensionID」というものを自分で設定します。この値はユニークである必要があります。公式には「リバースドメインの表記で入力してください」としかありませんが、もしスキルを公開する予定でしたら、ここは自身の保有するドメインを使わなければなりません。適当に「com.example.hoge」みたいな値を設定するとスキル審査で確実にリジェクトされます。ExtensionIDは変更不可なので、適切なExtensionIDを指定するためには新しいスキルのページを作ってイチから設定しなおさなければなりません(1敗)。保有ドメインでなければダメなので、ドメインを持っていないとスキル公開はできないってことです(2018年9月15日時点)。
自由文は取得できない
Clovaに限らずAlexaでもGoogle homeでも同じですが、3rd partyのスキルでは自由文は取れません。「Slot」と呼ばれる辞書を作る必要があり、そこに記載された内容のみがスキルのバックエンドサーバーに転送されます。今回の私の作ったスキルでは一般名詞や固有名詞全部を対象にし得るため、とてもじゃないですが人手では作れません。そこで、@overlastさんが作っているNEologdのエントリをパースしてSlotに突っ込みました。顔文字等は入力するとエラーが出るのでフィルタしました。エントリは40万近くまで減らしまして、なんとかアップロードできました(2018年9月15日時点)。どうやらSlotは1万エントリを上限に設定しているっぽくて手作業では1万エントリを超えると入力できないようにしているようですが、ファイルアップロードではいけました。たぶん、いつか修正されてしまうと思います笑。あとは「〇〇について教えて」と尋ねる形式を固定にすることでサンプル発話リストの入力を減らしました。これは都度バリエーションを増やしていきたいです。
スキルのビルドに時間がかかる(過去形、現在は改善)
作ったスキルを試すには「ビルド」をする必要があります。これが一時期20分以上かかっていました。辞書エントリ10個、サンプル発話リスト10個であっても20分かかっていたので、とても作業効率が悪かった記憶があります。気軽にトライアル・アンド・エラーを回せないなあと悩んでいたら、9月の頭くらいに劇的に改善しました。数分から10分いかないくらい(2018年9月15日時点)。
ユーザーへの説明文の書き方に厳格
ユーザーへの説明文の文言表記が不適切だとスキル審査にリジェクトされます。私が指摘されたのは以下ですが、これは色んな方の経験をフィードバックもらって用語集を作りたい(切実)。ボケてのNGワードに通じるモワッと感。
x友達 o友だち
利用サービスのアカウントはすべて作って渡す
今回のスキルの場合はTwitterとApitoreのサービスを使っています。なので、自身でTwitterとApitoreのアカウントを作って審査員へのコメントに「アカウント名とパスワード」を記載して提供する必要があります。なので容易に関連サービスを増やすと大変なことになります。ちなみにLINEのテスト用アカウントは作らなくても何も言われませんでした(2018年9月15日時点)。
おわりに
自分でスキルを作ってみて気づくことは多いです。まだ審査終わってないですが、審査が通れば晴れて一人前のスキル作成トレーナーだ!それはともかく、LINEやClovaなど利用できるUI(ユーザーインターフェース)が増え、またApitoreやGoogleなどで色々なCS(計算機科学)やAI(人工知能、機械学習)の技術がWebAPIで利用できるようになってきたので、組み合わせるだけで簡単に自分好みのサービスが作れますね。Apitoreで目指している「技術をレゴブロックのように組み合わせて、誰でも簡単に自分だけのサービスを作れる世界」が近づいていてワクワクします。早くApitoreをそういうプラットフォームにしたいなあ。 あ、よろしければClovaスキル「ツイッター検索の要約くん」を使ってみてくださいね(※審査中)!