【クラウドAI開発講座】CognitiveServicesを使ってみた


概要

この記事はクラウドAI開発講座の3週目の進捗報告です。
前の記事→【クラウドAI開発講座】Teamsのオウム返しするボットを作ってみた
次の記事→力尽きたので更新はないと思われます...ごめんなさい!

クラウドAI開発講座の公式ページ→https://online.kosen-career.tech/ai

進捗

今回は@miokawaさんの記事であるやさしいチャットボットのつくりかた -1.Bot Frameworkでチャットボットを作ってみよう!を参考にしてAzure Cognitive Servicesを使ったBot作りに挑戦しました。

サブスクリプションフィルターの落とし穴

早速ハマりました。
リソースグループにアプリを追加しようとしたのですが、どうやってもサブスクリプションのアップグレードを勧められて一向に先に進むことができませんでした。

2時間くらい試行錯誤した結果、期限切れのサブスクリプションを持っており、「サブスクリプションフィルター」によって期限切れのサブスクリプションしか見えない設定になっていたのが原因だとわかりました。

TextAnalyticsを使ってテキスト分析

前回の記事ですでにTeamsのオウム返しボットを作っていたため、今回はやさしいチャットボットのつくりかた -3.Cognitive Serviceでテキスト分析をしてみよう!から始めます。

まず、オウム返しボットで作ったリソースグループに「テキスト分析」のアプリを追加します。
そのあと、参考にした記事を参考にしてEchoBot.csを以下のように改変しました。

EchoBot.cs
// usingは省略
namespace TeamsEchoBot.Bots
{
    class ApiKeyServiceClientCredentials : ServiceClientCredentials
    {
        private readonly string apiKey;

        public ApiKeyServiceClientCredentials(string apiKey)
        {
            this.apiKey = apiKey;
        }

        public override Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request");
            }
            request.Headers.Add("Ocp-Apim-Subscription-Key", this.apiKey);
            return base.ProcessHttpRequestAsync(request, cancellationToken);
        }
    }

    public class EchoBot : ActivityHandler
    {
        private static readonly string CogKey = "xxxxxxxxxxxxxxxx";
        private static readonly string CogEndpoint = "https://xxxxxxxx.azure.com/";

        static TextAnalyticsClient AuthenticateClient()
        {
            var credentials = new ApiKeyServiceClientCredentials(CogKey);
            var client = new TextAnalyticsClient(credentials)
            {
                Endpoint = CogEndpoint
            };
            return client;
        }

        protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
        {
            var activity = turnContext.Activity;
            var messageText = activity.RemoveRecipientMention();

            if (string.IsNullOrEmpty(messageText))
            {
                return;
            }

            var client = AuthenticateClient();
            var lang = await client.DetectLanguageAsync(messageText, countryHint: "US");
            var score = await client.SentimentAsync(
                inputText: messageText,
                language: lang.DetectedLanguages[0].Iso6391Name,
                cancellationToken: cancellationToken
                );

            var replyText = $"{messageText}\n\nLang: {lang.DetectedLanguages[0].Name}   \nScore: {score.Score:0.00}";

            await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
        }
    }
}

ユーザーから渡されたテキストをTextAnalyticsで分析した後、オウム返ししつつ言語とスコアを返信させています。
Azureにデプロイして、Teamsで言語とスコアを返信させることができました。

次回の目標

これで7/25までののミッションは全て完了しました。
次回はオリジナルのBotを作るためにほかのサービスも色々試してみたいと思います。
(最近Discordのボットを作るのにハマってモチベが下がり気味)