前回は、アマゾンエコーの英単語勉強スキルを作る準備を行いました。今回から早速プログラミングをしていきたいと思います。
と言っても、まずスキル開発するには、今回はPythonというプログラミング言語を使用するので若干ながら勉強も必要です。
初心者でまだ勉強中と言う人は、コピペするだけで動かすことも可能なので、一先ずは動かしてみることから初めてみる事をおすすめします。
かくいう私もPython初心者で、そんな初心者でも今回のようなスキルを開発することが可能なので、それほど難しいものではありません。是非、チャレンジしてみてください。
スポンサーリンク
アマゾンアレクサデベロッパーサイト

Amazon Alexa デベロッパサイト
アマゾンアレクサのスキルを開発するためには、まずデベロッパーサイトにログインする必要があります。下のリンクから開発者サイトにアクセスできます。
右上の「サインイン」からログインします。emailやパスパードは、アマゾンのアカウントを既に持っている人なら、そのアカウントが使用できます。
今回はアカウントの作成方法は割愛しますね。
アマゾンアレクサデベロッパーサイトにログイン
デベロッパーサイト右上の「サインイン」からログインします。「Amazon Alexa」を選択しクリックしてAlexa開発ページに移動します。
「Alexa Skills Kit(ASK)」をクリックします。
スキル開発のスタート
「スキル開発を始める」をクリックしてスキル管理画面に移動していきます。
この図には、既にスキルが作成されていますが、初めての場合には、ここにはまだスキルは追加されていません。「スキルの作成」をクリックしてスキルを開発していきます。
スキルの作成
まずは、スキル名を設定していきます。これは、色々なスキルを開発したら自分でどんなスキルなのか判別ができるようにわかりやすいスキル名にした方がいいです。
今回は「WordStudy」としました。
設定したら、「スキルの作成」ボタンを押します。
次に、テンプレートを選択していきますが、デフォルトの「最初から開発」を選んで「選択」をクリックします。
次に「スキルの呼び出し名」を設定します。ここでは、「word study」としました。
注意:全て小文字である必要があります。
スポンサーリンク
インテントの作成
次に、「インテント」というコマンドを作成していきます。
「インテント」とは?
これは、音声を認識したら音声アシスタントサーバーから、コマンド的なリクエストが発行されるもので、アプリケーションサーバーであるあなたのサーバーに要求(リクエスト)するコマンドです。

スキル開発開始画面
左側ビュー内に「インテント」とあります。ここをクリックすると、「インテント」の作成ページに移動します。
インテント名には、一語で指定したいので、wordとIntentを繋げて「wordIntent」としました。
インテントは、既にいくつか用意されています。ここでは、カスタムインテントを作成していきます。「カスタムインテントを作成」をクリックします。このwordIntentには、「スロット」といういわば付随するパラメータを設定していきます。
スロットの設定
「サンプル発話」欄に大括弧{}をつけることで、パラメータの設定ができます。ここでは、「word」としました。「追加」をクリックして、サンプル発話欄の右端の「+」をクリックすると、スロットが追加されます。
この{word}に発音した単語が格納されてインテントがアプリケーションサーバーにリクエストされることになります。
スロットとは:
インテントに渡す引数の事を「スロット」と呼びます。インテントの動作に必要な情報をアプリケーションに伝えるために使用されます。
スロットタイプ
スロットにはタイプがあり、発話を認識しやすいように特別にチューニングされているようです。例えば、「AMAZON.Color」に設定すると、色を表す言葉が認識しやすくなるようです。
でも、必ずしも、色の言葉だけしか認識しない訳ではなく、あくまでも色の言葉が認識し易いのであって、その他の言葉が認識されない訳ではありません。
ここでは、「AMAZON.Color」をスロットタイプとして設定しました。
スポンサーリンク
「stopIntent」の追加
続いて、「stopIntent」を作成します。
これは、途中で英単語勉強スキルを止めたい時に使用するコマンドです。「ストップ!」というと、「グッナイ!」とアレクサが言ってくれます。
ストップインテントは、スロットの設定は必要ありません。ストップと発音すると、このインテントが発動するように、サンプル発話欄には、「stop」とします。これはスロットではないので、大括弧{}は付けません。
これで、必要な「インテント」の追加は完了です。最後に、「モデルの保存」をクリックして保存します。
エンドポイントの設定
エンドポイントの設定では、アプリケーションサーバー(私はXREAのレンタルサーバーを使用しています)の設定をします。
前回の記事で、使用するサーバーのセットアップを紹介しています。まだの方は、こちらを参考に設定してみてください。XREAサーバーを使うと、無料でしかも無料のSSL化(HTTPS)が可能なので、おすすめです。
-
初心者でもできる!アマゾンエコーで英単語勉強スキルを作って見た〜準備編〜
AmazonエコーPlusを購入して彼此1年になります。最近は、天気や音楽を聞くことくらいしか使っていません。 最初は、英語の応対が滑らかなので、英語の勉強にと思って購入したんです。
エンドポイントとは?
エンドポイントですが、これは準備したレンタルサーバーを指定していきます。アマゾンWebサービス(AWS)の仮想サーバーを使用することも可能ですが、今回はXREAサーバーで設定します。
と、言っても、XREAのサーバーのURLを入力するだけです。URLのアドレスには、サーバーのアドレスにこれから作成するPythonのプログラムのファイル名を指定します。
Pythonのファイル名は、word_study.pyとします。
注意:このURLには、HTTPSが必須です。https://から始まるサーバーを用意する必要があります。いわゆる常時SSL化ってやつですね。私は、XREAサーバーの無料SSLを使用しました。前回の記事を参考にしてください。
最後に「エンドポイントの保存」をクリックして、さらに「モデルをビルド」して終了です。
アプリケーションの実装
次に、ちょっと順番が変わってしまいますが、レンタルサーバーに置くアプリケーション(Pythonのプログラム)をプログラミングしていきます。
プログラミング言語は、Pythonを使用します。本来、Pythonの実行テストなどは、ローカルPCで行い、サーバーで実行されるか確認するというステップを踏みます。今回は、ローカルPC上にPythonをインストールする方法などは割愛し、他のサイトでもっと詳しく説明されているので、そちらにお任せします。
今回は、サーバーに置く、プログラムのみ紹介します。
このプログラムのコピぺでも動作可能です。ファイル名は、先ほど、スキル作成時に「エンドポイント」のURLに指定したファイル名にします。
ここでは、word_study.pyとします。
Python初心者が作成したので、上手なプログラムではありませんが、ご容赦ください。
注意:保存する時には、「UTF-8 BOMなし」で保存します。
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
import json
import sys
import random
input =json.load(sys.stdin)
with open("input.txt","w") as file:
json.dump(input, file, indent=4)
wBank = {
"record" : "His time in the 100m dash was a new record. ",
"score": "The score of the baseball game is tied at four. ",
"prize": "She won first prize in the piano contest. ",
"award": "The lucky man got an award of ten million yen. ",
"win" : "Which team do you think will win the next world cup. ",
"race" : "Was it a tough race for you? ",
"coach": "He is a baseball player coach at this school. ",
"match" : "I couldn't get a ticket for the match. ",
"tournament" : "This city hosts a tennis tournament. ",
"professional" : "I'm not a professional player but I want to be one. ",
"judge": "A judge is not an easy job to do. ",
"athlete": "His mother was an excellent athlete. ",
"rival" : "The two schools have been rivals for many years. ",
"train" : "Our coach trained us for the important game. ",
"exercise": "She exercises every morning before going to work. ",
"practice": "The tennis team practiced hard until dark. ",
"indoor": "I like indoor sports better than outdoor ones. ",
"nature": "Being out in nature makes me feel good. ",
"temperature": "Today's temperature will be higher than yesterday's. ",
"victory" :"He shared a victory with his teammates. ",
}
try:
count = input["session"]["attributes"]["count"]
except KeyError:
count = 0
try:
intent = input["request"]["intent"]["name"]
except KeyError:
intent = ""
try:
utterance = input["request"]["intent"]["slots"]["word"]["value"]
except KeyError:
utterance = ""
end = False
word = [key for key in wBank.keys() ][count]
if intent == "wordIntent":
if utterance == word:
respond = "Good pronunciation! The example is. "
nextRespond = "Ok, then. Next word, repeat after me. "
#Get current key from word bank (wBank)
#word = [key for key in wBank ][count]
example = wBank[word]
#increment next word
if count != len(wBank)-1:
count +=1
nextWord = [key for key in wBank.keys() ][count]
text = respond + example + nextRespond + nextWord
end = False
else:
#respond = "Good pronunciation."
nextRespond = " Now You are at the end. Thank you, good bye. "
text = respond + example + nextRespond
end = True
else:
badRespond = [
"Too bad, listen carefully, repeat after me. ",
"Hmm. I can't get it, say again. ",
"Don't be shy. Pronounce as it is heard. Listen carefully. "
"Almost, try again. ",
"Close. "
]
respond = random.choice(badRespond)
text = respond + word
end = False
elif intent == "stopIntent":
text = "Good night"
end = True
else:
silent = ""
start = "Let's study English together. I am going to say a word, repeat after me. "
text = start + silent + word
print ('Content-type: application/json; charset=UTF-8')
print ("\r\n\r\n")
output ={
"version":"1.0",
"sessionAttributes":{
"count":count
},
"response":{
"outputSpeech":{
"type":"PlainText",
"text": text
},
"shouldEndSession":end
}
}
json.dump(output, sys.stdout)
このプログラムでは、単語リストを「wBank」という配列に自分で打ち込んでいます。
単語は、単語帳から抜き出して列挙しました。
単語の右側に、単語帳の使用例をそのまま書き込んでいきます。とりあえずは、20個の単語を打ち込みました。
必要に応じて、単語を増やしてください。
スポンサーリンク
Pythonプログラムをサーバーにアップロード
最後に、作成したPythonのプログラムを、サーバーにアップロードして終了です。
私は、FTPクライアントに「File Zilla」を使用しています。前回の記事でインストールの方法も掲載しているので、参考にしてください。
-
初心者でもできる!アマゾンエコーで英単語勉強スキルを作って見た〜準備編〜
AmazonエコーPlusを購入して彼此1年になります。最近は、天気や音楽を聞くことくらいしか使っていません。 最初は、英語の応対が滑らかなので、英語の勉強にと思って購入したんです。
FTP接続
ファイルのアップロード
このように、 FTP接続すると、左側ビューにローカルPCのファイルエクスプローラーが見え、右側のビューにサーバー上ファイル構成が見えるようになっています。
XREAのレンタルサーバーでは、右側のビューの構成で、/public_html/www.xxx.shopにホームページのファイル類が置かれます。
今回作成したPythonのプログラムもここに配置します。
ファイル権限の変更
ファイルのアップロードが完了したら、今度は、Amazonの音声サービスがアクセスできるようにファイルの権限を変更しておいてあげましょう。
権限は、「705」が良いと思います。
これで、準備完了です。
スポンサーリンク
Alexa言語設定
これで、プログラミング関係は完了です。
はやる気持ちを抑えて、実際にAlexaちゃんに話しかける前に、Alexaの言語設定を英語にする必要があります。
Alexaの言語設定は、https://alexa.amazon.co.jp/にアクセスして、ウェブ上で設定できます。音声から設定することも可能ですが、ウェブから設定することで確実です。

https://alexa.amazon.co.jp
Alexaシミュレータ
さあ、いよいよプログラムの動作をテストしてみましょう。
まずは、Alexa developerサイトのスキル一覧から、作成したスキル(wordStudy)をクリックします。
スキル「モデルのビルド」が完了していれば、「テスト」をクリックしてスキルテストページに移動します。
Alexaシミュレータ
ここで、実際に発話する言葉を入力してみます。
まずは、スキルを呼び出す必要があります。
呼び出しには、Alexaちゃんに「open(オープン)」や「ask(アスク)」に続いて、スキル名を発音します。
早速、シミュレータに「open word study」と入力しみましょう。
うまくスキルが呼び出されると、Alexaちゃんが英単語学習のアプリを開始してくれます。
シミュレータの右側画面には、スキルのレスポンスがあります。このように反応が帰ってくれば、無事XREAのサーバーにアクセスできたことになります。
実際に、アマゾンエコーで確認
実際にアマゾンエコーで確認してみます。今度は、シミュレータのキーボード入力ではなく、実際に発音する必要があります。
「open word study(オープン ワード スタディ)」と発音してみてください。
既に、あなたのアマゾンエコーでスキルが動作するはずです。
あとは、自分で単語を増やしたりして、勉強に役立ててください。
まとめ
今回は、アマゾンエコーのスキルを自分で開発してみました。アマゾンエコーのスキルは、AIが実装されているわけではないので、自動的に対話してくれるものではありません。
Alexaスキルは、どんどん開発されその数も多いのですが、自分にあった英単語学習スキルがありませんでした。自分でスキルを開発することで、プログラミングの学習にもなり、また英単語の勉強もでき、一石二鳥です。
プログラム初心者でも挑戦できるように、細かく丁寧に書いたつもりです。アマゾンエコーさえあれば、無料で始められるので、是非挑戦してみてください。