「コンピューター、私のビルドはどうですか?」そしてその他の魔法の呪文

Baruch Sadogurskyは、音声コマンドサービスAlexaの助けを借りて、IntelliJ IDEAやJenkinsなどのまったく予期しないものに音声インターフェイスを追加し、好きな飲み物を1杯飲んで椅子に寄りかかって、すべてを管理する方法を説明します。


この記事は、モスクワで開催されたJPoint 2017カンファレンスでのBaruchのスピーチに基づいています。

バルクは、JFrogで開発者関係に従事しています。 また、Groovy、DevOps、IOT、およびホームオートメーションの愛好家でもあります。

アレクサとは何ですか、なぜ私たちの生活の中にあるのですか?


この記事では、Alexaと話をします。 これはアマゾンの製品です-音声アシスタント、Siri、Cortana(誰かがそれを削除できなかった場合は神は禁止)、Google Homeなどと同じです。 Alexaは今日のマーケットリーダーです。理由は明らかですが、その理由について説明します。

Alexaデバイスには3つのタイプがあります。



Amazon Tapと話をします。 以前は、彼女は名前に応答する方法を知らなかったため、ボタンをクリックする必要がありました。したがって、名前はTapです。 現在、彼女はすでに名前に応答していますが、名前は残ります。 完全なAlexaは大きく、スピーカーも優れています。 弱いスピーカーを備えた「ファントムスティック」もあります。これは、他のレシーバー、スピーカーなどに接続するように設計されています。 それらはすべて非常に手頃な価格で、170、130、および50ドルかかります。 私は私の家に合計9人います。 なぜこれがすべて必要なのか、今から話します。

Alexaは今や議論の余地のない市場リーダーであると述べました。 彼女は、オープンスクリプトAPI Alexa Skillsのおかげでリーダーです。 つい最近、メインベースのスキル数は1万に達したと言われました。 それらのほとんどは愚かですが、多くの有用なスキルのおかげで、その有用性と人気においてAlexaに似たものはありません。 彼らが1万を記録した方法は非常に理解しやすいものです。 いくつかの行を変更してスキルを作成できるテンプレートがあります。 それを公開して、Tシャツを手に入れてください-そして今、彼らは1万枚持っています。 しかし、今日はもっと面白いスキルを書く方法を学びます-そして、あなたはそれが非常に簡単であることを理解するでしょう。

なぜこれに興味があり、私の場所にいるアレックス軍をどのように使用しますか?



私は立ち上がって、まず彼女にアラームをオフにするように頼みます(「アレクサ、アラームをオフにする」)。 それからどういうわけか私は台所に行き、明かりをつけるように頼む(「アレクサ、朝の明かりをつける」)。 私は彼女に挨拶します(アレクサ、おはようございます)。 ちなみに、彼女は「おはようございます」に興味深いことで応えます。たとえば、昨年マレーシアで大きなヘビが見つかったと報告しています。 朝、コーヒーの下で役立つ情報。

次に、ニュースについて尋ねます(「アレクサ、私のニュースフラッシュは何ですか?」)、そして彼女は私にさまざまなリソースからニュースを読みます。 その後、私は自分のカレンダーに何があるかを尋ねますか? (「アレクサ、私の議題は何ですか?」)。 このおかげで、私は私の一日がどのように見えるかを知っています。 それから、私はどのように仕事に行くのか、交通渋滞などがあるか尋ねます(「アレクサ、通勤はどうですか?」)。 これはホーム指向の使用であり、カスタムスキルはまったくありません。これらはすべて組み込まれています。

しかし、さらに多くのクールなアプリケーションがあります。




しかし、あなたはもちろん、アレックスについての消費者のスピーチを聞くためではなく、未来の音声インターフェースについて聞くようになりました。 今日、それは誇大広告であり、一般に、まったく予想外です。 しかし、この誇大広告は非常に重要です。なぜなら、音声インターフェイスは私たちが待ち望んでいるものだからです。 音声インターフェイスが機能するのを待って育ちました。 そして今、これは私たちの目の前で起こっています。

アナリストによると、過去30か月の間に音声インターフェースの分野で進歩があったが、これは過去30年では発生していなかった。 一番下の行は、ある時点で音声インターフェースがグラフィカルなインターフェースに置き換わったことです。 グラフィカルインターフェイスは、音声インターフェイスが十分に開発されていないために存在する松葉杖であったため、これは論理的です。

もちろん、表示する方が良いものもありますが、それでも、画面から行うことの多くは音声で行うことができ、実際に行う必要があります。

このAPIは、音声認識とアレックスが持つ特定の人工知能の上にあり、この業界の爆発的な発展と多くの人々が多くの有用なスキルを書く能力を保証するものです。

今日は2つのスキルがあります。 最初にアプリケーションIntelliJ IDEAを開きますが、もちろんクールですが、あまり便利ではありません(アプリケーションを音声で開き、ペンでコードを書くことはあまり意味がないので)。 2つ目はJenkinsについてであり、はるかに役立つはずです。

Alexaのライティングスキル


スキルを書くことは簡単で、3つの段階で構成されています。




インタラクティブな音声モデル:それは何ですか、なぜですか?


これは非常に単純なアイデアに基づいています。



テキストから変数を抽出してハンドラーに渡すことができます(たとえば、スロットであるIDEAを開くように要求しますが、RiderまたはSea Lionを開くように要求することもできます)。

JSONというコマンドを呼び出し、これらのコマンドがどのように聞こえるかをテキストで示します。 そして、ここで魔法が起こります。なぜなら同じことを異なる方法で言うことができるからです。 そして、この人工知能(Alexaが提供する音声認識)は、私が指定したチームだけでなく、すべての類似チームの意味も選択できます。 さらに、停止、開始、ヘルプ、はい、いいえなどの組み込みコマンドのセットがありますが、これらについては例を書く必要はありません。

以下に、どのサンプルが必要かを示すJSON IntentSchemaを示します。 これは、JetBrains Toolboxからツールを開く例です。

{ "intents": [   {       "intent": "OpenIntent",       "slots" : [        {  "name" : "Tool",              "type" : "LIST_OF_TOOLS"        }     ] }, {     "intent": "AMAZON.HelpIntent" }   ] } 

おわかりのように、OpenIntentというインテントがあり、ツールスロットが1つあります。 そのパラメーターはツールのリストです。 さらに、ヘルプもあります。

スロットタイプ


スロットのタイプは次のとおりです。


それらは列挙型ではないことを忘れないでください。 つまり、このリストは優先順位としてのみ機能します。 Alexaが他の単語を認識すると、それは私のスキルに転送されます。

これがまさにツールのリストです-私が彼女に与えたオプションです。



ここでのスペルは、Alexaが自然な単語で動作するという理由だけで、JetBrains製品のスペルとは異なります。 したがって、IntelliJ IDEAを一言で書くと、彼女はそれが何であるかを認識できません。

チームのフレーズの例


このツールの発見を主張するために人々がどのように適用できるかの例はここにあります:

 OpenIntent open {Tool} OpenIntent start {Tool} OpenIntent startup {Tool} OpenIntent {Tool} 

他のオプションがあります。 Alexaはこのセットを見ると、これらの単語の同義語もこの意図に該当することを知っています。

コマンドハンドラー


音声インターフェイスについて説明した後、コマンドハンドラーを作成しました。 これは非常に簡単に機能します。Alexaは、話している音声をJSON形式のRESTリクエストに変換します。

リクエストは、AWS Lambda Functionまたは任意のHTTPサーバーに送信できます。 Lambda関数の利点は、任意のHTTPサーバーを必要としないことです。 サービスを上げることなくハンドラーを作成できるサービスとしてのプラットフォームがあります。

AWS Lambda関数の利点:


Java 8ははるかに複雑です。 Javaでは、記述して呼び出すことができる最上位の関数はありません。これらはすべてクラスでラップする必要があります。 友人のSergei Yegorovは、Lambdaを使用している人たちと短い足を踏み、GroovyをLambdaで現在ではなく(jarファイルを作成して同じ方法で使用する場合)使用できるように取り組んでいます。 Groovyスクリプト。呼び出されるコールバックを使用してスクリプトを作成できる場合。

スピーチレット


AlexaのJavaリクエストを処理するクラスはSpeechletと呼ばれます。 スピーチレットを見ると、アプレット、ミッドレット、およびサーブレットについて覚えています。 そして、あなたはすでに何を期待しているのかを知っています-制御された実行サイクル、つまり、大まかに言えば、開発者としての「夏」の生活のさまざまなフェーズ、この場合はマッチレットで実装する必要のある種類のインターフェイスです。

そして、これはSpeechletインターフェイスであり、実装する必要がある4つのメソッドがあるため、間違えていません。

 public interface Speechlet { void onSessionStarted(SessionStartedRequest request, Session session);      SpeechletResponse onLaunch(LaunchRequest request, Session session);      SpeechletResponse onIntent(IntentRequest request, Session session); void onSessionEnded(SessionEndedRequest request, Session session); } 

最初、 nSessionStartedはAlexaが立ち上がり、彼女がマッチnSessionStartedを持っていることに気づいたときです。 onLaunchは、スキルの名前でコマンドを呼び出すときです。 onIntent人が私たちに話しかけたとき、 onIntentの形で彼が言ったことと彼が呼んだコマンドを取得したとき。 onSessionEndedは、通常のクリナップを作成するときです。

一般的に、それは他の「年」と非常に似ており、今度はコード内のすべてがどのように見えるかを見ていきます。

Speechletを書く場所


Amazonで作業する必要がある2つの場所があります。






「アレクサ、ジェンキンスに私のビルドはどうですか?」と言うユーザーがいます。 これはデバイス、この場合はAmazon Tapに送られます。 その後、すべてが同じスキルを使用して、音声をJSONに変換し、Lambda関数にアクセスし、Jenkins APIをプルします。

コード例:JbToolBoxActivator Speechlet


さあ、コードを見てみましょう
https://github.com/jbaruch/jb-toolbox-alexa-skill/blob/master/src/main/groovy/ru/jug/jpoint2017/alexa/jbtoolboxactivator/JbToolBoxActivatorSpeechlet.groovy

こちらがマッチスティックです。 ヘルプテスト、既定の質問などを定数に入れます。 HTTP BUILDERがあります。これはAmazon Lambdaに対して実行されるサービスです。 したがって、彼はインターネット上で何かを引き出す必要があります。 これは実際にはGroovyですが、ボイラープレートを追加するとJavaができます。

nSessionStarted 、HTTPクライアントを構成し、そのようなホストとポートでツールボックスをノックすると言います。 次に、ファイルから、サポートされているツールのリストを読み取りましたが、これも確認しました(list of tools.txt)。

onLaunchからonLaunchを発行しHelpResponse 。 あなたが聞いたこのもの-私は同じツールを開くことができます。



onIntent興味深いことはonIntentonIntentます。 インテントの名前で切り替えます。 それは、私たちが持っていたすべてのチームのうち、私たちに来たものです。 この場合、覚えていれば、2つの意図がありました。 1つは開いており、これがカスタムメーターであり、もう1つはヘルプです。 また、停止、キャンセル、およびその他のことがあります。



そして、最も興味深いのはopenIntentです。 同じスロットを取り出し、そこからツールを取り出し(IDEAなどがあります)、HTTPビルダーを使用してURIとこのツールに接続します。 つまり、この形式を理解しているJetBrains Toolbox APIを参照しています。

したがって、答えを返します。 答えは、 Opening $toolName 、またはツールがリストにない場合です: 申し訳ありませんが、ツールボックスに$ toolNameという名前のツールが見つかりません。 さようなら

ヘルプはヘルプ、ストップとして機能し、カンセルはGoodbyeます。 持っていないインテントが到着した場合、無効なインテントをスローします。

すべてが非常にシンプルです。私はあなたがそれがどれほどシンプルであるかを見ることができるように、とてもシンプルに書きました。

onSessionEnded私には何もありません。 ここには、最も純粋な形式でボイラープレートが10行のコードで3つのオブジェクトを作成するnewAskResponseメソッドがあります。1つのオブジェクトは、理論的には他の2つのテキストを翻訳する必要がある2つのオブジェクトを翻訳する必要があります。 一般に、彼が行うことは、SpeechletResponseオブジェクトを作成することだけです。このオブジェクトには、OutputSpeechテキストとrepromptTextがあります。 なぜ10行のコードが必要なのですか? まあ、それは歴史的に起こりました。これについて少しお話しします。 この定型文以外のすべてが明確でシンプルであることを願っています。

コード例:Jenkins Speechlet


別のスキルを見てみましょう。 そして今度は、コードからスキルまでの別の方法を見てみましょう。最後に実行を試みます。 Jenkinsのスピーチレットは次のとおりです。Jenkinsを制御するスキルハンドラー)

すべてが非常によく始まります: nSessionStartedを初期化し、JENKINS_HOSTのRest APIを介してJenkinsにアクセスし、特定のユーザー名とパスワードでログインします。 これは、もちろん、環境変数を介して非常に正しくありません。 Alexaには、スキルでユーザー名とパスワードを登録できるシステムがあります。つまり、このスキルをローカルのAlexaにインストールすると、ログインできるウィンドウが開きます。 しかし、簡単にするために、ここでは環境変数からユーザー名とパスワードを取得します。

onLaunchで同じテキストをonLaunchします:「挨拶、巨大な顔、ジェンキンスをコントロールします」-そして、ここで興味深いonIntent

ここでは、それに応じて、より多くの意図があります。モデル-https://github.com/jbaruch/jenkins-alexa-skill/blob/master/src/main/resources/speechAssets/IntentSchema.jsonを見るのが理にかなっています

明らかに、最後のビルドに関する情報を返すGetCodeCoverage 、コードカバレッジ情報を返すFailBuildIntent 、およびFailBuildIntentがあります。 さらに、ヘルプ、停止、キャンセル、さらにははい、いいえなど、組み込みのものがたくさんあります。 実際、これらのyesとnoで何をするかを見てみましょう。

始めましょう。 意図が伝わり、そこから名前でデータを取得します。 最後のビルドが要求された場合、Jenkins APIに移動し、そこからビルドの名前と色(赤または青-合格または不合格)を含むビルドのリストを取得します。 最後に、その名前のビルドが成功したか失敗したかを確認します。

GetCodeCoverage再び、Jenkins API、jacocoと呼ばれるプラグインを使用します。 その中には、他の優れたプラグインと同様に、多くのパラメーターがあります。 lineCoverageを1つ取得し、いくつかの情報を取得します。

FailBuildは、受信ビルドを失敗に変える要求です。 私はすぐにこれに同意したくありません。 Alexaはしばしば無駄に応答するため、誤ってビルドを反転する可能性があります。 そして、彼女に確認を求めます。 別のリクエストを送信して、「ここでビルドを埋めたい」「これは本当にあなたが考えていたものですか?」 セッションを行います。 これは、異なる呼び出しによって保持されているものとまったく同じであり、要求された失敗にフラグを設定します。

そして、同じyes-noがあります。 はいと答えた場合は、質問があるかどうかを確認する必要があります。 そして、質問があった場合は、今回もJenkins APIで何らかの種類の投稿リクエストを作成し、仕事を埋めます。 そして、仕事が本当に赤くなったら、私たちは仕事に失敗したと言い、そうでなければ、何も起こらなかった。 さて、停止-さよならを言って終了します。

このような興味深い機能、およびここのコードは1ページです。 コードを複雑にしようとしましたが、実際には非常に単純なので、複雑にするものは何もありません。

その後、これをすべてgradleで収集します。Gradleはここで最も簡単です。 ここにはたくさんの依存関係があります。自然に必要なgroovyと、このAPIの3つの依存関係、logger、commons-io、commons-langです。 それだけです! testCompile-当然、このビジネスのためのテストがあります。 次に、jarがメインディレクトリにあるZIPをビルドします。 さらに、すべての依存関係を含むlibディレクトリがあります。 本当に簡単なところはありません。



Alexa Skill Kitを使用する


次に、このビルドで何をするかを見てみましょう。 本当に曲がる場所は2つあります。 最初はAlexa Skill Kitで、私が書いたすべてのスキルを持っています。 Jenkins Skillを見てみましょう。



先ほど言ったように、ここにはメタデータがあります。名前と呼び出し名は、「アレクサ、ジェンキンスにそうするように頼んでください」と言うとき、まさに言葉(ジェンキンス)です。



次に、オーディオプレーヤーが必要かどうかを指定できます(たとえば、音楽の再生、ニュースの再生など、サウンドをストリーミングしたい場合)



さらに、インタラクティブモデル-インテントを記述する同じJSONがあります。



ここにはスロットはありませんが、JetBrainsにはカスタムスロットがあり、このスロットには私の意図に合った値と例があります。



構成タブ-私が呼ぶもの:LambdaまたはHTTPS。



同じアカウントリンクもあります-スキルを設定するときにログインする機会を与えますか(理論的には、これをJenkinsで行うのが良いでしょう)。



そして、あらゆる種類の購入のためのさらなる許可がありますが、私たちはこれにあまり興味がありません。



[テスト]タブ-ここで、私が話したら彼女が何をするかを書くことができます。



次は[公開情報]タブです。 このスキルは、Amazonであらゆる種類のチェックに合格します。 私は彼らにそれが何であるか、どのようにテストされているかなどを伝えなければなりません。

AWS Lambdaを使用する


スキルを使用する2番目の部分は、AWS Lambdaです。 これらの3つのスキル以外に何もありません。



ジェンキンスを見てみましょう。 ここで、Gradleが作成したまさにそのjarを埋めます。 変数(ホスト、パスワード、ユーザー)もあります。



構成では、必要なランタイムを記述します。 先ほど言ったように、Node、Python、Javaがサポートされています。 そして最近、C#によってサポートされるようになりました。 次はハンドラーです。 これが私のスピーチレットの内部です。 私の役割はlambda_basic_executionと呼ばれます。 そして、私は説明があります。 それだけです



トリガーはAlexaから来ます。 Alexa Kitと呼ばれる特別な種類のトリガーがあります。 これは、呼び出しがそこから行われることを意味します。



ここで、どのJSON AlexがLambdaに送信するかを知っているかどうかをテストすることもできます。 ここでテストすると、このJenkinsが表示されます。 そして、このジェンキンスを見てみましょう。 リクエストを送信しました:ビルドはどうですか。



インテントを送信しました。インテントはラストビルドと呼ばれ、Alexaは私が望むものを実現しました。



すべてJSONでラップされており、Lambdaでテストできます。 私は言うことができます:私はこのJSONを送信しています。 そして、私がこれを言うとき、私はこの作品しかテストすることができません。



はい、この音声認識のエンドツーエンドテスト(JSONのテキスト、Lambdaで、次に戻る)があります。または、必要なJSONがわかっている場合、Lambdaレベルでのみテストできます。

Jenkins Speechletデモンストレーション


一般に、すべてをすでに開始するときです。 Jenkinsがあり、以前のスキルのビルドがあります。



次に、この種のシステムとの対話があります。

バルク:アレクサ、オープンジェンキンス
Alexa:このスキルを使用すると、ビルドサーバーを制御できます
バルク:アレクサ、ジェンキンスに聞いてください、私のビルドはどうですか?
Alexa:最後にビルドしたjb-toolbox-alexa-skillが渡されます。 次に何をしたいですか?
バルク:コードカバレッジとは何ですか?
Alexa:最後のjb-toolbox-alexa-skillビルドのコードカバレッジは30%です。 次に何をしたいですか?
バルク:ビルドに失敗します。
Alexa:成功した最新のビルドに失敗することを理解しています。 よろしいですか?
バルク:はい
Alexa:ビルドステータスを失敗に変更しました。 ありがとう、さようなら。



それは非常にクールで非常にシンプルで、そのような簡単なレベルを恥じています。

Alexaビジュアルコンパニオン


音声インターフェイスに加えて、Alexaには視覚的な仲間がいます。 これは、すべてのデバイス、インターネットなどをセットアップすることに加えて、カードもあるアプリケーションです。 これは、音声インターフェイスにとって補助的な情報のストリームです。 一般的に、これはすべてが音声で言うことができるわけではないため、適切なアイデアです。 たとえば、 code coverage要求したばかりで、メトリックをくれた場合-実際、jacocoは6つのメトリックを返します:ブランチ実行、メソッド、コード行などのカバレッジです。 当然、アプリケーションでこれを視覚的に表示することは理にかなっています。 これは1行で実行できます-「テキストをアプリケーションに送信」というコマンドがあります。 そして、そこに表示されるプレーンテキスト、画像、またはhtmlを送信できます。 たとえば、天気について尋ねると、アシスタントが短い答えを返します。 アプリケーションでは、一週間の天気を見ることができます。 私はまた、私の家がロックされており、息子が現在赤ずきんのおとぎ話を始めていることを確認しました。 これは次のようなものです。



Alexaの欠陥:架空の現実


それでは、想像上のものと現実的なものの2種類の欠陥について話しましょう。 最初の-想像上の-音声認識に関連付けられています。 ユーザーはアクセントを付けて話すことも、はっきりと発音しないこともあります。 私は彼らがそれをどのように行うのか分かりませんが、アレクサは私の小さな息子でさえ完全に理解しています。妻と私はいつも彼を理解しているわけではありません。

2番目に疑われる欠陥は、次の図に示されています。



実際、この問題はセキュリティ機能を使用して非常に簡単に解決できます。Alexaは、事前に定義されたPINコードを発音するまで、ストアで注文したり、ドアを開けたりすることはありません。

「ああ、ああ、彼らは常に私たちの話を聞いています」というような側面がまだあります。 リバースエンジニアリングが行われたのはずっと前のことで、誰もが耳を傾けていることをよく知っています。 彼らが常に耳にするのはトリガーワードだけです。 それは、私が彼女に電話するときです。 トリガーワードはランダムに話され、その後10秒以内に発言が記録され、その記録がメインインテント、メインスキルに送信されることがあります。 そこで認識されない場合は、ゴミ箱に捨てられます。 したがって、このパラノイアはすべて不当です。

次に、実際の欠陥について説明します。 これらはいくつかのカテゴリに分類できます。

音声ユーザーインターフェイスには欠点があります。 彼らは、一部の人々が物事を同じ言葉と呼ぶという事実に関連しています。 Helloweenの音楽を要求して、ハロウィーンの音楽を取得しないでください。 Alexaはハロウィーンの音楽とHelloweenバンドの間ではバンドを好むことを既に知っているはずなので、進行状況を考えると、コンテキストでこの問題を解決する必要があると思います。 すべてはこれになりますが、これまでのところ、特に文脈が理解できない場合はそうではありません。

そしてもう一つの問題。 非標準の名前と名前のサポートの欠如に関連しています。 Alexaが名前や役職を知らない場合、彼女はそれを発音できません。

さらに、消費者向けデバイスとしてのAlexa自体にも欠点があります。


Alexa Skillを作成しようとすると、最も大きな厄介な欠陥が現れます。たとえば、私たちがやったばかりです。 Java APIは悪夢であり、音声モデルを手動でページにコピーする必要があります。これはドキュメントにも記載されています。 さらに、ブートストラップはありません。MavenアーキタイプもLazybonesテンプレートもありません。

ローカルテストインフラストラクチャはありません。つまり、コードの1行を変更した場合、スキルサイトに移動し、テキストエリアjsonのペンを変更してから、Lambdaに移動して新しいjarをロードする必要があります(まあ、LambdaにRestがあるとしましょう) API、彼女は開発者向けに書いたので、そこで継続的にデプロイできます。 しかし、スキルキット側では、変更がある場合は、サーバーでのみこれらすべてをダウンロードしてテストする必要があります。 ローカルには、インフラストラクチャがありません。これはもちろん、非常に大きなマイナスです。

おわりに


以上です。 , , Github – jb-toolbox-alexa-skill jenkins-alexa-skill . : , .

,

. , - (, )?

- , Alexa , (, , ).

, . Alexa?

Alexa - , . -. voice recognition, , .

Alexa Google Home?

Google Home Alexa, . – , Google Home . , . Google Home – . Alexa , .

Alexa. ?

— . , . , , – .



, . Java , , JPoint 2018 :

Source: https://habr.com/ru/post/J352372/


All Articles