★この記事は「ヴァル研究所 Advent Calendar 2016」の23日分のエントリーになります
注意
- 機能/サービスの検証とスクリーンショットの取得は
2016/12/18
に行いました。 - それ以降に変更が加えられた場合は結果が異なる可能性がありますのでご注意下さい。
- 検証時に利用可能なサービスで検証しています。実際にご利用になる前に確認していただくようお願いします。
はじまり
今年は↓のように今所属している会社のアドベントカレンダーに参加してみました。
その際に企業・学校・団体単位のアドベントカレンダーがこんなに沢山あるのを知りました。
その中で見たことある会社のがあるっ!これはっ!となり、中の人に
- 私「こんなの始めたんですね!」
- 中の人「スタートしたんですが、あんまり書く人がいないっぽいです」
- 私「おーそれは残念ですね」
社内にアドベントカレンダーの楽しさみたいなのが浸透するにはまだまだ時間がかかりそうな感じですね・・・
日本における技術系アドベントカレンダーの歴史 - 近&況
http://yhara.jp/2016/12/01/history-adcal-jp
re:Inventに参加した人とか、報告会を開催したとかでも良いので参加してみたらいいのになぁー残念。
もしくは去年の今頃のように、まだ勇者になってない頃に訪問してもらい桃鉄
やってもらうのでも十分ネタになりそうですがw
先日新作も出たみたいですし、もう一度勇者の姿で訪問して桃鉄でもやったらいいんじゃないですかねぇ?w
せっかくだから
せっかくだから、俺はこの赤の扉を選ぶぜ!
ではなくて
デスクリムゾン - Wikipedia
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%A0%E3%82%BE%E3%83%B3
2016年半分はお世話になってますし、何より製品/サービスと現場は最高でしたのでせっかくだから書いてみようと思いました。
呼ばれて無いから空気を読まずに突撃しましょうーそっちのが楽しそうですしw
何を書くか
駅すぱあとWebサービス
を使ったネタを書くのは当然なんですが・・・
これまでのアドベントカレンダーで中の人が丁寧に説明されているので、これ以上書くことがないw
↑な投稿も見かけたのでAPI
であることのメリットがなんか出るように、re:Invent で発表された新規サービスと組み合わせて使ってみようと思います。
Amazon Polly
今年のre:Invent 2016 で発表された新サービスで Turn text into lifelike speech using deep learning
と公式で説明されています
文字列を読み上げてくれるわけですが、かなりの精度でそのまま読んでくれます。漢字もわざわざ読みを渡さなくてOKなのは楽でいいです。
東京リージョンにはこの時点では来ていませんが、今回はリアルタイムで利用するわけではないので問題にはならないと思います。
使ってみる
AWS マネジメントコンソールにログインして Polly
のページに移動すれば、利用することができます。
今回利用するのはテキスト読み上げ機能
になるので、マネジメントコンソール上でテキストを入力してどのような感じになるのか試してみます。
実際にはAPIで取得した文字列をAPI/SDKを通じて、このテキスト読み上げ機能を利用することになります。
前提
駅すぱあとWebサービス
の利用開始についてはすでに詳しく書かれているので、割愛しようかと思いましたが・・・
↓からの申し込みだと半年前と変わりがなければ温かみのある手作業
でアクセスキーを発行しているはずなので、基本的には営業日基準での対応となるはずです。
オープンデータ
をうたっているのに申し込みが必要で待ち時間があるのも、
個人的には違和感ありますねぇ。データカタログサイト
に掲載してみたりしたらいいのに。
オープンデータ - Wikipedia
https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF
とは、言っても仕組みは簡単に変わらないので・・・今後に期待しつつ今回はdocomo Developer support
を利用しました。
docomo Developer supportは、ドコモやパートナー企業が持つ様々なアセットを「API」として汎用化して提供し、開発者へ展開することで、新たな事業の創出を推進する協創プラットフォームです。
と書かれている通り、駅すぱあとWebサービス以外にもたくさんのAPIが利用できます。
登録も簡単でSNSアカウントでのログインも可能です。注意が必要な点は
- 検証用/開発用に発行されるアクセスキーには90日の有効期限が付いている
- 駅すぱあとWebサービスを含むいくつかのAPIを利用するには
法人情報登録
が必要になる 法人情報登録
とは? 所属する会社の住所やらを登録するだけで法人として会社で登録してもらう必要はない。- アカウント単位で所属の会社情報を入力するだけである
- このためフリーランスの方は登録が難しいかもしれない
という感じになります。ユーザー登録してAPIの利用申請を行うとAPIにアクセスするための情報が発行されます。また、エンドポイントもこのサービス専用になるようです。
簡単に利用できるので検証/検討段階ではこれで必要十分な気がします。さすがNTTドコモ!!素敵です。
まずは
Amazon Polly に入力するための文字列を作る必要があります。駅すぱあとWebサービスで何らかの経路を検索して、その結果を適当に口語風にしたものを利用したいと思います。
簡単に書くと↓な感じ?
入出力は色々面倒なので、みんな大好きSlackを利用します。
Outgoing Webhooks
を設定して 乗換
のキーワードに反応するようにしました。Slackに設定するアイコンは以下のWebからAndroidアプリ版のものを利用させてもらいました。
Amazon API Gateway + Lambda の組み合わせは動作させるのに楽なのでPython Serverless Microframework for AWS (chalice)
を利用します。
chaliceについては↓で書いているので参考になれば。
chalice はこういうちょっと試したい時には本当に楽でいいですねーまだまだ対応しているAWSサービスが少なかったりとかしますが・・・
実際に今回使用した chaliceのバージョン0.5.0
ではまだAmazon Pollyに未対応なので、↑のBlogの中に書いてあるように自動でポリシーが生成できません。
手動でポリシーを生成してかつ、デプロイ時には--no-autogen-policy
オプションを指定する必要があります。
また、Lambdaの環境変数も利用しているのですが、こちらも未対応のため別途AWSマネジメントコンソール等から設定が必要となります。
AWS Lambda の新機能 – 環境変数とサーバーレスアプリケーションモデル (SAM) | Amazon Web Services ブログ
https://aws.amazon.com/jp/blogs/news/new-for-aws-lambda-environment-variables-and-serverless-application-model/
AWSマネジメントコンソールから環境変数を保存しようとすると、権限不足で保存できないエラーが出ました。
どうやら以下2つの権限を追加する必要があるようです
- ec2:DeleteNetworkInterface
- ec2:DescribeNetworkInterfaces
権限を追加したところ、環境変数の保存が出来るようになりました。
しかし2016/12/23
に確認したところ上記2つがなくても大丈夫な感じになってそうです。もしエラーが出たとしたら追加する感じで大丈夫そうです。
経路検索
駅すぱあとWebサービス の経路簡易探索
APIで経路検索を行います
必須なのは出発
駅名と到着
駅名の2つだけなので、前述のSlackで乗換 高円寺 飯田橋
のような形で入力されたものを利用します。
これで現在時刻に出発する経路検索を利用できるようにします。
で、検索自体は簡単に出来るのですが・・・問題は結果のレスポンスデータ
・・・久しぶりに使いましたけど相変わらずの面倒臭さがw
難しいと言うわけではないので、地道に必要な値を取得していってください。今回は単純化するために、検索結果の一番最初の経路を口語調にしています。
実際にLambdaからAPIを呼び出してる部分は↓のように非常に簡単です。
def searchCourse(eki_from, eki_to): url = "https://api.apigw.smt.docomo.ne.jp/ekispertCorp/v1/searchCourse" params = {"APIKEY": API_KEY, "from": eki_from, "to": eki_to} headers = {"Accept": "application/json"} response = requests.get(url, params=params, headers=headers) print('searchCourse={}'.format(response.text)) return response
口語調にする部分は出来る範囲でそれっぽくなるように頑張って編集していますが・・・ちゃんとやるならここも単純に編集するだけではなく、工夫していく必要がありそうですね。
SynthesizeSpeech
今回の本題であるAmazon Polly SynthesizeSpeech
APIを使うわけですが、Lambdaから利用する場合はSDK経由で利用できるため非常に簡単です。
Polly — Boto 3 Docs 1.4.2 documentation
http://boto3.readthedocs.io/en/latest/reference/services/polly.html#Polly.Client.synthesize_speech
実際にLambdaから呼び出してる部分は↓のように簡単です
client_polly = boto3.client('polly', region_name="us-east-1") response = client_polly.synthesize_speech( OutputFormat='mp3', Text=msg, TextType='text', VoiceId='Mizuki' )
1点だけ困ったのはLambdaは東京リージョンにデプロイしていたので、東京リージョンに来ていないAmazon Polly をboto3.client('polly')
として呼び出すとエンドポイントがない
とのエラーが出ます。
これがchaliceのエラー処理で元のエラーを消してしまう仕様と相まってなかなか気が付きませんでした・・・
これを回避するには、boto3のクライアントを作成する際に引数でリージョンを渡すこと解決できます。クレデンシャルについても同様に引数に与えることで別のものを利用することができます。
Credentials — Boto 3 Docs 1.4.2 documentation
http://boto3.readthedocs.io/en/latest/guide/configuration.html
また、蛇足になってしまいますがboto3のドキュメントを見てみるとAmazon Polly にgenerate_presigned_url
が用意されているのが確認できます。
Polly — Boto 3 Docs 1.4.2 documentation
http://boto3.readthedocs.io/en/latest/reference/services/polly.html#Polly.Client.generate_presigned_url
generate_presigned_url
を利用すれば、一時的にAmazon Pollyの機能を外部から利用することが可能になりますしいろいろと夢が広がりますねぇ
音声保存
Amazon Polly SynthesizeSpeech API で作った音声ファイルをS3に保存します。Slackにレスポンスとして投稿したいので、ただ単純に保存するだけではなくS3のgenerate_presigned_url
を利用して一時的にアクセスを許可しておきます。
現在時刻で検索した結果の音声ファイルなので、数時間後に急いで聞き直したいというような要望はなさそうなので有効期限はデフォルトのまま60分になっています。
S3 — Boto 3 Docs 1.4.2 documentation
http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.generate_presigned_url
1点だけ困ったのは ClientMethod
に許可する操作(今回はget_object
)を指定するわけですが、この指定する操作についての権限がポリシーに設定されていない場合でもgenerate_presigned_url
の実行自体はは成功するようです。
しかし、実際にアクセスしてみると権限が付加されていないためファイルが見えないという自体になりました・・・許可する操作についてもポリシーにて許可が必要となるっぽいのでご注意ください。
結果
これでようやくSlackで乗換 高円寺 目黒
のような入力反応して、Amazon Pollyがそれっぽく話してくれるようになりました!!
実際に利用してみると・・・
高円寺ー飯田橋
の検索結果(途中乗換なし)高円寺ー目黒
の検索結果(途中乗換あり)高円寺ー虎ノ門二丁目
の検索結果(バスを含む)駅名が一意にならない場合
の検索結果
実際の音声ファイル
mp3
のままだとTwitterにUPできなかったので、音声ファイルのみのmp4
動画に変換してUPしてあります。以下のサイトを利用しました。便利。
高円寺ー飯田橋
の検索結果(途中乗換なし)高円寺駅を04:43にJR中央線・東京行きにて出発すると、飯田橋駅には05:03にJR中央線・東京行きにて到着します。片道220円で20分かかります。
twitter.comRoute search result of "高円寺" to "飯田橋" talked by Amazon Polly. pic.twitter.com/TNbeF077S7
— Manabu Uchida (@uchimanajet7) 2016年12月23日高円寺ー目黒
の検索結果(途中乗換あり)高円寺駅を04:43にJR中央線・東京行きにて出発すると、目黒駅には05:14にJR山手線内回り・渋谷・品川方面にて到着します。片道220円で31分かかります。乗換が途中1回必要で新宿駅にて乗り換えてください。
twitter.comRoute search result of "高円寺" to "目黒" talked by Amazon Polly. pic.twitter.com/BXcZjxdivq
— Manabu Uchida (@uchimanajet7) 2016年12月23日高円寺ー虎ノ門二丁目
の検索結果(バスを含む)高円寺駅を07:01にJR総武線・千葉行きにて出発すると、虎ノ門二丁目/東京コミュニティバス停には07:49に港区・ちぃばす(芝ルート)・田町駅東口行きにて到着します。片道440円で48分かかります。乗換が途中3回必要で四ツ谷駅、赤坂見附駅、新橋駅、新橋駅/東京コミュニティバス停にて乗り換えてください。
twitter.comRoute search result of "高円寺" to "虎ノ門二丁目/東京コミュニティバス" talked by Amazon Polly. pic.twitter.com/0kvYZJ54no
— Manabu Uchida (@uchimanajet7) 2016年12月23日
以上のように、それっぽく返答するようになったと思います。中の人がもっと複雑な検索を試した場合はどーなるかちょっとわかりませんがw
まとめ
- Amazon Polly で話してもらうことはできた
- 思ったよりもずっと簡単に利用することができる
- 抑揚とかは利用するシーンで適宜利用する必要がありそう
- このままでは実用には足らないが、いろいろと工夫をしていけば面白そう
- 例えば1つの検索結果でも、短い音声ファイルを複数作った方が良さそう
- 音声ファイルが長いと目的の個所を聞くまでに時間がかかる
- 短い音声ファイルなら繰り返し再生することも容易にできる
- 現実味がありそうなのは経路の区間ごとの音声ファイル化かな?
- 駅すぱあとWebサービスを使うのは簡単
- でも、JSONをいろいろ操作するのは面倒
- 特に
配列
だった要素が単一
になるとか、要素の下が急に詳細に変更になるとか検索結果によって違う場合があるのが困る - いちいち対処するのは面倒だし手間なので、ぜひ
SDK
の提供を希望!
- 現状はdocomo Developer supportの方が便利なので、本家の今後に期待しています。
- 動かしただけで終わってしまっているが、Lambda経由で呼べることには意味がある
- これにより非同期や定期実行などを行うことができる
- 会社でお使いのカレンダーやらSalesforceと連携ができると、
めんどくさい
ことをいろいろと自動化できそうですね。 - しかも結果やら入力やらはSlackと連携してしまえば楽そうです
- 個人的にも勉強会に出かけることも多いので試しに作ってみたいところです
- 今回使ったプログラム類はGitHubに上げました。簡単なので必要ないかもしれませんが試してみたい方は覗いてみてください。
今後
- 今年のre:Invent 2016 で発表のあった
Amazon Lex
をはじめとした音声によるコントロール VUI
という表現を使っていますが非常にわかりやすい入力方法ですよねAWS re:Invent 2016: From VUI to QA: Building a Voice-Based Adventure Game for Alexa (ALX305) from Amazon Web Serviceswww.slideshare.net
www.youtube.com- 話すだけで操作ができるのは、詳細な説明なしでも使い始められますし
- 駅すぱあとWebサービスのようなものはこれと相性が良さそう
- 手軽に使ってもらえるようにいろいろノウハウが蓄積できると面白そう
- 今後の幅広い応用を期待しています!
- 実際に音声入力ではありませんが他社だとこんな事例も出始めましたね
ナビタイムジャパンのLINE公式アカウントにて終電・始発検索機能を追加|ナビタイムジャパン
http://corporate.navitime.co.jp/topics/pr/201612/21_3997.html - 既にこんなことが可能なものもあるようですね
- 遠くない未来に実現しちゃうかも知れませんね!
宣伝
絶賛人材募集中らしいですよ!製品/サービスと現場は最高でした。あとはよく知らないw
また、勉強会の会場も提供しているようですので問い合わせてみてはいかがでしょうか?
ヴァル研究所の勉強会の会場 | Doorkeeper
https://www.doorkeeper.jp/%E4%BC%9A%E5%A0%B4/vallaboratory
まだまだ続く「ヴァル研究所 Advent Calendar 2016」
12/25 の最終日までまだまだ続く ヴァル研究所 Advent Calendar 2016
明日以降の投稿も楽しみですね!
今回は空気読まず参加してしまいましたが、中の人の素晴らしい投稿の方が良いと思うので来年は中の人の豊富な投稿を楽しみにしております。
以上になります。