AI機能(音声・画像・文書)
[更新:2025年12月11日]
音声・画像・文書を統合的に処理できるクラウドAI基盤を構築することで、高精度な文字起こし、画像内容の自動解析、文書構造の抽出を一貫して実行できます。これにより、大量データの理解と処理を自動化し、業務の効率化や情報活用の高度化を実現。人的リソースへの依存を減らし、迅速で正確な判断・検索・整理を可能にします。
各機能のサービス対応
機能 |
対応サービス |
|---|---|
AI |
Azure AI Foundry |
システム構成要素
さくらのクラウド
オブジェクトストレージ
Addon
Azure AI Foundry
AI Speech
AI Vision
AI Document Intelligence
構築手順
Addon でのリソース作成
Addon の 「AI 機能」API を利用して Azure AI Foundry リソースを作成します。
```bash #TOKEN=‘’
–header ‘Content-Type: application/json’–header ‘Accept: application/json’–header “Authorization: Basic $TOKEN”–data-raw ‘{ “sku”: “1” }’
さくらのクラウドの準備
さくらのクラウド上にオブジェクトストレージを作成し、AIサービスで処理するファイルをアップロードします。
オブジェクトストレージの設定
さくらのクラウドのオブジェクトストレージを作成し、以下を設定します
バケットの作成
パーミッションの作成
※アクセスキーとシークレットアクセスキーが発行されるためメモしておく
対象のバケットにパーミッションを適用
ファイルのアップロード
AI サービスで処理するファイルをアップロードします。
対象のバケットへアクセスし、
アップロード選択
ファイル追加ボタンをクリックして、処理対象のファイルを選択
選択したファイルが一覧に追加されていることを確認したら、アクセス権限と注意事項の確認チェックする
アップロードをクリック。アクセス権限はprivateかpublic-readのどちらも選択可
アップロードが完了したら画面の右下にステータスが表示される
リロードして、アップロードしたファイルを一覧に表示
Azure AI Foundry の準備
API キーとエンドポイントの取得
各サービスの Primary Key とエンドポイントを取得します。
Azure AI Foundry にアクセス
左のメニューにある
マイアセットのモデル + デプロイにアクセス
タイトルの下にある
サービス エンドポイントを選択
次の3つのサービスのうち、使用するサービスのリンクをクリック
詳細画面の
キーとエンドポイントにある主キーとリソースエンドポイントを取得Azure AI 音声
Azure AI Vision
Azure AI Document Intelligence
連携の準備
さくらのクラウド側の準備
オブジェクトストレージに処理対象ファイルをアップロードし、署名付き URLを生成します。
ここでは、AWS CLIします。詳細は、 オブジェクトストレージ <https://manual.sakura.ad.jp/cloud/manual-objectstorage.html> を参照してください。
署名付き URL の生成
下記のスクリプトを実行します。実行結果として署名付き URL が生成されます。<>で囲んだ箇所は各環境に合わせて変更してください。
#!/bin/bash
set -euo pipefail
# AWS CLI設定(さくらのクラウド用)
aws configure set aws_access_key_id "<アクセスキー>"
aws configure set aws_secret_access_key "<シークレットキー>"
aws configure set default.region "<リージョン>"
# さくらクラウドのエンドポイント
ENDPOINT="<オブジェクトストレージのエンドポイント>"
# 変数設定
BUCKET="<バケット名>"
# 署名付きURL生成関数
generate_presigned_url() {
local object_key="$1"
local expire_time="${2:-86400}" # デフォルト24時間
echo "署名付きURL生成中: $object_key"
# 署名付きURL生成
local presigned_url
presigned_url=$(aws --endpoint-url=$ENDPOINT s3 presign \
s3://$BUCKET/$object_key \
--expires-in $expire_time)
if [ $? -ne 0 ] || [ -z "$presigned_url" ]; then
echo "署名付きURL生成失敗"
return 1
fi
echo "【生成完了】"
echo "$presigned_url"
return 0
}
# コマンドライン引数から実行する場合
if [ $# -ge 1 ]; then
generate_presigned_url "$1" "${2:-86400}"
else
echo "使用方法: $0 <オブジェクトパス> [有効期限(秒)]"
exit 1
fi
※生成された URL は、後に Azure の操作で使用するためにメモしておいてください。
Azure AI Foundry の REST API の実行と動作確認
生成された署名付き URL を使用して、各 AI サービスの REST API を実行します。
AI Speech (Fast Transcription)
下記コマンドを実行し、音声ファイルの文字起こしをリクエストします。
# 音声ファイルの文字起こし
curl -L 'https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions' \
-H 'Ocp-Apim-Subscription-Key: <リソースキー>' \
-H 'Content-Type: application/json' \
--data-ascii '{
"contentUrls": [
"<署名付きURL>"
],
"properties": {
"diarizationEnabled": false,
"wordLevelTimestampsEnabled": false,
"punctuationMode": "DictatedAndAutomatic",
"profanityFilterMode": "Masked"
},
"locale": "ja-JP",
"displayName": "Data Transcription"
}'
レスポンスにテキストデータ生成の ID を含めた URL(links パラメータ)が生成されるため、メモしておきます。
{
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/<保存するID>",
"displayName": "Data Transcription",
"locale": "ja-JP",
"createdDateTime": "2025-09-09T07:25:24Z",
"lastActionDateTime": "2025-09-09T07:25:24Z",
"status": "NotStarted",
"model": {
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/models/base/18149137-1e14-45c6-89c8-d5f1941ff860"
},
"links": {
"files": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/<保存するID>/files"
},
"properties": {
"diarizationEnabled": false,
"wordLevelTimestampsEnabled": false,
"displayFormWordLevelTimestampsEnabled": false,
"channels": [0, 1],
"punctuationMode": "DictatedAndAutomatic",
"profanityFilterMode": "Masked"
}
}
さくらのオブジェクトストレージにアップロードした音声ファイルが AI Speech 正常に処理されているか確認するために、以下のコマンドを実行します。
curl --location 'https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/<保存したID>' \
--header 'Ocp-Apim-Subscription-Key: <リソースキー>'
レスポンス値の status を確認して Succeeded になっていることを確認します。
{
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/<保存したID>",
"displayName": "Data Transcription",
"locale": "ja-JP",
"createdDateTime": "2025-09-09T07:25:24Z",
"lastActionDateTime": "2025-09-09T07:28:48Z",
"status": "Succeeded",
"model": {
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/models/base/18149137-1e14-45c6-89c8-d5f1941ff860"
},
"links": {
"files": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/<保存したID>/files"
},
"properties": {
"diarizationEnabled": false,
"wordLevelTimestampsEnabled": false,
"displayFormWordLevelTimestampsEnabled": false,
"channels": [0, 1],
"punctuationMode": "DictatedAndAutomatic",
"profanityFilterMode": "Masked",
"duration": "PT20M14S"
}
}
「status」 が Succeeded になっていることが確認できたら、「links」の中にあるファイルリンクにアクセスして、文字起こしの結果にアクセスできます。
文字起こしの結果を確認するために、以下のコマンドを実行します。
curl -L '<links URL>' \
-H 'Ocp-Apim-Subscription-Key: <リソースキー>'
以下にレスポンスの例を記載します。
kind:Transcriptionの URL文字起こしされた文字データが格納されています。
kind:TranscriptionReportの URL文字起こしに使用した音声ファイルと処理結果のステータスが格納されています。
{
"values": [
{
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/930078ac-9c77-4cb9-888d-280ee9de09ac/files/cd05a527-6f95-4569-a559-5e7a848251e8",
"name": "contenturl_0.json",
"kind": "Transcription",
"links": {
"contentUrl": "https://spsvcprodjpe.blob.core.windows.net/bestor-948e9f4b-98f0-414a-b695-603be7bddabe/TranscriptionData/930078ac-9c77-4cb9-888d-280ee9de09ac_0_0.json?skoid=c243ab90-da1a-4893-986b-063e4b26bd23&sktid=33e01921-4d64-4f8c-a055-5bdaffd5e33d&skt=2025-09-16T05%3A08%3A46Z&ske=2025-09-21T05%3A13%3A46Z&sks=b&skv=2021-08-06&sv=2025-01-05&st=2025-09-16T05%3A08%3A46Z&se=2025-09-16T17%3A13%3A46Z&sr=b&sp=rl&sig=BaMTK3SmqFxpfDM3zqfnKLrriXHVQbJPN%2FmShVjKdOs%3D"
},
"properties": {
"size": 465909
},
"createdDateTime": "2025-09-16T05:10:44Z"
},
{
"self": "https://<your-endpoint>/speechtotext/v3.2-preview.2/transcriptions/930078ac-9c77-4cb9-888d-280ee9de09ac/files/87b28e6b-e244-4131-97c7-53fc9da077db",
"name": "report.json",
"kind": "TranscriptionReport",
"links": {
"contentUrl": "https://spsvcprodjpe.blob.core.windows.net/bestor-948e9f4b-98f0-414a-b695-603be7bddabe/TranscriptionData/930078ac-9c77-4cb9-888d-280ee9de09ac_report.json?skoid=c243ab90-da1a-4893-986b-063e4b26bd23&sktid=33e01921-4d64-4f8c-a055-5bdaffd5e33d&skt=2025-09-16T05%3A08%3A46Z&ske=2025-09-21T05%3A13%3A46Z&sks=b&skv=2021-08-06&sv=2025-01-05&st=2025-09-16T05%3A08%3A46Z&se=2025-09-16T17%3A13%3A46Z&sr=b&sp=rl&sig=sfOgRn4gIPo4Op3vn%2FcvgwftJmessHePx0S5pg1fROg%3D"
},
"properties": {
"size": 510
},
"createdDateTime": "2025-09-16T05:10:44Z"
}
]
}
AI Vision
下記コマンドを実行し、画像分析をリクエストします。
# 画像の分析
curl -L 'https://<your-endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01&features=tags%2Cread' \
-H 'Ocp-Apim-Subscription-Key: <リソースキー>' \
-H 'Content-Type: application/json' \
--data-ascii '{
"url": "<署名付きURL>"
}'
実行結果として以下のような画像分析結果が出力されます。
{
"modelVersion": "2023-10-01",
"metadata": { "width": 595, "height": 842 },
"tagsResult": {
"values": [
{ "name": "text", "confidence": 0.9995473623275757 },
{ "name": "graphics", "confidence": 0.933948278427124 },
{ "name": "font", "confidence": 0.9326817989349365 },
{ "name": "logo", "confidence": 0.9132150411605835 },
{ "name": "graphic design", "confidence": 0.8842798471450806 },
{ "name": "poster", "confidence": 0.851222574710846 },
{ "name": "design", "confidence": 0.8511829972267151 },
{ "name": "illustration", "confidence": 0.5773060321807861 }
]
},
"readResult": {
"blocks": [
{
"lines": [
{
"text": "味自慢",
"boundingPolygon": [
{ "x": 186, "y": 208 },
{ "x": 226, "y": 197 },
{ "x": 262, "y": 324 },
{ "x": 220, "y": 336 }
],
"words": [
{
"text": "味",
"boundingPolygon": [
{ "x": 186, "y": 212 },
{ "x": 225, "y": 199 },
{ "x": 233, "y": 225 },
{ "x": 193, "y": 238 }
],
"confidence": 0.995
},
{
"text": "自",
"boundingPolygon": [
{ "x": 198, "y": 255 },
{ "x": 237, "y": 242 },
{ "x": 245, "y": 268 },
{ "x": 205, "y": 280 }
],
"confidence": 0.988
},
{
"text": "慢",
"boundingPolygon": [
{ "x": 208, "y": 292 },
{ "x": 249, "y": 279 },
{ "x": 256, "y": 305 },
{ "x": 215, "y": 317 }
],
"confidence": 0.982
}
]
},
{
"text": "さくら印の",
"boundingPolygon": [
{ "x": 76, "y": 681 },
{ "x": 356, "y": 681 },
{ "x": 356, "y": 740 },
{ "x": 76, "y": 740 }
],
"words": [
{
"text": "さ",
"boundingPolygon": [
{ "x": 78, "y": 681 },
{ "x": 116, "y": 682 },
{ "x": 117, "y": 741 },
{ "x": 79, "y": 741 }
],
"confidence": 0.995
},
{
"text": "く",
"boundingPolygon": [
{ "x": 133, "y": 682 },
{ "x": 178, "y": 682 },
{ "x": 179, "y": 741 },
{ "x": 133, "y": 741 }
],
"confidence": 0.994
},
{
"text": "ら",
"boundingPolygon": [
{ "x": 187, "y": 682 },
{ "x": 232, "y": 682 },
{ "x": 233, "y": 741 },
{ "x": 187, "y": 741 }
],
"confidence": 0.994
},
{
"text": "印",
"boundingPolygon": [
{ "x": 241, "y": 682 },
{ "x": 278, "y": 682 },
{ "x": 279, "y": 741 },
{ "x": 241, "y": 741 }
],
"confidence": 0.996
},
{
"text": "の",
"boundingPolygon": [
{ "x": 295, "y": 682 },
{ "x": 333, "y": 682 },
{ "x": 333, "y": 740 },
{ "x": 296, "y": 741 }
],
"confidence": 0.996
}
]
},
{
"text": "おいしいたこやき",
"boundingPolygon": [
{ "x": 76, "y": 748 },
{ "x": 523, "y": 748 },
{ "x": 523, "y": 809 },
{ "x": 76, "y": 808 }
],
"words": [
{
"text": "お",
"boundingPolygon": [
{ "x": 79, "y": 748 },
{ "x": 116, "y": 749 },
{ "x": 116, "y": 809 },
{ "x": 79, "y": 809 }
],
"confidence": 0.996
},
{
"text": "い",
"boundingPolygon": [
{ "x": 125, "y": 749 },
{ "x": 163, "y": 749 },
{ "x": 163, "y": 809 },
{ "x": 125, "y": 809 }
],
"confidence": 0.996
},
{
"text": "し",
"boundingPolygon": [
{ "x": 187, "y": 750 },
{ "x": 224, "y": 750 },
{ "x": 225, "y": 809 },
{ "x": 187, "y": 809 }
],
"confidence": 0.996
},
{
"text": "い",
"boundingPolygon": [
{ "x": 233, "y": 750 },
{ "x": 271, "y": 750 },
{ "x": 272, "y": 809 },
{ "x": 234, "y": 809 }
],
"confidence": 0.995
},
{
"text": "た",
"boundingPolygon": [
{ "x": 295, "y": 750 },
{ "x": 332, "y": 751 },
{ "x": 334, "y": 809 },
{ "x": 296, "y": 809 }
],
"confidence": 0.996
},
{
"text": "こ",
"boundingPolygon": [
{ "x": 349, "y": 751 },
{ "x": 394, "y": 751 },
{ "x": 396, "y": 808 },
{ "x": 350, "y": 808 }
],
"confidence": 0.995
},
{
"text": "や",
"boundingPolygon": [
{ "x": 411, "y": 751 },
{ "x": 448, "y": 750 },
{ "x": 450, "y": 808 },
{ "x": 412, "y": 808 }
],
"confidence": 0.996
},
{
"text": "き",
"boundingPolygon": [
{ "x": 465, "y": 750 },
{ "x": 502, "y": 750 },
{ "x": 505, "y": 808 },
{ "x": 467, "y": 808 }
],
"confidence": 0.996
}
]
}
]
}
]
}
}
AI Document Intelligence
下記コマンドを実行し、文書分析をリクエストします。
# 文書の分析
curl -i -X POST \
"https://<your-endpoint>.cognitiveservices.azure.com/formrecognizer/documentModels/prebuilt-document:analyze?api-version=2023-07-31" \
-H "Ocp-Apim-Subscription-Key: <リソースキー>" \
-H "Content-Type: application/json" \
--data-ascii '{
"urlSource": "<署名付きURL>"
}'
実行結果として以下のようなレスポンスが返却されます。
HTTP/1.1 202 Accepted
Content-Length: 0
Operation-Location: https://<your-endpoint>/formrecognizer/documentModels/prebuilt-document/analyzeResults/7d4c7a9b-5db7-43cf-8563-a1e578362a0b?api-version=2023-07-31
x-envoy-upstream-service-time: 703
apim-request-id: 7d4c7a9b-5db7-43cf-8563-a1e578362a0b
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
x-content-type-options: nosniff
x-ms-region: Japan East
Date: Tue, 16 Sep 2025 05:27:53 GMT
<POST response>を POST リクエスト応答に含まれているOperation-locationヘッダーの値に置き換え GET リクエストします。
curl -i -X GET "<POST response>" \
-H "Ocp-Apim-Subscription-Key: <リソースキー>" > document_analysis.txt
実行結果として以下のような分析結果が出力されます。
{
"status": "succeeded",
"createdDateTime": "2025-09-16T05:27:53Z",
"lastUpdatedDateTime": "2025-09-16T05:28:01Z",
"analyzeResult": {
"apiVersion": "2023-07-31",
"modelId": "prebuilt-document",
"stringIndexType": "textElements",
"content": "2025/09/12 17:17\ntakoyaki/README.md at master · sakura-cooking/takoyaki\nsakura-cooking / takoyaki\nQ\n<> Code :selected: Issues\n!? Pull requests :selected: Actions :unselected: Projects :selected: ₾ Wiki\nO Security\n2 :unselected: takoyaki / README.md\n.. .\ntakoyakidath Merge pull request #2 from takoyakidath/patch-1\n...\n4ce3d04 - 9 months ago\n242 lines (165 loc) · 20.1 KB\nPreview\nCode\nBlame\nRaw\n=\nさくらインターネット秘伝のおいしいたこ\n焼き\nさくら印の おいしいたこやき\n最初に\nこのレシピはフリーです。 自由にブランチを切ったりして派生形をつくってもらってOKです。自由に作成してレ ポートを寄せてください。 でもせっかくなので、「つくったよ」とか「アレンジしてみたよ」など、ご連絡してい ただけると当社のメンバーはとても喜びます。(以下略)",
"pages": [
{
"pageNumber": 1,
"angle": 0,
"width": 8.2639,
"height": 11.6806,
"unit": "inch",
"words": [
{
"content": "2025/09/12",
"polygon": [
0.3397,
0.2231,
0.8923,
0.218,
0.8872,
0.3245,
0.3397,
0.3194
],
"confidence": 0.994,
"span": {
"offset": 0,
"length": 10
}
},
{
"content": "17:17",
"polygon": [
0.9329,
0.218,
1.2016,
0.218,
1.2016,
0.3245,
0.9329,
0.3245
],
"confidence": 0.992,
"span": {
"offset": 11,
"length": 5
}
},