Amazon Polly に駅すぱあとの検索結果を話してもらう #aws #jawsug #駅すぱあと #ヴァル研究所

★この記事は「ヴァル研究所 Advent Calendar 2016」の23日分のエントリーになります

qiita.com

注意
  • 機能/サービスの検証とスクリーンショットの取得は 2016/12/18 に行いました。
  • それ以降に変更が加えられた場合は結果が異なる可能性がありますのでご注意下さい。
  • 検証時に利用可能なサービスで検証しています。実際にご利用になる前に確認していただくようお願いします。

はじまり

今年は↓のように今所属している会社のアドベントカレンダーに参加してみました。

uchimanajet7.hatenablog.com

その際に企業・学校・団体単位のアドベントカレンダーがこんなに沢山あるのを知りました。

qiita.com

その中で見たことある会社のがあるっ!これはっ!となり、中の人に

  • 私「こんなの始めたんですね!」
  • 中の人「スタートしたんですが、あんまり書く人がいないっぽいです」
  • 私「おーそれは残念ですね」

社内にアドベントカレンダーの楽しさみたいなのが浸透するにはまだまだ時間がかかりそうな感じですね・・・

日本における技術系アドベントカレンダーの歴史 - 近&況
http://yhara.jp/2016/12/01/history-adcal-jp

re:Inventに参加した人とか、報告会を開催したとかでも良いので参加してみたらいいのになぁー残念。

もしくは去年の今頃のように、まだ勇者になってない頃に訪問してもらい桃鉄やってもらうのでも十分ネタになりそうですがw

blog.supinf.info

先日新作も出たみたいですし、もう一度勇者の姿で訪問して桃鉄でもやったらいいんじゃないですかねぇ?w

www.nintendo.co.jp

せっかくだから

せっかくだから、俺はこの赤の扉を選ぶぜ! ではなくて

デスクリムゾン - 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サービス を使ったネタを書くのは当然なんですが・・・

ekiworld.net

docs.ekispert.com

これまでのアドベントカレンダーで中の人が丁寧に説明されているので、これ以上書くことがないw

www.facebook.com

↑な投稿も見かけたのでAPI であることのメリットがなんか出るように、re:Invent で発表された新規サービスと組み合わせて使ってみようと思います。

Amazon Polly

今年のre:Invent 2016 で発表された新サービスで Turn text into lifelike speech using deep learning と公式で説明されています

aws.amazon.com

文字列を読み上げてくれるわけですが、かなりの精度でそのまま読んでくれます。漢字もわざわざ読みを渡さなくてOKなのは楽でいいです。

東京リージョンにはこの時点では来ていませんが、今回はリアルタイムで利用するわけではないので問題にはならないと思います。

使ってみる

AWS マネジメントコンソールにログインして Polly のページに移動すれば、利用することができます。

f:id:uchimanajet7:20161218225837p:plain

f:id:uchimanajet7:20161218225912p:plain

今回利用するのはテキスト読み上げ機能になるので、マネジメントコンソール上でテキストを入力してどのような感じになるのか試してみます。

実際にはAPIで取得した文字列をAPI/SDKを通じて、このテキスト読み上げ機能を利用することになります。

前提

駅すぱあとWebサービス の利用開始についてはすでに詳しく書かれているので、割愛しようかと思いましたが・・・

↓からの申し込みだと半年前と変わりがなければ温かみのある手作業 でアクセスキーを発行しているはずなので、基本的には営業日基準での対応となるはずです。

ekiworld.net

オープンデータをうたっているのに申し込みが必要で待ち時間があるのも、 個人的には違和感ありますねぇ。データカタログサイトに掲載してみたりしたらいいのに。

オープンデータ - 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

opendatahandbook.org

www.data.go.jp

とは、言っても仕組みは簡単に変わらないので・・・今後に期待しつつ今回はdocomo Developer supportを利用しました。

dev.smt.docomo.ne.jp

docomo Developer supportは、ドコモやパートナー企業が持つ様々なアセットを「API」として汎用化して提供し、開発者へ展開することで、新たな事業の創出を推進する協創プラットフォームです。と書かれている通り、駅すぱあとWebサービス以外にもたくさんのAPIが利用できます。

登録も簡単でSNSアカウントでのログインも可能です。注意が必要な点は

  • 検証用/開発用に発行されるアクセスキーには90日の有効期限が付いている
  • 駅すぱあとWebサービスを含むいくつかのAPIを利用するには 法人情報登録 が必要になる
  • 法人情報登録 とは? 所属する会社の住所やらを登録するだけで法人として会社で登録してもらう必要はない。
  • アカウント単位で所属の会社情報を入力するだけである
  • このためフリーランスの方は登録が難しいかもしれない

という感じになります。ユーザー登録してAPIの利用申請を行うとAPIにアクセスするための情報が発行されます。また、エンドポイントもこのサービス専用になるようです。

dev.smt.docomo.ne.jp

簡単に利用できるので検証/検討段階ではこれで必要十分な気がします。さすがNTTドコモ!!素敵です。

まずは

Amazon Polly に入力するための文字列を作る必要があります。駅すぱあとWebサービスで何らかの経路を検索して、その結果を適当に口語風にしたものを利用したいと思います。

簡単に書くと↓な感じ?

f:id:uchimanajet7:20161219101312p:plain

cloudcraft.co

入出力は色々面倒なので、みんな大好きSlackを利用します。

api.slack.com

Outgoing Webhooksを設定して 乗換 のキーワードに反応するようにしました。Slackに設定するアイコンは以下のWebからAndroidアプリ版のものを利用させてもらいました。

play.google.com

Amazon API Gateway + Lambda の組み合わせは動作させるのに楽なのでPython Serverless Microframework for AWS (chalice) を利用します。

github.com

chaliceについては↓で書いているので参考になれば。

uchimanajet7.hatenablog.com

uchimanajet7.hatenablog.com

chalice はこういうちょっと試したい時には本当に楽でいいですねーまだまだ対応しているAWSサービスが少なかったりとかしますが・・・

実際に今回使用した chaliceのバージョン0.5.0ではまだAmazon Pollyに未対応なので、↑のBlogの中に書いてあるように自動でポリシーが生成できません。

手動でポリシーを生成してかつ、デプロイ時には--no-autogen-policyオプションを指定する必要があります。

github.com

また、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で経路検索を行います

dev.smt.docomo.ne.jp

必須なのは出発駅名と到着駅名の2つだけなので、前述のSlackで乗換 高円寺 飯田橋 のような形で入力されたものを利用します。 これで現在時刻に出発する経路検索を利用できるようにします。

で、検索自体は簡単に出来るのですが・・・問題は結果のレスポンスデータ・・・久しぶりに使いましたけど相変わらずの面倒臭さがw

dev.smt.docomo.ne.jp

難しいと言うわけではないので、地道に必要な値を取得していってください。今回は単純化するために、検索結果の一番最初の経路を口語調にしています。

実際に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がそれっぽく話してくれるようになりました!!

実際に利用してみると・・・

  • 高円寺ー飯田橋 の検索結果(途中乗換なし)

    f:id:uchimanajet7:20161219131145p:plain

  • 高円寺ー目黒 の検索結果(途中乗換あり)

    f:id:uchimanajet7:20161219131155p:plain

  • 高円寺ー虎ノ門二丁目 の検索結果(バスを含む)

    f:id:uchimanajet7:20161219131207p:plain

  • 駅名が一意にならない場合 の検索結果

    f:id:uchimanajet7:20161219131217p:plain

実際の音声ファイル

mp3 のままだとTwitterにUPできなかったので、音声ファイルのみのmp4動画に変換してUPしてあります。以下のサイトを利用しました。便利。

m3tb.com

以上のように、それっぽく返答するようになったと思います。中の人がもっと複雑な検索を試した場合はどーなるかちょっとわかりませんがw

まとめ

  • Amazon Polly で話してもらうことはできた
    • 思ったよりもずっと簡単に利用することができる
    • 抑揚とかは利用するシーンで適宜利用する必要がありそう
  • このままでは実用には足らないが、いろいろと工夫をしていけば面白そう
    • 例えば1つの検索結果でも、短い音声ファイルを複数作った方が良さそう
    • 音声ファイルが長いと目的の個所を聞くまでに時間がかかる
    • 短い音声ファイルなら繰り返し再生することも容易にできる
    • 現実味がありそうなのは経路の区間ごとの音声ファイル化かな?
  • 駅すぱあとWebサービスを使うのは簡単
    • でも、JSONをいろいろ操作するのは面倒
    • 特に配列だった要素が単一になるとか、要素の下が急に詳細に変更になるとか検索結果によって違う場合があるのが困る
    • いちいち対処するのは面倒だし手間なので、ぜひSDKの提供を希望!
  • 現状はdocomo Developer supportの方が便利なので、本家の今後に期待しています。
    • ビジネスマンを「めんどくさい」から解放するそうですが、ぜひデベロッパーもめんどくさいから解放して欲しいです

      ekiworld.net

    • メールフォームベースでの利用開始とか、ちょっと使ってみたいだけなのに・・・というか、↑のサイトも問い合わせベースなんですねーそういう決まりでもあるんでしょうか?
    • 作って利用する人がいなければAPIがあっても意味がないですし
  • 動かしただけで終わってしまっているが、Lambda経由で呼べることには意味がある
    • これにより非同期や定期実行などを行うことができる
    • 会社でお使いのカレンダーやらSalesforceと連携ができると、めんどくさいことをいろいろと自動化できそうですね。
    • しかも結果やら入力やらはSlackと連携してしまえば楽そうです
    • 個人的にも勉強会に出かけることも多いので試しに作ってみたいところです
  • 今回使ったプログラム類はGitHubに上げました。簡単なので必要ないかもしれませんが試してみたい方は覗いてみてください。

    github.com

今後

宣伝

絶賛人材募集中らしいですよ!製品/サービスと現場は最高でした。あとはよく知らないw

www.val.co.jp

また、勉強会の会場も提供しているようですので問い合わせてみてはいかがでしょうか?

ヴァル研究所の勉強会の会場 | Doorkeeper
https://www.doorkeeper.jp/%E4%BC%9A%E5%A0%B4/vallaboratory


まだまだ続く「ヴァル研究所 Advent Calendar 2016」

12/25 の最終日までまだまだ続く ヴァル研究所 Advent Calendar 2016 明日以降の投稿も楽しみですね!

qiita.com

今回は空気読まず参加してしまいましたが、中の人の素晴らしい投稿の方が良いと思うので来年は中の人の豊富な投稿を楽しみにしております。

以上になります。