はつねの日記

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

M5Stackで.NET nanoFrameworkからAzure IoT Centralに繋いでみた

前回

前回は、M5Stack Core 2からAzure IoT Hubに取得したセンサー値を送信しました。
hatsune.hatenablog.jp


Azure IoT Hubは、デバイスからのセンサー値を安全に収集する目的のPaaSなので、収集したデータの蓄積や利用などは、他のAzureサービスを組み合わせるなど柔軟に構成を構築できます。
その一方で、手軽に集めたセンサー値をさくっと表示・管理したいと思ったときには、その柔軟な構成を組んでいかないといけないということになります。
そんなときにはPaaSではなくSaaSであるAzure IoT Centralアプリケーションを使うのはどうでしょうか。

Azure IoT Centralアプリケーションの作成

Azure IoT Centralアプリには、Data Explorerによる収集したデータの表示、ダッシュボードによる項目の監視など、IoTに必要な機能が備わっているので、「どのAzrueサービスをどう組み合わせてどう設定していけばいいのだろう」という自由度があるからこその検討ポイントに悩まずに済みます。
https://docs.microsoft.com/ja-jp/azure/iot-central/core/media/howto-create-analytics/analytics-ui.png

Azure Portalからの作成


project detail

Azure IoT Centralアプリを作成するときに、既存の様々なテンプレートでアプリを作成することができます。目的に合致するテンプレートがあるならば、それを使ってアプリを作成することがAzure IoT Centralアプリで成功するための近道です。
どんな設定項目があるかを説明しやすくするために、今回は、あえて「カスタムアプリケーション」のテンプレートを使います

Azure PortalでAzure IoT Centralの作成が終わったならば、これでAzure Portalでの操作は終わりです。以降は、作成したAzure IoT Centralアプリにサインインしての操作になります。

Azure IoT Central Portalからの作成

今回、Azure IoT Centalアプリの作成をAzure Portalから行いましたが、Azure IoT Central Portalからも行えます。
apps.azureiotcentral.com

料金プラン

大きな違いはAzure IoT Central Portalから作成するときは、7日間無料で使える「Free」が選べる点です。

マイアプリ

もちろん、どちらの方法で行った場合でもAzure IoT Central Portalの「マイアプリ」表示されるので、そこから作成したAzure IoT Centralアプリに行くこともできます。

Azure IoT Centralアプリケーションでの初期設定

Azure IoT Centralアプリのサイトに移動したら、さっそく、初期設定を開始しましょう。
カスタムアプリケーションのテンプレートから作成したときに、まず最初にやることは「デバイステンプレート」を作成することです。

バイステンプレートの作成


バイステンプレートとは、IoTデバイスからどのようなデータを取得するか、その項目を定義したテンプレートです。管理するIoTデバイスを追加するときに、このテンプレートを指定します

種類の指定


M5Stack Core 2を接続するためのテンプレートであれば、種類として「IoTデバイス」を選択して、「これはゲートウェイバイスです」にチェックを入れずに名前を入力して作成します。

モデルの作成

実際に収集するデータに関する情報はカスタム「モデル」の中に「機能」として定義します。

機能の指定

[機能の追加]を押して収集するデータ項目をモデルに追加していきます。

表示名を入れると自動的に名前(こちらは内部名)が決まりますが、表示名に日本語で「気温」と入れると名前には自動反映されないので、手動で名前を入れます。

機能名入力時の注意点

また、名前には日本語名は指定できません。指定すると形式が間違えていると表示されるので英語名をいれるようにしましょう。
なお「展開」すると単位も入れられるが、気圧の単位は「パスカル」か「キロパスカル」のみで残念ながら「ヘクトパスカル」は指定がなかった。
格納するセンサー値がすべて定義できたら「保存」をクリックして「機能」を「モデル」に保存します。

ビューの追加


取得したデータをどうみせるかは、「モデル」の中に「ビュー」として定義します。

規定のビューの追加

ビューを1から作成してもいいのですが、試しに「既定のビュー」を生成してみて、その内容からビュー定義の勘所をつかんみましょう。

既定のビューでは、「気温、湿度、気圧」が一緒になったものと3つそれぞれの領域の合計4つの領域が「overview」という名前のビューとして生成されます。

視覚化の変更

視覚化の変更によって、各領域の表示を決めていきます

3つの値が1つになった領域は折れ線グラフにします。残り3つの個別領域は最新値が表示されるようにしましょう。
もちろん、それ以外の表示構成でもよいでしょう。

バイステンプレートの公開

設定が終わったテンプレートは、「公開」して始めて使えるようになります。この公開は、自分の作ったAzure IoT Centralアプリに公開するという意味です。

バイスの作成

Azure IoT Centralアプリの[デバイス]-[新規]から接続するデバイスを作成します。

これでAzure IoT Centralアプリの準備は完了です。

M5Stck Core 2側の事前準備

センサーについて

M5Stack Core 2のPORT.A.I2C端子に接続して使用するENV-IIIユニットを使用します。

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール(インストール済の場合は不要)

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール(インストール済の場合は不要)

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

Device Explorerでの接続確認

nanoFrameworkファームウェアをインストールしたあとにVisual Studioを起動してDevice Explorerをみると、「M5Core2 @ COM4」と表示されるようになります。

nanoFrameworkファームウェアは、インストールしたあとにnanoFramework以外の別イメージをM5Stack Core 2に転送(Burn)してしまうと消えてしまうので、Device Explorerに表示がないような場合は、再度、インストールをしてからVisual Studioを起動すれば表示されるようになります。

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

ここまでが、M5Stack Core 2を使うアプリ開発を行う上での共通の事前準備となります。

Azure IoT Centralにデータ送信する

基本的に、IoT Hubにデータ送信する場合と、IoT Centralアプリにデータ送信する場合では、接続時のコードの差し替えで動作します。

バイスからの接続に必要な情報の入手


バイスから接続するのに必要な情報は、IoT Centralアプリの画面にあるデバイスのところの「接続」から得られます。

が必要な情報です。

接続コードの変更ポイント

基本的に、IoT Hubにデータ送信する場合と、IoT Centralアプリにデータ送信する場合では、接続時のコードの差し替えで動作します。

Azure IoT Hubとの接続コード

まずは、元となるAzure IoT Hubとの接続部分のコードをみてみましょう。
gist.github.com
HostNameは、IoT Hubを有効にしたときに指定したホスト名になります。

Azure IoT Centralとの接続コード

この接続コードを次のように変更します。
Azure IoT Centralを利用するには、Device Provisioning Service (DPS) を使用してデバイスを登録して、そのうえで、Azure IoT Centralに繋ぐことになります。
DSPのURLは下記の公式サイトによれば「global.azure-devices-provisioning.net」とのことです。
docs.microsoft.com
よって、コードはこのようになります。
gist.github.com
ポイントはDSPから接続先URLを得てからDeviceClientでそこに繋ぐという2段階になる点です。

Azure IoT Centralの接続先とは

DSPからの戻り値は、Azure IoT CentralアプリのURLなのでしょうか。
ブレイクポイントを設定して実行時の「myDevice.AssignedHub」の値を確認してみると

"iotc-hogehogehogehoge.azure-devices.net"

とのことでした(一部伏字)ので、Azure IoT Centralのデバイスとの通信にはAzure IoT Hubが採用されていることが分かります。
確かにこれであれば、接続コードだけ対応すれば、そのまま動くというのもうなずけますね。

実行結果

M5Stack Core 2にアプリをデプロイしたら、Azure Iot Centralアプリでデバイスを選んでビューを表示してみましょう。

簡単にセンサー値が表示できましたね。

次回

次回は少しセンサーから離れて、Azure Cognitive ServicesのようなAzure AIをM5Stack Core 2から使う方法をご紹介できたらと考えています。

M5Stackで.NET nanoFrameworkからAzure IoT Hubに繋いでみた

前回

hatsune.hatenablog.jp
前回は、.NET nanoFrameworkでの開発準備とM5Stack Core 2に接続したセンサーから気圧、気温、湿度などを取得しました。
今回は、M5Stack Core 2からAzure IoT Hubに取得したセンサー値を送信してみたいと思います。

事前準備

センサーについて

M5Stack Core 2のPORT.A.I2C端子に接続して使用するENV-IIIユニットを使用します。

Install the nanoFramework firmware

M5Stackに使われているESP32にはnanoFrameworkは標準インストールされていないので、nanoFrameworkをインストールします。

接続ポート番号の確認

USBでM5Stack Core 2をPCに接続したら、デバイスマネージャーで「CP210x」が接続されているポート番号を確認します。今回の環境では「COM4」が該当しました。

Flasherアプリケーションのインストール(インストール済の場合は不要)

OSの[スタート]メニューから「Developer PowerShell for VS2022」を起動します。

dotnet tool install --global nanoff

nanoFrameworkfファームウェアをインストール(インストール済の場合は不要)

今回使用するM5Stackは、M5Stack Core 2になります。
このM5Stack Core 2をターゲットにして「COM4」経由でnanoFrameworkをアップロードします。

nanoff --target M5Core2 --update --serialport COM4

Device Explorerでの接続確認

nanoFrameworkファームウェアをインストールしたあとにVisual Studioを起動してDevice Explorerをみると、「M5Core2 @ COM4」と表示されるようになります。

nanoFrameworkファームウェアは、インストールしたあとにnanoFramework以外の別イメージをM5Stack Core 2に転送(Burn)してしまうと消えてしまうので、Device Explorerに表示がないような場合は、再度、インストールをしてからVisual Studioを起動すれば表示されるようになります。

Visual Studioの準備

Visual Studioを機能拡張する

Visual Studioには.NET nanoFramework Extensionをインストールして機能拡張しておきます。
この機能拡張によりnanoFrameworkアプリのテンプレートが追加されます。
このテンプレートで作成したプロジェクトには、NuGetから自動的に「nanoFramework.CoreLibrary」ライブラリが追加されています。

「nanoFramework.M5Core2」ライブラリを追加する

今回は、M5Stack Core 2を使うので、「nanoFramework.M5Core2」ライブラリを手動でNuGetから追加します。

ここまでが、M5Stack Core 2を使うアプリ開発を行う上での共通の事前準備となります。

Azureの準備

Azrue側のサービスは、Azure IoT Hubを使います。
Azure IoT Hubを使うことで、ゼロから設計および構築をしなくても「セキュリティが担保された通信」「スケーリング」「正常性監視」「可用性」を確保しつつデバイスからのセンサー値の収集が容易にできます。
また、運用自体も利用しているAzure全体の運用の中に組み込むことで、運用負荷が著しく増加するということもありません。

IoT Hubの使用プロトコルについて

Azure IoT Hubは、MQTT (Message Queueing Telemetry Transport)、Http、AMQP (Advanced Message Queuing Protocol)など様々なプロトコルに対応しています。
今回のサンプルでは、「小さい」「大量」のデータを「低遅延」で「双方向」に通信できるMQTTを使います。

Azure IoT Hubを準備するには

Azure IoT Hubを使用するためには、まずは、Azure IoT Hub自体を作成して、そこに接続するデバイスを定義していきます。

Azure IoT Hubを作成する

Azure IoT Hubの作成は、Azure管理ポータルでリソースを作成するだけで簡単にできます。
Azure管理ポータルにサインインしたら、[リソースの作成]で「IoT Hub」を検索し、[作成]をクリックしてリソースを追加します。

プランで無料を選択する

Azure IoT Hubの料金プラン (課金額) は、作成時や作成後に指定できます。無料プランは、IoT Hubでは「F1:Freeレベル」という表記になります。

スケーリングが1だったり、「Defender for IoT」も有効にできなかったりといくつかの制限はありますが、無料プランでも基本的な機能は備えていますので、動作確認や数台を接続して試験するような場合に便利です。

Azure IoT Hubにデバイスを定義する

IoT Hubが作成できたら、その中に「IoTデバイス」を定義します。

[IoTデバイスの追加]をクリックして、「デバイスID」「認証の種類」を選んで、[自動生成キー]にチェックを入れて追加をすれば、IoTデバイスからIoT Hubに接続するための接続文字列が生成されます。

M5StackでAzure送信

M5Stack Core 2をAzure IoT Hubに接続するには「nanoFramework.Azure.Devices.Client」ライブラリを使います。

依存関係にあるライブラリを確認してみると、MQTT関連のライブラリも含まれていますね。

Azure TLS証明書をM5Stack Core 2に登録

.NET nanoFrameworkでAzure IoT Hubに接続するためには、ルートCA証明書が必要になります。

ルートCA証明書の取得

ルートCA証明書は、https://docs.microsoft.com/ja-jp/azure/security/fundamentals/tls-certificate-changesの中から「Baltimore CyberTrust Root」をダウンロードして取得します。

ルートCA証明書の登録

取得したルートCA証明書は次のいずれかの方法で利用します。

  1. ソースコードに埋め込む
  2. リソースとしてバイナリに同封
  3. バイスにあらかじめアップロード

今回は「リソースとしてバイナリに同封」方法を採用します。
まず、プロジェクトにリソースファイルを追加します。

次にリソースファイルで[リソースの追加]-[既存ファイルの追加]でダウンロードしたルートCA証明書ファイルを追加します。

WiFiと接続

WiFiとの接続には、最寄りのアクセスポイントへの接続情報が必要です。
gist.github.com
WiFiNetworkHelper.ConnectDhcpメソッドでアクセスポイントのSSIDとパスワードを指定して接続が成功すれば、IPアドレスが割り当てられて、メソッドはTrueを返却してきます。
ここではWi-Fi接続が成功するまで、0.5秒間隔で自動リトライするようにしています。
例えば、アクセスポイントの電源がはいっていないなどであれば電源がはいれば自動的に接続が確立できます。

Azure IoT Hubと接続

gist.github.com

自動リトライについて

実際に動作させてみると、IoT Hubとの接続に失敗するケースがあります。
リトライで解消はできるのでサンプルコードのように自動再接続のロジックを入れておくのがよいでしょう。

ルートCA証明書について

事前にリソースとして組み込んでいるルートCA証明書を使ってX509Certificateを生成してから接続します。IoT Hubとの接続方式はSAS(対象キー)方式ですが、このようにルートCA証明書を使っての接続になります。
AzureポータルでDeviceを登録するときには「X509CA署名済」という認証方式もありますので、SAS方式の場合はルートCA証明書などは不要かと思ってしまうかもしれませんが、対象キー方式の時はデバイス側にルートCA証明書を入れておくと覚えておくとよいでしょう。

Azure IoT Hubへデータ送信

gist.github.com

Azure Iot Hubからデータ受信

gist.github.com

実機へのデプロイが失敗したときは

Visual Studioから実機へのデプロイは失敗します。対処方法はいろいろあります。

  1. Device Explorerの再表示(COMポート再スキャンが行われるので)
  2. M5Stack Core 2の電源ボタン長押しで強制終了と、電源ボタン再度クリックによる電源再投入
  3. M5BurnerによるCore2FactoryTestイメージの再投入(nanoFrameworkなども消えます)

改良が必要なポイント

ネットワークが途中で切断されてしまった場合

WiFi再接続、IoT Hub再接続などが必要ですが、本サンプルはそのあたりの対応が抜けています。
SendMessageの戻り値がfalseのときは、Client.IsConnectedプロパティを確認してfalseだったらネットワーク再接続を再実施するようなロジックが必要です。

バイスIDをAzrue IoT Hubへデバイス側から登録

今回のサンプルでは、デイバスIDをAzure IoT Hub側で登録して、それをコードの中に記述していました。
利用デバイスが1つだけであればそれでもいいのですが、複数のデバイスをサポートし、また、どのデバイスからのデータかを判断したいような場合は、

  1. コードでデバイス自体からユニークなデバイスIDを取得
  2. 取得したデバイスIDでAzrue IoT Hubにデバイスを登録

というような流れが必要です。

データ取得間隔の安定化

今回のサンプルでは、「Azure IoT Hubにデータ送信後10秒経過したらセンサー値を取得して再度送信」という時間間隔でした。
しかし、この方法ではデータ送信などが遅延した場合などにセンサーからのデータ取得時間がずれていく可能性があります。
センサー値自体の取得間隔をきちんとしたいということであれば、

  1. タイマーなどで一定間隔でセンサー値取得
  2. 取得したセンサー値はキューに保存
  3. 別スレッドでキューを取り出してシーケンシャルにAzure IoT Hubに送信

のような処理方式が必要です。

最後に

.NET nanoFrameworkには、Azure IoT Hubのライブラリもあり比較的簡単にコードを書くことができました。
しかし、ルートCA証明書が必要な点などが明確に書かれた情報が少なく、DeviceClientのOpenをしたときのエラーをなかなかとることができませんでした。
このブログエントリで同じことに悩む人が1人でもすくなくなってくれたら嬉しいです。

次回

次回は、センサーデータを蓄積してグラフ表示してみたいと思います。
もちろん、IoT HubにBLOBやPowerBIなどを組み合わせて作っていってもいいのですが、そのあたりもサポートしているSaaS製品であるAzure IoT Centralを使って最小手順で構築してみたいと思います。
hatsune.hatenablog.jp

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

すっかり書いた気になっていたM5Stack Core 2でArduinoを使って、Azure IoT Hubにデータを送信するお話となります。
いま、.NET nanoFrameworkを使って同じ流れをおさらいしていますが、まずは、そこに先行して、こちらのお話を完結させたいと思います。

前回

hatsune.hatenablog.jp
前回はAzure IoT Hubの準備が完了したところまで進みましたので、今回は、M5Stack Core 5からAzure IoT Hubに「気圧」「気温」「湿度」を送信するためのプログラム(スケッチ)を紹介します。

Setupへの追加ロジック

センサー値を取得するスケッチのSetupに2つのロジックを追加します。

Wi-Fi初期化

gist.github.com
関連するライブラリはWiFi.hにあるので、スケッチの先頭でインクルードしておきましょう。

#include

MQTT初期化

Azure IoT Hubに接続するためのライブラリは、Visual Studio CodeでCTRL+SHIFT+Pで「Arduino Board Manager」起動して「M5Stack」をインストールすると「AzureIotHub」と「Esp32MQTTClient」のライブラリがダウンロードされてきます。

この「Esp32MQTTClient」のライブラリをスケッチの先頭でインクルードしておきます。

#include "Esp32MQTTClient.h"

次にSetUpの中でMQTTを初期化します。
gist.github.com
「connectionString」をAzure IoT Hub上で表示されているプライマリ接続文字列を設定します。

Loopへの追加ロジック

初期化が終わったらセンサー値を取得しているLoopの中にMQTT送信用のコードを入れます。
gist.github.com
主要部分は次のようになっています。

IoT Hubに送信するメッセージの作成

送信するメッセージは次のようなJSONフォーマットです。

このフォーマットに対して、snprintf文を使ってセンサー値を入れたものを「messagePayload」変数に設定します。

snprintf(messagePayload, MESSAGE_MAX_LEN, messageData, messageCount++, Tmp, Hum, Pressure);

IoT Hubへの送信

JSON文字列が出来上がったならば、MQTTに送信します。

EVENT_INSTANCE* message = Esp32MQTTClient_Event_Generate(messagePayload, MESSAGE);
Esp32MQTTClient_SendEventInstance(message);

これで、取得したセンサー値を「INTERVAL」ミリ秒ごとに送信することになります。

最後に

データをWEBでリアルタイム表示

IoT Hubに送信されたデータを「リアルタイム」で、つまり、Azure上のストレージなどにデータを格納せずに届いたタイミングでWEBアプリで表示してみましょう。
IoT Hubのサービス用の共通アクセスポリシーを含んだ接続文字列と、組込みエンドポイントのコンシューマーグループをWEBアプリ側で指定することでAzure IoT Hubと接続できます。

このあたりは、.NET nanoFrameworkを使ったときも同じになるので、機会があればそちらの流れでWEBアプリについては掘り下げたいと思います。

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文を探してきてくれると考えると使い道はいろいろ広がりますね。