今回は、GUI以外のインタフェースについての紹介と実際に利用できるところまでを解説します。管理するアプリケーションが増えてくると下記のような問題が起きて開発スピードが低下することがあります。
- 開発ノウハウの属人化
- 発話テストのコストが肥大化
最近では、このような問題に対してシステムによる自動化で解決を図るケースが多いと思われます。自動化することで開発ノウハウを知らなくても同等の作業ができ品質が維持できますし、自動化している処理を知ることでノウハウを学ぶこともできます。
発話テストでは、テストの自動化を行うことで人間がデバイスを通して発話する必要がなくなり、テストコストの削減やヒューマンエラーの少ないテスト体制を作れます。このような操作をする場合、CLIやAPIのようなシステムが利用しやすいインタフェースが必要になってきます。Amazon AlexaやActions on Googleには、そういったシステム利用に使えるCLIやAPIが提供されています。
Amazon Alexa
Amazon Alexaにはユーザーが操作することを目的とした「Alexa Skills Kitコマンドラインインタフェース」(ASK CLI)とプログラムから利用することを目的とした「Alexaスキル管理API」があります。
ASK CLI
ASK CLIは、AlexaスキルやAWS Lambdaの関数を操作できます。ASK CLIにはAPI操作に対応したコマンドが用意されており、APIのリクエストを意識せずにAlexaスキルの開発に関する操作ができます。後述する利用手順ではASK CLIに絞ってお話させていただきます。
Alexaスキル管理API
Alexaスキル管理APIは、スキル管理に必要な操作を実行できるRESTful HTTP APIでスキルの新規作成からデプロイまでの全体的な管理ができます。
Actions on Google
Actions on Googleには、Actions SDK用のCLI「gactions CLI」とDialogflow用のAPI「Dialogflow API」があります。後述する使い方の説明では、わたしたちのプロジェクトで利用しているDialogflowのAPIについてご紹介します。
gactions CLI
gactions CLIはActions SDKを利用している場合に使えるコマンドで、アクションの管理をCLIで代替できるようなコマンドを提供しています。
Dialogflow API
Dialogflow APIはDialogflowを利用している場合に使えるコマンドでIntentやEntityの管理ができるAPIとなっています。従量課金制のEnterprise版も用意されており、APIリクエスト数の制限がないことや、サポート種別が増える点が特徴として挙げられます。
ASK CLIの使い方
環境は下記を想定しています。
- Amazon開発者アカウントがあること
- Node.jsが利用できること (v8.10.0などLambdaと揃えることが望ましい)
- gitコマンドが利用できること
- Mac OSであること
Windowsの方は公式ドキュメントにサポートがあるので、そちらをご確認ください。
1. AWSアカウントの用意
(1)AWS Identity and Access Management(IAM)コンソールの「ユーザー」より「ユーザーを追加」を選択します。適切なユーザ名を入力し、「プログラムによるアクセス」と「AWSマネジメントコンソールへのアクセス」にチェックを入れます。
(2)「既存のポリシーを直接アタッチ」、「ポリシーの作成」を開き「JSON」を指定し、下記の内容を入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:CreateRole",
"iam:GetRole",
"iam:AttachRolePolicy",
"iam:PassRole"
],
"Resource": "arn:aws:iam::*:role/ask-*"
},
{
"Effect": "Allow",
"Action": [
"lambda:AddPermission",
"lambda:CreateFunction",
"lambda:GetFunction",
"lambda:UpdateFunctionCode",
"lambda:ListFunctions"
],
"Resource": "arn:aws:lambda:*:*:function:ask-*"
},
{
"Effect": "Allow",
"Action": [
"logs:FilterLogEvents",
"logs:getLogEvents",
"logs:describeLogStreams"
],
"Resource": "arn:aws:logs:*:*:log-group:/aws/lambda/ask-*"
}
]
}
(3)「ユーザー追加」の画面に戻り、リロードをした後に先程のポリシーを適用します。また「タグ」の項目は今回利用しません。
(4)「ユーザーの作成」を押下し、アクセスキーとシークレットアクセスキーを控えておきます(CSVでのダウンロードも可能)。
(5)AWS CLIのプロファイルを設定します。ターミナルを開き、先程控えたアクセスキーやシークレットアクセスキーを入力していきます。
# aws cliを入れていない場合は下記のコマンドでインストール
$ sudo pip install awscli
# default profile
$ aws configure
# --profileを指定する場合
$ aws configure -profile
AWS Access Key ID : 上記アクセスキー
AWS Secret Access Key : 上記シークレットアクセスキー
Default region name : 利用している地域 ex.) ap-northeast-1
Default output format : json
2. ASK CLIのインストール
$ npm install -g ask-cli
3. 初期化
$ ask init
→先程作成したprofileを選択
注意する点は下記になります。 * AWSユーザーへの適切なアクセス権限:公式ドキュメント「AWSの資格情報とASK CLIの関連付け」を参照 * AWS CLIのプロファイル設定:aws configureの結果が正しいか確認 * ベンダー IDの取得エラー:手動でプロファイルにベンダー IDを入力することでも可能
4. スキルの新規作成/クローン
# 新規作成
$ ask new
# 既存スキル
$ ask clone
5. スキルのデプロイ
下記のコマンドを実行することでASKとAWS Lambdaへコードがデプロイされます。
$ ask deploy
6. スキルのテスト
$ ask simulate -t “open hello world” -s -l ja-JP -p
上記のコマンドを実行し、ステータスがSUCCESSFULであれば開発環境下でスキルが動作しています。
Dialogflow APIの使い方
1. API V2のアクティベート
(1)エージェントで利用するバージョンを変更するためエージェント内の設定画面を開きます。
(2)API VERSIONをV2 APIへ変更します。
(3)画面上部の「Save」をクリックして保存します(すでにプロダクションで公開されている場合は、「Export and Import」タブよりExportしてから新しくV2をアクティベートしてあるエージェントにリストアする必要があります)。
2. Google Cloudコマンドのセットアップ
(1)下記のページから該当するOS種別のSDKをダウンロードします。 https://cloud.google.com/sdk/docs/?hl=ja
(2)ダウンロード後、下記のコマンドを実行し、Cloud SDKツールをパスに追加します。
./google-cloud-sdk/install.sh
(3)初期化を行います。
/google-cloud-sdk/bin/gcloud init
3. サービスアカウントの追加
Google ProjectにAPIのリクエスト権限を持つサービスアカウントを追加します。
(1)Google Cloud PlatformのコンソールからIAMと管理を開きます。
(2)左メニューのサービスアカウントを開き、上部3点メニューから「サービスアカウントを作成」をクリックします。 (3)アカウント名、ID、説明などを適宜入力し、作成ボタンを押します。
(4)サービスアカウントの権限として、Dialogflowに対する権限を付与します。
(5)キーの作成を行います。タイプはJSONで作成します。
4. APIのリクエスト
(1)ダウンロードしたJSONファイルを環境変数へ登録します。
$ export GOOGLEAPPLICATIONCREDENTIALS=””
(2)サービスアプリケーションのアクセストークンを取得します。
$ gcloud auth application-default login
(3)下記のコマンドでAPIコール時につけるトークンが取得できれば問題ありません。
$ gcloud auth application-default print-access-token
(4)ここで取得できるアクセストークンをAPIコール時にリクエストヘッダーに含めることでリソースを操作することが可能です。
$ curl -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://dialogflow.googleapis.com/v2/projects//agent"
{
"parent": "projects/",
"displayName": "",
"defaultLanguageCode": "ja",
"timeZone": "Asia/Tokyo",
"description": "sample",
"enableLogging": true,
"matchMode": "MATCHMODEHYBRID",
"classificationThreshold": 0.3
}
まとめ
わたしたちのプロジェクトでは、これらのインタフェースを組み合わせ、品質の高い音声アプリケーションを早く開発できるよう取り組んでいます。今回はCLIを中心としたGUI以外の操作方法について紹介しました。次回はログの取扱いについて説明する予定です。
著者紹介
Yahoo! JAPAN スキルプロジェクトチーム
データ&サイエンスソリューション統括本部のスマートデバイス本部に所属するプロジェクトチーム。スマートデバイス本部は、IoTや今回のテーマである音声アプリケーション開発など、ちょっとだけ未来の技術に挑戦する部署。
今回の執筆者:瀬高拓也(せたかたくや)//エンジニア
スキルプロジェクト エンジニア。ヤフーでは、スマートスピーカー向け音声アプリケーションVUI設計、フロントエンド、バックエンド開発等を担当。