はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Azure CognitiveServices TextAnalyticsの「テキスト要約」をクライアントアプリから使ってみる(REST API編)

前回:
hatsune.hatenablog.jp

前回は、AzureポータルでTextAnalyticsを有効にして、Azure.AI.TextAnalytics SDKを使って「テキスト要約」を行うクライアントアプリの動作を確認してみました。
今回は、クライアントアプリからREST APIにて同様の動作を実現してみます。

準備

.NET 6ベースのWPFアプリとしてクライアントアプリを作成します。

新しいプロジェクトの作成

Visual Studio 2022で、新しいプロジェクトの作成で「WPFアプリケーション」のテンプレートを選択すると、.NET Frameworkベースではなく.NET 6ベースのWPFアプリが作成できます。
名前は「TextSummarizationAPISample」と名付けることにしましょう。

コードを記述

サンプルコードは、MVVMデザインパターンで作成しているので、画面はViewsフォルダ配下に「MainWindows.xaml」として記述し、REST APIを呼び出すロジックはModelsフォルダ配下に「TextSummarizationModel.cs」として記述します。

画面を作成

MVVMの良いところは、ViewとModelが分離できるところです。前回のSDKからの変更はModelの差し替えだけになるので、画面については、SDKのサンプル画面と同じく「入力欄」「実行ボタン」「出力欄」として、XAMLコードなどは名前空間だけかえてそのままコピペしてきます。名前空間変更前のものを再掲しておきます。
gist.github.com
このXAMLのx:classとxmlns:localを「TextSummarizationSDKSample」から「TextSummarizationAPISample」に変更します。

ロジックを作成

TextSummarizationModelクラスとしてREST API呼び出し部分を記述してみましょう。
gist.github.com
「your key」や「your resourcename」のところは、AzureでTextAnalyticsを有効化したときに生成されたキーとリソース名を設定します。
SDKのときよりもかなり複雑なコードになっています。
最初にREST APIのBODYとしてパラメタをJSON文字列として設定するためのクラスにパラメタを設定しています(9~39行目)。
67行目でPostによりREST APIをたたいていますが、この戻り値が要約結果ではありません。
72行目で取得できるのは、要約結果を得るためのjob番号付きURLです。
86行目では、72行目で得られたob番号付きURLを指定して要約結果をGetしています。
もちろん非同期実行ですから、Azure側で要約が完成して初めてSendAsycメソッドは値を返します。
そして、97行目から100行目で戻ってきた要約(今回は3文)を取得しています。

なお、上記には載せていませんがJSON形式とやり取りするためのクラス定義も必要です。

実行

対象のテキストを入力

Language Studioで試したように現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
場所は、「1.1 Azure AI」の部分にしてみましょう。

実行結果

[Exec]ボタンをクリックして少し待つとテキスト要約結果が表示されます。

Microsoft Azure AIは、開発者が高品質なモデルをAPIとしてデプロイし、言語機能をより効率的かつ責任を持ってアプリに注入できるように、Azure Cognitive Servicesに2つのアップデートを導入します。
Azure Cognitive Serviceの1つであるAzure OpenAI Serviceは、現在プレビューで利用可能です。
Azure Cognitive Service for Languageは、文書や会話の要約を提供する新機能で、開発者が文書やコンタクトセンターの通話に含まれる重要な情報(通話理由や解決策など)を迅速に表面化できるよう支援します。

まとめ

TextAnalytics用のREST APIを使ってテキスト要約を行うクライアントアプリを作成してみました。
同じ文章を入力すればSDK版と同じ結果が当たり前ですが得ることができました。
こうやって記載してもるとREST APIに比べて、SDKが使いやすいので非常にシンプルなコードで実装できるのが分かってもらえたら嬉しいです。

Azure CognitiveServices TextAnalyticsの「テキスト要約」をクライアントアプリから使ってみる(SDK編)

前回:Azure CognitiveServices TextAnalyticsでテキスト要約を試してみる - はつねの日記

前回は、AzureポータルでTextAnalyticsを有効にして、Language Studioで「テキスト要約」動作を確認してみました。
今回は、クライアントアプリから前回有効にしたTextAnalyticsにつないでみましょう。

準備

.NET 6ベースのWPFアプリとしてクライアントアプリを作成します。
TextAnalyticsとの接続には、Azure.AI.TextAnalytics SDKを使います。
まずは、そのために準備として、Visual Studioで新しいプロジェクトを作成してNuGetから必要なライブラリを取得しましょう。

新しいプロジェクトの作成


Visual Studio 2022で、新しいプロジェクトの作成で「WPFアプリケーション」のテンプレートを選択すると、.NET Frameworkベースではなく.NET 6ベースのWPFアプリが作成できます。
名前は「TextSummarizationSDKSample」と名付けることにしましょう。

NuGetからSDKの取得

Azure.AI.TextAnalytics SDKをNuGetから取得しましょう。
www.nuget.org
ソリューションエクスプローラーでプロジェクトファイルを右クリックして[NuGetパッケージの管理]メニューでNuGetパッケージマネージャーを起動して、Azure.AI.TextAnalytics SDKをプロジェクトに追加します。

この時に注意しないといけないのは、(2022年6月4日現在)テキスト要約は「プレビュー」機能なので、NuGetから取得するAzure.AI.TextAnalytics SDKもプレリリース版が必要な点です。

そこで、「プレリリースを含める」をチェックして、プレリリース版の最新を取得してきます。
現時点でのプレリリース版は5.2.0-beta3ですので将来的に5.2.0が正式版となるまではプレリリース版を追加するようにしましょう。

コードを記述

サンプルコードは、MVVMデザインパターンで作成しているので、画面はViewsフォルダ配下に「MainWindows.xaml」として記述し、TextAnalytics APIを呼び出すロジックはModelsフォルダ配下に「TextSummarizationModel.cs」として記述します。

画面を作成

サンプルなので「入力欄」「実行ボタン」「出力欄」のシンプルが画面を作成してみます。
gist.github.com

ロジックを作成

TextSummarizationModelクラスとしてAPI呼び出し部分を記述してみましょう。
gist.github.com
「your key」や「your resourcename」のところは、AzureでTextAnalyticsを有効化したときに生成されたキーとリソース名を設定します。

実行

対象のテキストを入力

Language Studioで試したように現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
場所は、「1.1 Azure AI」の部分にしてみましょう。

実行結果

[Exec]ボタンをクリックして少し待つとテキスト要約結果が表示されます。

Microsoft Azure AIは、開発者が高品質なモデルをAPIとしてデプロイし、言語機能をより効率的かつ責任を持ってアプリに注入できるように、Azure Cognitive Servicesに2つのアップデートを導入します。
Azure Cognitive Serviceの1つであるAzure OpenAI Serviceは、現在プレビューで利用可能です。
Azure Cognitive Service for Languageは、文書や会話の要約を提供する新機能で、開発者が文書やコンタクトセンターの通話に含まれる重要な情報(通話理由や解決策など)を迅速に表面化できるよう支援します。

まとめ

TextAnalytics用のSDKを使ってテキスト要約を行うクライアントアプリを作成してみました。
SDKが使いやすいので非常にシンプルなコードで実装できるのが分かってもらえたら嬉しいです。
次回は、今回作成したコードをベースにしてTextAnalytics APISDKではなくREST APIとして呼び出す方法について説明する予定です。
TextAnalytics APIを直に呼び出すことで更に理解が進むと思いますし、SDKが提供されていない環境から使うときのサンプルになればと思っています。

Azure CognitiveServices TextAnalyticsでテキスト要約を試してみる

Microsoft Build 2022が日本時間の2022/05/25 00:15から始まりました。
そのオープニングセッションでサティアCEOが話している内容で「~テキスト要約して~」と話しているところがありました。
Cognitive Servicesでテキスト要約とかできたんだっけ?と思ったので調べてみたらできるみたいですね。

Azure側の準備

Azureマーケットプレイスから探す

リソースを作成するで「TextAnalytics」と検索するとマーケットプレイスからMicrosoftが提供している「テキスト分析」を検索できます。

リソースを作成する


[作成]をクリックすると「追加機能の選択」に移動します。URL直指定だといきなり「追加機能の選択」に飛べます。

追加機能の選択


もしURL直でここまで行きたい場合は、次のURLからも作成を開始できます。
https://portal.azure.com/#create/Microsoft.CognitiveServicesTextAnalytics
検索で似たようなものから探すよりもURL直の方が確実なので好きです。
「テキスト要約」は基本機能にあるので、特に追加機能は選ばずに進めましょう。

TextAnalytics の作成


日本リージョンも選べますし、無料プラン(月上限5000呼び出し)もありますね。
「法的条項」や「責任ある AI 通知」にもチェックをいれて[確認と作成]クリックして検証が通ったら、[作成]をクリックと進んでいきましょう。

Language Studioで試す

Azure側でテキスト要約のリソース(API)の準備ができたので、次はクライアント側というのが従来のステップになりますが、最近のAzureではAPIを試す機能も充実しています。
テキスト要約も「Language Studio」で手軽に試すことができます。
https://language.cognitive.azure.com/home

試すリソースを指定

Language Studioにアクセスするとどのリソースで実行するかの聞かれますので、サブスクリプションやリソース名などを指定します。

Summarize textをTry it outする


翻訳がされていないツールなので「テキスト要約」を試すためには、「Summarize text」のトライを選びます。
UIは日本語化されていませんが、もちろん、対象言語として日本語もサポートしています。

日本語文章を要約する

現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
テキスト要約は5000文字まで1度に要約できますので、要約の効果がわかりやすいように1000文字以上は対象テキストとしてみましょう。

入力データを設定したら、少し下にスクロールして[Run]をクリックします。

要約を確認する

実行結果は、人が見やすいように成形されたResultと、APIからの戻り値であるJSONの2つの形式で表示されます。
まずは、ResultのSummaryを確認してみます。

結果は約220文字となり、元の文章が約1200文字でしたので、元の文章の約20%に要約されています。
Original text欄を見ると文章のどこの文をチョイスして要約したかが分かりやすく表示されています。

これをみると1文の中を要約してというよりも、全体の中からキーとなる文をランク付けして上位(今回は)3つ選んで要約結果としているようです。

APIの戻り値を確認する

実行結果をJSON形式で確認してみましょう。

結果はsentencesというJSON配列に返却されます。今回は3つにしているので配列要素は最大で3つになります。
sentencesの各要素は「text」「rankscore」「offset」「length」となっており、それぞれ「該当文」「重要度スコア(0~1)」「文先頭からの位置」「文字数」となります。

まとめ

最近のAzureは、アプリ作らなくても確認するためのページが用意されていて、すぐにAPIの動作確認ができるのがとても良いですね。
1文の中まで要約はしてくれないので、なんとなく日本人が考える「要約」というイメージと若干差異があるかもしれませんが、長文の中から重要なセンテンス3文を探してきてくれると考えると使い道はいろいろ広がりますね。

Azure Speech to Textにコミットメントレベル料金プランが登場

docs.microsoft.com

### コミットメントプランとは
コミットメント料金プランって、聞きなれないプラン名ですが、要するに利用時間にかかわらず毎月定額払いの料金プランです。
かといって定額使いたい放題ではなく、定額費用に応じて利用できる時間数がきまっています。

### コミットメントプランの利用時間上限と月額固定費用
Speech to Textの場合、
2,000時間|$1,600
10,000時間|$6,500
50,000時間|$25,000
という金額になります。

### 上限時間を超えたなら
では、上限時間を超えたらどうなるかといえば、コミットメントプランの時間単価での従量課金に移行します。
2,000時間|2,001時間以降は、$0.80/時間
10,000時間|10,001時間以降は、$0.65/時間
50,000時間|50,001時間以降は、$0.50/時間
ある意味安心な料金プランですね。

### Standardな従量課金プランよりお得
Standardプランだと1時間1$なのだいぶお安くなりますね。月何時間使うのかがみえてきたらコミットメントプランへの移行も検討してみるとコストが抑えられるかも。

M5Stack Core 2で始めるAzure IoT Hub入門(その3)

前回
hatsune.hatenablog.jp

第3回目の今回は、M5Coreでのプログラミングの基礎と、PORT.A.I2Cでの入出力について調べていきたいと思います。
第1回ではArduino IDEでスケッチを作成した後に、Visual Studio Codeでそのスケッチを取り扱えるようにVisual Studio Codeの環境を整えました。
今回は、第1回で環境整備の基本はおわっているので、Visual Studio Codeで新規にスケッチを作成する方法を確認していきます。

Visual Studio Codeでの新規プログラミング

Visual Studio Codeの[ファイル]-[フォルダを開く]で新しいスケッチを入れるためのフォルダを作成してから開きます。
これは、Arduino IDEが、例えば「hoge.ino」というスケッチを扱うには、必ず「hoge」フォルダの下に「hoge.ino」を期待しているからです。
あとからArduino IDEでスケッチを開きたいということがあったときもスムーズにVisual Studio CodeArduino IDEの行き来ができるように、Arduino IDEのお作法に沿ってフォルダを作成しておきましょう。
今回は「Env2Unit」というフォルダにしましょう。
フォルダを作成した直後のVisual Studio Codeのエキスプローラー表示をみてみましょう。
f:id:hatsune_a:20210607205749p:plain

シリアルポートの設定

その1でArduino拡張 (およびc++拡張) はインストール済ですので、M5CoreをUSBで接続してから、Ctrl+Shift+Pで「Arduino: Select Serial Port」で、シリアルポートを選択します。
こうすることで「Env2Unit」フォルダの中に「.vscode」フォルダが作成されて、「Env2Unit」フォルダを開いた設定として、指定したポート番号が適用されるようになります。
f:id:hatsune_a:20210607210343p:plain

ボードを選択

Ctrl+Shift+Pで「Arduino: Board Config」を選択して、ボードを選択します。
f:id:hatsune_a:20210607211437p:plain

スケッチファイルを作成

新規ファイル追加で「Env2Unit.ino」ファイルを作成します。
f:id:hatsune_a:20210607211106p:plain

Arduino.jsonにスケッチファイル名を指定する

f:id:hatsune_a:20210607212343p:plain
"sketch": "Env2Unit.ino"
を追加すると自動的にスケッチの解析が行われて、「c_cpp_properties.json」ファイルが作成されます。

M5Stack用のインテリセンスが効くように設定

c_cpp_properties.jsonを開いて、includePathにArduino IDEで指定したスケッチブックの保存場所の中のライブラリを指定します。

例:"C:\Users\hatsune\Documents\Arduino\libraries\\**",

前の行の最後に , を入れるのも忘れないようにしましょう。

準備が整ったかを確認

簡単なスケッチを記述して、M5Coreにデプロイして動作することを確認します。
gist.github.com

ENV.II SENSORで気圧を測定

BMP280用ライブラリを追加

ENV.II SENSORは、SHT30とBMP280が内蔵されています。
BMP280は気圧センサーなので、気圧の表示部分を作成してみます。
Ctrk+Shift+Pで「Arduino Library Manager」を起動して必要なライブラリが提供されているかを確認します。
f:id:hatsune_a:20210607222821p:plain
サクッとインストールします。

スケッチ解析エラーを解決する

BMP280用ライブラリを使うために

#include <Adafruit_BMP280.h>

をスケッチに追加して解析すると"Adafruit_Sensor.h"がないというエラーが表示されます。
前年ながらArudino Library Managerでは追加できないので公式GitHubから落としてきます。
https://github.com/m5stack/M5-ProductExampleCodes/tree/master/Unit/ENVII/Arduino/ENVII
ファイルの保存先は、ライブラリフォルダの中の[Adafruit_BMP280_Library]フォルダです。

例:"C:\Users\hatsune\Documents\Arduino\libraries\\Adafruit_BMP280_Library",

ENV.IIで測定した気圧を表示

gist.github.com

  1. 動作に必要な4つのライブラリをincludeします。
  2. Wire.Begin() でPORT.A.I2C を初期化します。
  3. while (!Bmp.begin(0x76)) でアドレス0x76を指定して接続します。
  4. loop関数の中では、Bmp.readPressure()によって気圧を取得します。
  5. M5.Lcd.setCursor(0, 0); で液晶画面先頭にカーソルを移動します。
  6. M5.Lcd.printfで情報を表示します。
  7. 0.1秒ごとに更新します。

f:id:hatsune_a:20210607233127p:plain

ENV.II SENSORで気温と湿度を測定

BMP280用ライブラリを追加

"Adafruit_Sensor.h"と同様に公式GitHubから”SHT3X.h”と”SHT3X.cpp"を"Adafruit_Sensor.h"と同じ場所にダウンロードします。

ENV.IIで測定した室温と湿度を表示

SHT3Xに関する処理を追加してスケッチを完成させます。
gist.github.com

  1. loop関数の中では、Sht30.get()によって温度 (cTemp) と湿度 (humidity) を取得します。

f:id:hatsune_a:20210608002833p:plain

室温が30度近かったんですね。暑いはずです。

ライブラリは必要?

今回はM5Stack用モジュールとして販売されているものだったので公式サイトからライブラリを入手できました。
もし、自分で作成した回路をつなげるような場合であれば、利用ている回路のデータシートなどからI2Cでのデータフォーマットを把握して、その部分を作成してあげることで、ライブラリを使わなくても同じようなことが可能です。

次回はAzure側の準備についてふれてみたいと思います。
hatsune.hatenablog.jp