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

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

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

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

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

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

この羊皮紙のあらまし

この羊皮紙が導く者

  • Microsoft Azure AI Video Analyzerという、神々の力に興味がある者
  • AIアプリという、未来のゴーレムを、C#という名の魔法で創り出したい探求者

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

神々と対話するには、まず、二つの強力な神器が必要だ。

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

これらを、NuGetという名の宝物庫から、授かっておく必要がある。

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

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

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

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

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

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#という我々の言葉で、神々の力の一端を、確かに操ることができた。 もちろん、これはまだ冒険の序章に過ぎない。実用のためには、取得したJSONという神託を、さらに深く読み解く必要があるだろう。

しかし、この儀式を基礎とすれば、いずれはクライアントをWPFで、サーバをgRPCで構築し、Web(Nginx)・AP(Kestrel)・DB(PostgreSQL)の三層構造を持つ、巨大なAIゴーレムさえも創り出せるかもしれない。その夢想は、また別の旅の物語だ。

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

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

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

ラクダの独り言

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