LoginSignup
61
63

More than 3 years have passed since last update.

はじめに

この記事は社内のLT大会で発表した資料とその発表内容です。
さくっと見たい方は以下の資料を参照ください。

introduction_alexa.png

何故今更Alexa?

モブプロ勉強会でAlexaをテーマに実施した ところ、老若男女問わず好評でした。
にも関わらず特に気になったのは、Alexaのシステム構成が浸透していない部分でした。
AlexaSkill開発は下火になっている印象を持つものの、まだまだその領域に手を出していないエンジニアが多いというのは勿体ない気がしていて、改めてAlexa教に入門していただき、Alexaの発展に貢献していただこう というのがきっかけです。
注意) 筆者はAlexaとは全く関係ありません。趣味です。

Alexaの始め方

  1. メールアドレスを用意する
  2. スキル開発 基礎トレーニングシリーズ を読む

以上です。
AWSアカウントもAmazonEchoも不要です。
Lets Alexa Life!!

Alexa Structure

全体構成

alexa_order.png

登場人物 役割(start) 役割(end)
人間 声を出す 耳で聞く
Echo 声からAlexaSkillを切り分けて該当するSkillを呼び出し 人に会話を返す
Alexa 声データからIntentを切り分けてBackendを呼び出し Backendから言われた通りにEchoに返す
Backend Alexaが構造化したデータを基にビジネスロジック それっぽい会話テキストを返す

大体Backendがメインです。

Skill

Alexa Skill1つにつき1つの呼び出し名を持ちます。

  • 例1:「Alexa天気を教えて」
  • 例2:「Alexaピカチュウを呼んで」

ウェイクワード「Alexa」、呼び出し名「天気
呼び出し名によって呼び出すSkillを切り替えています

Skill内会話

Skill内の会話にはセッションを持ちます

:boy_tone2:「Alexa、コーヒーショップを開いて」
:microphone2: 「何をご注文なさいますか」
:boy_tone2:「アイスコーヒーください」
:microphone2: 「ご注文ありがとうございます」

呼び出し~会話の終わりまでAlexaSkillはあなたを待ち受けています

Intent

Skillは複数のインテント=会話パターンを持ちます

  • 例1:「アイスコーヒーください」
  • 例2:「ストローもつけてください」
  • 例3:「3杯お願いします」

あらかじめ会話パターンは定義しておきます
つまりユーザの会話を予測しておかなければなりません

フレーズスロット

インテントにはフレーズスロット=可変長の引数を定義できます

  • 例1:「アイスコーヒーください」
  • 例2:「紅茶ください」

フレーズスロット「アイスコーヒー」、「紅茶」
ユーザが自由に発話出来る引数を定義 しておき、Backendの処理内容を変えられます

SearchQuery

フレーズスロットは飲み物の種類等Amazon側で予め用意された単語を拾います
自由な単語を拾うためには SearchQuery を使います

ただし、Alexa側で良い感じな変換処理をかけてくれないので、 予想したフレーズと実際の発話フレーズが異なることがあります
例:「コーヒー」⇒「こおひい」

ここまでの整理

Alexa機能集

アカウントリンク

認可フローで別のリソースにアクセスする機能です。
イメージ

#access tokenってAlexaさんが管理してくれる? :thinking:

ユーザ情報取得API

Amazonアカウント情報にアクセスする機能(OIDC)
イメージ

Skill Connections(現在Preview)

別のSkillにデータ連携出来る

例)
:boy_tone2:「Alexa、Amazonで〇〇を購入して」
:boy_tone2:「注文書をプリンタで印刷して」
   ⇒(別のSkillに情報連携して印刷予約)

声帯変更

Backendのreturn時にSSML(音声合成マークアップ言語)を定義することで声帯を変更する
エフェクトの変更やmp3を読み上げさせるオプションもある
# あなた好みの声に変更できるチャンス :thinking:

Backend

サーバ選定

BackendはAWS Lambdaのイメージが強いですが、下記の要件を満たせればなんでも良いです。

  • Rest API
  • I/FはJSON
  • エンドポイントは1つ
  • SSL通信

つまり言語もサーバも自由に選べます
# なんだったらFaaSのColdStart問題とAlexaの8秒制約あるので自前サーバの方が都合良いやも

I/F

I/Fはapplication/jsonです

sample(Request)

{
  "request": {
    "type": "IntentRequest",
    "intent": {
      "name": "HelloWorldWithNameIntent",
      "slots": {
        "firstName": {
          "name": "firstName",
          "value": "terarara",
          "confirmationStatus": "NONE"
        },
      ・・・

# HelloWorldWithNameIntentにfirstNameを渡しています

Unit Testing

I/F情報を保持しておけば単体テストコードも書けます

const request = {
   //JSONをコピペ
  ・・・
}
describe("お試し", () => {
  it("requestを処理すると注文を受け付ける", () => {
    target(request, res);

    assert.deepEqual(
      res.body.response.outputSpeech.ssml,
      "<speak>ご注文ありがとうございます</speak>"
    );
  });
}

コード管理

AlexaSkillはJSON Editor機能があります のでJSONを保持しておくことでコード管理が可能です
backendは言わずもがな、管理しておきましょう

おわりに

一口にAlexaと言っても様々な機能の上に成り立っていることがわかります。
これらの他にも Alexa echo showを使った視覚サポートやIoTデバイスとの連携などまだまだ進化を続けています。
皆さんも是非AlexaSkillを開発してVUI業界を盛り上げていきましょう!
注意) 筆者はAlexaとは全く関係ありません。趣味です。

61
63
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
63