たびとの旅路 ~電脳砂漠の冒険譚~

フロッピー頼りに歩き、クラウドの地平を見つめる今日まで。見つけたオアシス、迷い込んだ砂の迷宮、全てこの羊皮紙に。

第二章:神々の言葉を紡ぐ ~C#で詠唱する、Azure AI Video Analyzerの魔法~

旅の途中、興味深いオアシスを見つけた。忘れないうちに、この羊皮紙に記しておくとしよう。

前回、我々はMicrosoft Azure AI(マイクロソフトの人工知能サービス)の「Video Analyzer(動画解析サービス)」という、神々の領域に足を踏み入れた。Webという名の神殿から、ビデオという魂を捧げれば、誰でも簡単にAIによる解析という神託を受けられる。しかし、真の冒険者は、そこで満足しない。

神殿の巫女を介するのではなく、自らの言葉で、直接神々と対話したい。C#という我々の言葉でAPI(アプリケーション間の通信規約)という名の呪文を詠唱し、神々の力を、我が意のままに操りたいのだ。 これは、RestSharpとNewtonsoft.Jsonという二つの神器(外部ライブラリ)を手に、Video Analyzerという神々と直接契約を結び、その神託を読み解く、一人の魔法使いの冒険の記録である。

この羊皮紙のあらまし

この羊皮紙が導く者

  • Azure AI Video Analyzerという神々の力を、プログラムから直接操りたい冒険者
  • C#でREST APIを呼び出す実装方法を知りたい探求者
  • 動画解析AIを組み込んだアプリケーション開発に興味がある錬金術師
  • NuGetパッケージを使った外部ライブラリ活用を学びたい者

砂漠の道標

  • API(Application Programming Interface) - プログラム同士が通信するための取り決め。神殿への入口と考えればよい。
  • REST API - Web上で広く使われるAPI設計方式。URLとHTTPメソッドで操作を指定する。
  • JSON(JavaScript Object Notation) - データをやり取りするための記述形式。神託を記す共通言語。
  • NuGet - .NET向けのパッケージ管理システム。必要な神器を簡単に入手できる宝物庫。
  • RestSharp - REST APIを簡単に呼び出すための.NETライブラリ。神殿との対話を補助する翼。
  • Newtonsoft.Json - JSONデータの読み書きを行う.NETライブラリ。神託を解読する真実のレンズ。
  • Access Token - APIへのアクセス権を証明する一時的な認証情報。神殿への通行証。
  • エンドポイント - APIの個別機能にアクセスするためのURL。神殿内の各祭壇への道標。

第一の儀式:神々と対話するための準備

神々と対話するには、まず、二つの強力な神器(外部ライブラリ)が必要だ。

  • Newtonsoft.Json: 神託(JSONデータ)を読み解くための、真実のレンズ。
  • RestSharp: 神殿(REST API)へ、我々の願いを届けるための、魔法の翼。

これらを、NuGet(.NET用パッケージ管理システム)という名の宝物庫から、授かっておく必要がある。

第二の儀式:神々の力を借りる、五つの呪文

今回の旅で、我々が習得する呪文は、以下の五つだ。

呪文(API) 神託(説明)
Get Access Token 神殿に入るための「通行証」を得る。
Upload Video ビデオという魂を捧げ、AIによる解析を依頼する。
List Videos これまでに捧げた、全ての魂の一覧を得る。
Get Video Index 解析結果という、詳細な神託をJSONで得る。
Get Video Captions 魂の声を、文字として書き起こした神託を得る。

最初の詠唱:魂を捧げ、解析を依頼する

これが、一連の儀式の始まりとなる、魂を捧げる呪文の全貌だ。 accountIdapiKeyという、自らの身分を証明する印を携え、まずはGetTokenで通行証(Access Token)を手に入れる。そして、Uploadの呪文で、ビデオという魂を神殿(REST API)へ送るのだ。

using Newtonsoft.Json;
using RestSharp;
using System.Net;

// 神殿の座標と、我が身の印
const string VideoIndexerUri = @"https://api.videoindexer.ai";
var location = "trial";
var accountId = "<アカウントID>";
var apiKey = "<APIキー>";

// 神殿との対話準備
var client = new RestClient(baseUrl: VideoIndexerUri);
client.AddDefaultHeader("Ocp-Apim-Subscription-Key", apiKey);

// 儀式の執行
var accessToken = GetToken();
if (accessToken == null) return;
var path = @"<ビデオファイル>.mp4";
Upload(path);

// 通行証を得る呪文
string? GetToken()
{
    var request = new RestRequest($"Auth/{location}/Accounts/{accountId}/AccessToken", Method.Get);
    // ...
    var token = JsonConvert.DeserializeObject<string>(response.Content);
    return token;
}

// 魂を捧げる呪文
bool Upload(string path)
{
    var request = new RestRequest($"{location}/Accounts/{accountId}/Videos", Method.Post);
    request.AlwaysMultipartFormData = true;
    request.AddParameter("accessToken", accessToken, ParameterType.QueryString);
    request.AddFile("video_file", path, "application/octet-stream");
    // ...
    return true;
}

魂を捧げると、神殿のWebサイトでは、解析の進捗という名の神託が、リアルタイムで表示される。

アップロード後に解析の進捗が表示されます

神々が、捧げられた魂を解析している様子

第二の詠唱:神託を受け取り、読み解く

次に、捧げた魂がどうなったかを知るための、神託を受け取る呪文だ。 ListVideosで魂の一覧を取得し、その状態(state)が「Processed(処理済み)」になっていることを確認する。そして、videoIdという魂の識別子を使い、VideoIndexVideoCaptionsで、詳細な神託を羊皮紙に書き出す。

// ...(GetTokenは前述の通り)...

// 全ての魂の一覧を得る
var videosJson = ListVideos();
if (videosJson == null) return;

// 神託を読み解き、一つ一つの魂の状態を確認する
var obj = JObject.Parse(videosJson);
var items = (JArray)obj["results"];
foreach( var item in items)
{
    var videoId = (string)item["id"];
    var state = (string)item["state"];

    // 解析が完了していなければ、次の魂へ
    if (state.Equals("Processing")) continue;

    // 解析情報を羊皮紙へ
    var index = VideoIndex(videoId, (string)item["sourceLanguage"]);
    if (index != null) File.WriteAllText(@$"va_{videoId}.json", index);

    // 文字起こし情報を羊皮紙へ
    var caption = VideoCaptions(videoId, (string)item["sourceLanguage"]);
    if (caption != null) File.WriteAllText($@"va_{videoId}.srt", caption);
}

羊皮紙を巻く前に

C#という我々の言葉で、Azure AIという神々の力の一端を、確かに操ることができた。WebのUIという巫女を介さず、直接神託を授かる術を手に入れたのだ。

Azure AI Video Analyzerをプログラムから操る価値

  1. 自動化による効率化 - 大量の動画を一括処理したり、定期的な解析を自動実行できる。
  2. 独自アプリケーションへの組み込み - 既存システムに動画解析機能を統合し、業務フローに組み込める。
  3. カスタマイズされた処理 - 解析結果を独自のロジックで加工・活用し、独自の価値を創出できる。
  4. スケーラビリティ - WPF、gRPC、三層アーキテクチャ(Web/AP/DB)など、大規模システムへの拡張基盤となる。

プログラム実装での注意点

  • Access Tokenの有効期限 - トークンには有効期限があるため、長時間処理では再取得の仕組みが必要。
  • 非同期処理の考慮 - 動画解析は時間がかかるため、ポーリングや webhook による完了通知の実装を検討すべき。
  • エラーハンドリング - ネットワーク障害やAPI制限への対応が実用化には不可欠。

まとめ

この羊皮紙が示したのは、AIという神々の力へ至る、一本の確かな道筋だ。 もちろん、これはまだ冒険の序章に過ぎない。実用のためには、取得したJSONという神託を、さらに深く読み解く必要があるだろう。

しかし、この儀式を基礎とすれば、いずれはクライアントをWPF(デスクトップアプリ)で、サーバをgRPC(高速通信プロトコル)で構築し、Web(Nginx)・AP(Kestrel)・DB(PostgreSQL)の三層構造を持つ、巨大なAIゴーレムさえも創り出せるかもしれない。

この羊皮紙が、同じようにAIという名の神々の力に触れたいと願う、未来の冒険者の助けとなることを願う。

風向きが変わったようだ。この機を逃さず、次の砂丘へと旅立とう。

砂漠で見つけた魔法のランプ

ラクダの独り言

ご主人が「神々の力を我が手に!」とか言って、また黒い画面に呪文を打ち込んでいる。なんでも、天上の誰かに映像を送ると、賢い答えが返ってくるらしい。俺に言わせりゃ、そんな遠くの神様に頼る前に、目の前で全てを見ている、この俺様に聞けばいいだろうに。まったく、人間ってのは、遠いところにあるものほど、ありがたがるもんだ。やれやれだぜ。