AWS の AI 系 API を生放送に取り入れようとしてみた

AWS Summit Tokyo 2017(2017年5月30日~6月2日) に参加させていただいたので、得たものをアウトプットです。

時間が経ってしまったので、行ってきましたブログではなく、盛り上がっていた AI 系の API を生放送で上手いこと使えないか調べてみました。

今回調査する API のリスト

自分でモデルを構築する機械学習サービスではなく、 AWS が提供してくれている API を使う実験です。

Amazon Lex

Amazon Lex (音声やテキストを使用した会話型インターフェイスを構築) | AWS

音声やテキストを使用して、任意のアプリケーションに対話型インターフェイスを構築するサービスです。

とのことなので、チャット Bot で自動応答システムを作れそうなやつですね。 Alexa で使用されている技術を利用できるとのことです。

雑感

Lex は雑談系 API ではなく予め定義したヒアリング項目を会話インターフェースで埋めていく API です。ざっくりいうと入力フォームを会話インターフェースで代替できる API です。

データ構造としては以下があります。

  • Intent
    • データのカテゴリみたいなやつ
    • 花情報、お届け先情報みたいな感じで情報のまとまりの単位
  • Slot
    • 詳細なデータ項目
    • 花情報なら、花の種類や色、本数などの詳細項目の単位

なんとなくの動きはこんな感じです。

  • お花を注文したいです
    • どんな花?
  • バラで
    • 何本?
  • 3本ほしい
    • どこに届ければいいの?
  • 東京都渋谷区〜〜〜
    • バラを3本、東京都渋谷区〜〜〜に届ければいいのね?
  • はい
    • 了解!

みたいな。 Lex の担当範囲は文章として投げられた問い合わせをパースして、必要なデータを抽出するところ。

例えば最初の注文でバラを3本、と投稿されれば、本数の確認は済んだものとして次の項目(届け先)に移ってくれます。

テキストチャットだけでなく音声入力にも対応しているのでハンズフリーで使えます。

Lex のバックエンドには Lambda が使えて、 Lambda には現在の Intent や Slot に入った項目、どのインターフェースをユーザーが使っているのかなどが渡ります。

生放送では

残念ながら日本語対応がまだなので、既存の生放送に組み込むのは諦めました。

音声入力が可能なので、たとえばゲーム配信をしながら配信の操作を行うのに使えそうです。

視聴ユーザー側への提供では EC 機能などの入力ツールとしての仕様でしょうか。フォームの代替としての使い方が基本になりそうなので、よくある全員が書き込むチャットでの使用はアイデアが必要そうです。

配信プラットフォーム側としてはお問い合わせ窓にぜひ使ってみたい API でした。

Amazon Polly

Amazon Polly (文章をリアルな音声に変換) | AWS

Amazon Polly は、文章をリアルな音声に変換するサービスです。

テキストの読み上げです。コメントの読み上げ機能に使えますね。

雑感

Polly は日本語に対応しています。ただし、今のところ声は一種類( Mizuki, Female )だけでした。

とりあえず以下のテキストを読み上げてみました。

こんにちは、ミズキです。読みたいテキストをここに入力してください。

HTML

ふれーっす

ちょwwwwおまwwwwww

88888888888888888888888888

結果がこちらの音声ファイル(MP3)です。

音声1

1行目の日本語は自然に読み上げられている気がします。3行目以降のスラングについては、 ふれーっす は違和感が強くでているように思います。 ちょwwwwおまwwwwww のような記号がはいるものは素直に読み上げてしまっています。

素直な日本語の文章であれば聞き取るのに不自由はないですが、まだまだ機械読み上げとバレてしまうなーという感想です。

Polly の良いところですが、レキシコンという読み上げのカスタム辞書を定義することができるのでスラングもある程度は対応することができます。

レキシコンの管理 - Amazon Polly

今回はこのような設定をしてみました。

<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0" 
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon 
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" xml:lang="ja-JP">
  <lexeme>
    <grapheme>HTML</grapheme>
    <alias>Hypertext Markup Language</alias>
  </lexeme>
  <lexeme>
    <grapheme>ちょwwwwおまwwwwww</grapheme>
    <alias>ちょワラワラワラワラおまワラワラワラワラワラワラ</alias>
  </lexeme>
  <lexeme>
    <grapheme>88888888888888888888888888</grapheme>
    <alias>パチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチパチ</alias>
  </lexeme>
</lexicon>

結果の音声ファイルがこちらです。

音声2

日本語読み上げで英語を読ませると発音が微妙ですね。スラングはとりあえず読み上げることはできました。

今回は省略しましたが、 phoneme というタグもありまして、発音記号を指定できるので発音も調整することが可能です。

レキシコン以外にも SSML による発音やボリュームの指定ができます。

また、音声出力をさせる以外にもスピーチマークというメタデータを取得することができます。

スピーチマーク - Amazon Polly

スピーチマークに viseme という項目があるのですが、こちらは各音素に対応する顔と口の動きを表すそうです。

ビゼーム と Amazon Polly - Amazon Polly

発声の動きが取得できるので、キャラクターに喋らせるような視覚的表現に使えそうです。

生放送では

とりあえず読み上げるだけならさくっと導入できそうでした。読み上げ精度は、まぁ機械読み上げだよなーというレベル。

Polly の責務ではなさそうですが、レキシコンによる指定が単語単位の指定のため、スラングの指定で w8 の数を完全一致で定義しないと反応しなかったです。正規表現などで上手いこと指定したい。

英語のみの読み上げはとてもスムーズに読み上げられているように聞こえました。

スピーチマークを使えば、キャラクターが出演者として生放送するようなコンテンツが作れたりするのでしょうか。

Amazon Rekognition

Amazon Rekognition (深層学習に基づく画像認識サービス) | AWS

Amazon Rekognition は、画像の分析をアプリケーションに簡単に追加できるようにするサービスです。Rekognition では、画像内の物体、シーン、顔の検出、有名人の認識、および不適切なコンテンツの識別ができます。

とのことで、いろいろな画像解析ができます。

雑感

とりあえず順番に使ってみます。本当は生放送の動画から FFmpeg などで切り出したサムネイルを用いて〜とやりたいのですが、権利の問題のためフリー素材の画像で試します。

今回は ぱくたそ-フリー写真素材・無料ダウンロード さんにお世話になります。いつもありがとうございます。

Object and scene detection

物体とシーンの検出です。写っている物体の検出と、全体としてどういうシーンか(夕焼けとか)を検出してくれるとのこと。

まずは人物から。

人物の結果

きちんと人物と検出できており、背景の本棚も認識できているようです。

続いて桜。

桜の結果

とりあえず花とは認識できているようです。確率は下がってしまっていますが、 77.6% で桜と認識もできました。

手前の菜の花は上がってきませんでした。

最後に牛人間。

牛人間の結果

これは人間として判定されるようです。

検出の得意不得意は学習時の教師データに依りますが、ざっくり試した感じだと人物や風景写真に何があるかの検出精度が高そうな雰囲気でした。

生放送ではスタジオ配信なのか屋外での撮影なのかなど、配信ジャンルの分類に使えそうですね。ダイジェスト作成時のシーン転換の検出にも使えそうです。

Image moderation

“画像の節度” とのことですが、こちらはアダルト画像などの判別ですね。下着と水着の判別のような精度を確認したいですが、精度に言及するほどの見せちゃいけない画像ストックがないので割愛します。

言うまでもなく、生放送においては映像の監視は必須なのでありがたい機能です。とはいえ精度が 100% とはいかないはずなので、人力検知が必要になるのか悩ましいところ。

Facial analysis

顔分析とのことで、顔の検知と表情の分析をしてくれます。また、検出された顔の位置情報も出力してくれます。

サラリーマンに笑顔で診断結果を話す医者

笑顔の男性として認識されました。年齢も表示されますが、妥当そうに見えます。

出力される詳細情報が以下。

{
    "FaceDetails": [
        {
            "AgeRange": {
                "High": 38,
                "Low": 23
            },
            "Beard": {
                "Confidence": 99.88099670410156,
                "Value": false
            },
            "BoundingBox": {
                "Height": 0.26210349798202515,
                "Left": 0.28777778148651123,
                "Top": 0.16026711463928223,
                "Width": 0.17444443702697754
            },
            "Confidence": 99.99989318847656,
            "Emotions": [
                {
                    "Confidence": 98.49005126953125,
                    "Type": "HAPPY"
                },
                {
                    "Confidence": 2.324265241622925,
                    "Type": "SAD"
                },
                {
                    "Confidence": 0.7605314254760742,
                    "Type": "CALM"
                }
            ],
            "Eyeglasses": {
                "Confidence": 99.9989242553711,
                "Value": false
            },
            "EyesOpen": {
                "Confidence": 99.84434509277344,
                "Value": true
            },
            "Gender": {
                "Confidence": 99.92849731445312,
                "Value": "Male"
            },
            "Landmarks": [
                {
                    "Type": "eyeLeft",
                    "X": 0.3512860834598541,
                    "Y": 0.24727152287960052
                },
                {
                    "Type": "eyeRight",
                    "X": 0.4091435670852661,
                    "Y": 0.232853502035141
                },
                {
                    "Type": "nose",
                    "X": 0.3978043496608734,
                    "Y": 0.30854734778404236
                },
                {
                    "Type": "mouthLeft",
                    "X": 0.3508286476135254,
                    "Y": 0.34180906414985657
                },
                {
                    "Type": "mouthRight",
                    "X": 0.41227075457572937,
                    "Y": 0.32580694556236267
                },
                {
                    "Type": "leftPupil",
                    "X": 0.3533526659011841,
                    "Y": 0.2476949244737625
                },
                {
                    "Type": "rightPupil",
                    "X": 0.4097452759742737,
                    "Y": 0.2350766956806183
                },
                {
                    "Type": "leftEyeBrowLeft",
                    "X": 0.3241878151893616,
                    "Y": 0.23118382692337036
                },
                {
                    "Type": "leftEyeBrowRight",
                    "X": 0.3419976234436035,
                    "Y": 0.21752969920635223
                },
                {
                    "Type": "leftEyeBrowUp",
                    "X": 0.3636026978492737,
                    "Y": 0.21767348051071167
                },
                {
                    "Type": "rightEyeBrowLeft",
                    "X": 0.4005296528339386,
                    "Y": 0.2100147008895874
                },
                {
                    "Type": "rightEyeBrowRight",
                    "X": 0.41270801424980164,
                    "Y": 0.2012871354818344
                },
                {
                    "Type": "rightEyeBrowUp",
                    "X": 0.42687031626701355,
                    "Y": 0.19848868250846863
                },
                {
                    "Type": "leftEyeLeft",
                    "X": 0.3391617238521576,
                    "Y": 0.24942179024219513
                },
                {
                    "Type": "leftEyeRight",
                    "X": 0.36388713121414185,
                    "Y": 0.24654965102672577
                },
                {
                    "Type": "leftEyeUp",
                    "X": 0.3507053852081299,
                    "Y": 0.24253292381763458
                },
                {
                    "Type": "leftEyeDown",
                    "X": 0.3516284227371216,
                    "Y": 0.25129595398902893
                },
                {
                    "Type": "rightEyeLeft",
                    "X": 0.3978275656700134,
                    "Y": 0.2385561168193817
                },
                {
                    "Type": "rightEyeRight",
                    "X": 0.4200177788734436,
                    "Y": 0.2298586219549179
                },
                {
                    "Type": "rightEyeUp",
                    "X": 0.40832263231277466,
                    "Y": 0.22751648724079132
                },
                {
                    "Type": "rightEyeDown",
                    "X": 0.4101853370666504,
                    "Y": 0.23683662712574005
                },
                {
                    "Type": "noseLeft",
                    "X": 0.37390583753585815,
                    "Y": 0.31888213753700256
                },
                {
                    "Type": "noseRight",
                    "X": 0.40490350127220154,
                    "Y": 0.3160232901573181
                },
                {
                    "Type": "mouthUp",
                    "X": 0.3874001204967499,
                    "Y": 0.3356427550315857
                },
                {
                    "Type": "mouthDown",
                    "X": 0.3873828053474426,
                    "Y": 0.3668783903121948
                }
            ],
            "MouthOpen": {
                "Confidence": 59.87575149536133,
                "Value": false
            },
            "Mustache": {
                "Confidence": 96.07781219482422,
                "Value": false
            },
            "Pose": {
                "Pitch": -20.56659698486328,
                "Roll": -11.389120101928711,
                "Yaw": 23.49652862548828
            },
            "Quality": {
                "Brightness": 55.80268096923828,
                "Sharpness": 99.9305191040039
            },
            "Smile": {
                "Confidence": 86.74140930175781,
                "Value": true
            },
            "Sunglasses": {
                "Confidence": 98.07421112060547,
                "Value": false
            }
        }
    ],
    "OrientationCorrection": "ROTATE_0"
}

座標が表示されるので切り取って加工もできそうです。

感情の検知や目が開いているかを検知できるので、生放送ではこれらの分析と組み合わせた新しいコンテンツを考えるのが良さそうな気がしています。

口が開いている人を検知してカメラを向けて〜とかもできるのでしょうか。

後述の人検知と組み合わせれば、誰々が笑っている番組!のように検索できそうです。

個人的にはどちらかといえば出演者の検知をするよりも見ている方々の表情分析でリアクションを数値化するのに興味があります。

Celebrity recognition

有名人の認識です。まずは日本一有名なフリー素材こと大川さん。

ぱくたその大川竜弥さん

日本人の検知はまだ弱いようです。大川さんでダメなのでフリー素材では限界そうです。

権利問題で引っかかるとアレなので載せませんが、海外のモデルやスポーツ選手、日本人でもグローバルに活躍している方は検知できました。

色んな表情の写真で検証してみましたが、登録されている人については検知精度は高く感じました。精度は高いですが日本人データはまだ教師データに追加してもらえていないようですね。

対応されればサムネイルから出演者を検知できるので待ち遠しい機能です。

Face comparison

最後に顔認識です。同じ人の顔を検出できます。

マネジメントコンソールで試す場合は、左側に探したい人の顔画像をアップロードし、右側に複数人が写っている画像をアップロードします。

検知成功

複数人の画像を使いましたが、問題なく大川さんの顔が検出できました。

一方で、メガネや髪型など何が寄与するのか確かめるためにメガネの大川さんで比較すると上手く行きませんでした。

検知失敗

得意不得意はあると思いますが、精度が気になるところですね。同一人物が映っている映像を検知するのは非常にやりたいことの1つなので、今後に期待したいです。

以上

駆け足ですが、現状の AWS にある AI 系の API について触れてみました。とりあえず触るだけならマネジメントコンソールからポチポチできるので超簡単です。

まだまだ求めたい精度に達していない感触でしたが、補助的に使うなら使い所は多そうです。

完全自動化に使おうとすると、2015年に Google Photo で生じたような問題のあるカテゴライズ(黒人をゴリラと誤認識する)が生じる可能性が残るので、責任の所在が難しいところ。

Google says sorry for racist auto-tag in photo app | Technology | The Guardian

この件は単なる誤認識なのか教師データに悪意ある分類データが混入していたのかは知りませんが、このようなトラブルを完全に防ぐのは深層学習だと難しそうですね。

認識精度は教師データに左右されるので、プラットフォームを運営するなら API だけでやろうとせず自プラットフォームのデータを教師データに使うことで類似データの精度は上がるかと思います。

とはいえプラットフォームに使えるデータとタグ付けが溜まっていないからこそ API を使いたいので悩ましい。

それはそれとして、 AWS Summit Tokyo 2017(2017年5月30日~6月2日) はとても楽しいイベントでした(会場間が遠くてちょっと移動が辛かったですが)。

ブース出展でも S3 の代替手段を狙うサービスが展示されていたり、 VR の体験スペースがあったり、何より Amazon の倉庫ロボが展示されていたのが個人的にはテンションが上りました。

またぜひ次もお邪魔したいです。ありがとうございました。

Share Comments
comments powered by Disqus