AI機能(音声・画像・文書)

[更新:2025年12月11日]

ai_function

音声・画像・文書を統合的に処理できるクラウド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 サービスで処理するファイルをアップロードします。

  1. 対象のバケットへアクセスし、アップロード 選択

    バケットにアップロード
  2. ファイル追加 ボタンをクリックして、処理対象のファイルを選択

    処理対象のファイルを選択
  3. 選択したファイルが一覧に追加されていることを確認したら、アクセス権限と注意事項の確認チェックする

  4. アップロード をクリック。アクセス権限は privatepublic-read のどちらも選択可

    アップロード
  5. アップロードが完了したら画面の右下にステータスが表示される

    ステータスが表示
  6. リロードして、アップロードしたファイルを一覧に表示

    ファイルを一覧に表示

Azure AI Foundry の準備

API キーとエンドポイントの取得

各サービスの Primary Key とエンドポイントを取得します。

  1. Azure AI Foundry にアクセス

  2. 左のメニューにある マイアセットモデル + デプロイ にアクセス

    モデル + デプロイにアクセス
  3. タイトルの下にある サービス エンドポイント を選択

    サービス エンドポイント を選択
  4. 次の3つのサービスのうち、使用するサービスのリンクをクリック

    サービスを使用
  5. 詳細画面の キーとエンドポイント にある主キーリソースエンドポイント を取得

    • Azure AI 音声

      Azure AI 音声
    • Azure AI Vision

      Azure AI Vision
    • Azure AI Document Intelligence

      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)
  1. 下記コマンドを実行し、音声ファイルの文字起こしをリクエストします。

# 音声ファイルの文字起こし
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"
  }
}
  1. さくらのオブジェクトストレージにアップロードした音声ファイルが 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」の中にあるファイルリンクにアクセスして、文字起こしの結果にアクセスできます。

  1. 文字起こしの結果を確認するために、以下のコマンドを実行します。

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
  1. 下記コマンドを実行し、画像分析をリクエストします。

# 画像の分析
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
  1. 下記コマンドを実行し、文書分析をリクエストします。

# 文書の分析
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>"
  }'
  1. 実行結果として以下のようなレスポンスが返却されます。

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
  1. <POST response> を POST リクエスト応答に含まれている Operation-location ヘッダーの値に置き換え GET リクエストします。

curl -i -X GET "<POST response>" \
  -H "Ocp-Apim-Subscription-Key: <リソースキー>" > document_analysis.txt
  1. 実行結果として以下のような分析結果が出力されます。

{
  "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
            }
          },