はじめに
会議の議事録づくり、地味に時間がかかりますよね。
かといって、Microsoft 365 Copilot などの有料ライセンスをいきなり契約するのはハードルが高い…という方も多いと思います。
そこでこの記事では、Azure の無料アカウントについてくる $200 のクレジットの範囲内で、
音声ファイル → 文字起こし → 議事録(決定事項・ToDo つき)
を自動で作る最小構成を、PowerShell のスクリプト1本で作ります。
- プログラミング経験が浅くてもOK(コピペで動かせます)
- Python などの環境構築は不要(PowerShell 7 だけ)
- 画面操作は「ここをクリック」レベルまで書きます
- 使うのは Azure AI Speech(文字起こし) と Foundry 上の GPT モデル(議事録整形) の2つだけ
この記事の内容は 2026年11月時点 のものです。Azure ポータルや Foundry ポータルの画面・ボタン名・モデル名は頻繁に変わります。表示が少し違う場合は、近い名前のものを選んでください。
完成イメージ
実行するコマンドはこれだけです。
.\minutes.ps1 -AudioPath .\meeting.mp3
実行すると、transcript.txt(文字起こし)と minutes.md(議事録)ができあがります。
費用の考え方(先に読んでください)
| 項目 | 内容 |
|---|---|
| Azure 無料アカウント | $200 のクレジット(30日間) と一部の無料サービスがつく |
| 請求 | 公式に「無料アカウントのお客様には請求は発生しない」と案内されている。従量課金プランへ自分で切り替えない限り、クレジットを超えても勝手に課金されない |
| 文字起こし(Speech) | 音声の長さに応じた従量課金 → クレジットから引かれる |
| 議事録整形(GPT) | 使ったトークン数に応じた従量課金 → クレジットから引かれる |
ポイントは、「無料枠の中だけで動く」のではなく「無料クレジットを消費して動かす」 ということです。
ただし今回の用途(数分〜1時間程度の音声を数回試す)なら、$200 に対してごくわずかな消費で済みます。
今回は最も安いクラスのモデル gpt-6-luna を使います。入力 $0.10 / 出力 $0.50 / 100万トークンという価格が報じられています(OpenAI の公式 API 価格の情報で、Azure 上の価格は異なる場合があるので、デプロイ時に表示される価格を確認してください)。1時間の会議の文字起こしを議事録にまとめる程度なら、GPT 側の費用は 1円未満〜数円程度 の見込みです(筆者の概算)。
無料期間が終わったらどうなる?
今回の構成は、Azure 無料アカウントの $200 クレジット を使って試すことを前提としています。
無料期間(30日)が終了すると、Fast transcription と GPT モデルの利用は従量課金になります。そのため、完全無料で使い続けられる構成ではありません。
ただし、議事録用途であれば継続利用時の費用は比較的低額です。
| 利用量の目安 | 月額費用の目安 |
|---|---|
| 1時間の会議 × 月4回 | 約220〜600円 |
| 1時間の会議 × 月8回 | 約440〜1,200円 |
| 1時間の会議 × 月20回 | 約1,100〜3,000円 |
上記は Speech の料金を 1時間あたり約0.36〜1ドル、為替を 1ドル=150円として概算したものです。1時間の会議を文字起こしして議事録に整形する場合、費用の大半は Speech の文字起こし料金で、GPT 側の費用は数円以下に収まるケースがほとんどです。
そのため、今回の構成は
- まずは無料クレジットで試す
- 気に入ったら月数百円〜数千円程度で運用する
という使い方に向いています。
Speech の「無料(F0)」レベルでは、今回使う Fast transcription は使えません。 公式の割当て表で Fast transcription の Free (F0) は「N/A」です。後述の手順では Foundry リソースを「Standard (S0)」で作りますが、これは無料アカウントのクレジットで利用できます。
用意するもの
- Azure アカウント(無料アカウントでOK。電話番号・クレジットカード(プリペイド不可)・Microsoft アカウントまたは GitHub アカウントが必要)
- Windows PC
- PowerShell 7 以降(後述。Windows 標準の 5.1 では動きません)
- 試し用の短い音声ファイル(5〜10分程度。mp3 か wav)。この記事では後半で紹介する、note で公開されている議事録練習用のサンプル音声(約5分)を利用します
社内の機密会議の音声は、最初は使わないでください。 まずは自分で読み上げたダミー音声で動作確認し、実運用の前に会社のセキュリティルールを確認しましょう。
手順1:Azure 無料アカウントを作る
すでにアカウントがある場合は、次の手順2へ進んでください。
- ブラウザで Azure の無料アカウントのページ(
azure.microsoft.com/free)を開く - 「無料で始める」をクリックし、Microsoft アカウント(または GitHub アカウント)でサインイン
- 画面の案内に従って、電話番号・クレジットカード情報を入力して登録
登録後、https://portal.azure.com で Azure ポータルにサインインできれば OK です。
残りのクレジットは、ポータルの 「Cost Management」 で確認できます。
手順2:リソースグループを作る
リソースグループは、作ったものをまとめて入れておく箱です。後でこの箱ごと削除すれば、課金もまとめて止められます。
- Azure ポータル上部の検索バーに「リソース グループ」と入力して開く
- 「+ 作成」をクリック
- 次のように入力する
- サブスクリプション:自分のサブスクリプション(無料試用版など)
- リソースグループ名:
rg-minutes-test - リージョン:
Japan East(東日本)
- 「確認および作成」→「作成」
手順3:Foundry リソースを作る
現在の Azure では、Speech(文字起こし)も GPT モデルも 「Microsoft Foundry」リソース という1つのリソースで使えます。つまり、リソースを1個作れば、キーも1組で済みます。
- Azure ポータル左上の「リソースの作成」をクリック
- 検索欄に「Microsoft Foundry」と入力し、表示された項目の「作成」をクリック(見つからない場合は「Azure OpenAI」でも可)
- 次のように入力する
- サブスクリプション:自分のもの
- リソースグループ:
rg-minutes-test - リージョン:
Japan East - 名前:世界で一意な名前(例:
minutes-test-yourname)← 後でスクリプトで使うのでメモ - 価格レベル:
Standard (S0)
- ネットワークは、試用なら初期値(すべてのネットワーク)のままでOK
- 「確認および作成」→「作成」
- デプロイが終わったら「リソースに移動」をクリック
リージョンについて:Fast transcription は、使えるリージョンが限られています。Japan East は公式ドキュメントの対応リージョン一覧に載っていましたが、最新の対応状況は公式の「Speech service regions」の表(Fast transcription の列)で確認してください。後でエラーになる場合は、別のリージョン(例:East US、Southeast Asia)でリソースを作り直すと解決することがあります。
手順4:キーとエンドポイントを控える
- 作ったリソースの左メニューで「リソース管理」の中にある「キーとエンドポイント」をクリック
- 次の3つをメモ帳にコピーしておく
- キー1
-
場所/リージョン(例:
japaneast) -
エンドポイントのうち
https://◯◯.openai.azure.com/の ◯◯ の部分(基本はリソース名と同じ)
キーはパスワードと同じです。 記事やブログ、GitHub、SNS、スクリーンショットに絶対に載せないでください。もし漏らしてしまったら、同じ画面の「キーの再生成」で無効化できます。
手順5:GPT モデルをデプロイする
議事録を整形するための GPT モデルを、リソースに「デプロイ」(使える状態に配置)します。
- リソースの「概要」ページにある Foundry ポータルへのリンクをクリック(または
https://ai.azure.comを開く) - 「新しい Foundry」のスイッチがオンになっていること、対象のプロジェクト(なければ作成)が選ばれていることを確認
- 左メニューまたは上部メニューの「モデル」(または「検出」)を開く
- モデル一覧から
gpt-6-lunaを探してクリック(検索欄にlunaと入力すると早い) - 「デプロイ」をクリックし、初期設定のままデプロイ
- 表示される デプロイ名(通常はモデル名と同じ
gpt-6-luna)をメモ
なぜ gpt-6-luna なのか
モデル一覧には gpt-6-astra、gpt-6-sol、gpt-6-luna など、似た名前がたくさん並んでいて迷います。2026年11月時点の比較記事では、次のように位置づけられていました。
| モデル | 位置づけ | 価格の目安 |
|---|---|---|
| gpt-6-astra | 最上位。難しい作業向け | 高い |
| gpt-6.1-sol / gpt-6-sol | 中位。コーディングなど | Astra の約1/5 |
| gpt-6-luna | 最安。要約・抽出・分類など繰り返し作業向け | Sol の約1/20 |
議事録の要約・整形は、まさに「要約・抽出」にあたる作業です。無料クレジットを節約したいので、まず Luna で試し、出来が物足りなければ Sol に替えるのがおすすめです。モデルを替えるときは、スクリプトの環境変数(AZ_DEPLOYMENT)を変えるだけです。
モデルのラインナップは入れ替わりが早いです。名前が見つからない場合は、「チャットの完了」と書かれた軽量・低価格のモデルを選べば同じように動きます。また、アカウントの種類やリージョンによっては、デプロイに制限(割当て不足など)がかかる場合があります。その場合は別のリージョンやモデルを試してください。
手順6:PowerShell 7 を用意する
今回のスクリプトでは、音声ファイルを送るために PowerShell 7 以降の機能(-Form)を使います。Windows に最初から入っている「Windows PowerShell 5.1」では動かないので注意してください。
- Windows のスタートメニューで「PowerShell」と検索し、「PowerShell 7」があるか確認(名前に「7」とあれば OK)
- なければ、Windows のターミナルを開いて次を実行してインストール
winget install --id Microsoft.PowerShell
- インストール後、スタートメニューから「PowerShell 7」を起動
- 次のコマンドでバージョンを確認(
7.x.xと出れば OK)
$PSVersionTable.PSVersion
手順7:スクリプトを作る
作業用のフォルダ(例:C:\minutes)を作り、その中に minutes.ps1 という名前で次の内容を保存します。メモ帳でも作れます(保存時の文字コードは UTF-8)。
param(
[Parameter(Mandatory = $true)]
[string]$AudioPath,
[string]$OutDir = "."
)
$ErrorActionPreference = "Stop"
# ---------- 設定(環境変数から読み込む) ----------
$key = $env:AZ_KEY # Foundryリソースの「キー1」
$region = $env:AZ_REGION # 例: japaneast
$resource = $env:AZ_RESOURCE # 例: minutes-test-yourname(リソース名)
$deployment = $env:AZ_DEPLOYMENT # 例: gpt-6-luna(デプロイ名)
$required = [ordered]@{
AZ_KEY = $key
AZ_REGION = $region
AZ_RESOURCE = $resource
AZ_DEPLOYMENT = $deployment
}
foreach ($name in $required.Keys) {
if (-not $required[$name]) { throw "環境変数 $name が設定されていません" }
}
if (-not (Test-Path $AudioPath)) { throw "音声ファイルが見つかりません: $AudioPath" }
# ---------- ① 文字起こし(Azure Speech: Fast transcription) ----------
Write-Host "① 文字起こし中..."
$sttUri = "https://$region.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe?api-version=2025-10-15"
try {
$stt = Invoke-RestMethod -Uri $sttUri -Method Post `
-Headers @{ "Ocp-Apim-Subscription-Key" = $key } `
-Form @{
audio = Get-Item $AudioPath
definition = '{"locales":["ja-JP"]}'
}
} catch {
Write-Host "文字起こしでエラー: $($_.ErrorDetails.Message)" -ForegroundColor Red
throw
}
$transcript = $stt.combinedPhrases[0].text
if (-not $transcript) { throw "文字起こし結果が空でした。音声ファイルを確認してください" }
# ---------- ② 議事録に整形(Foundry上のGPTモデル) ----------
Write-Host "② 議事録を作成中..."
$systemPrompt = @"
あなたは議事録作成の専門アシスタントです。
以下は会議の音声を文字起こししたテキストです。次の形式のMarkdownで議事録を作成してください。
## 概要(3行以内)
## 議論の要点(箇条書き)
## 決定事項(箇条書き。なければ「なし」)
## ToDo(表形式: 担当者 / 内容 / 期限。不明な項目は「未定」)
## 未決事項・次回への持ち越し
ルール:
- 文字起こしに書かれていない内容は絶対に追加しない
- 担当者や期限が文字起こしから読み取れない場合は「未定」と書く
- 「えー」「あのー」などの言い淀みは取り除いてよい
"@
$body = @{
model = $deployment
messages = @(
@{ role = "system"; content = $systemPrompt },
@{ role = "user"; content = $transcript }
)
} | ConvertTo-Json -Depth 5
$chatUri = "https://$resource.openai.azure.com/openai/v1/chat/completions"
try {
$res = Invoke-RestMethod -Uri $chatUri -Method Post `
-Headers @{ "api-key" = $key } `
-ContentType "application/json; charset=utf-8" `
-Body ([Text.Encoding]::UTF8.GetBytes($body))
} catch {
Write-Host "議事録作成でエラー: $($_.ErrorDetails.Message)" -ForegroundColor Red
throw
}
$minutes = $res.choices[0].message.content
# ---------- ③ ファイルに保存 ----------
$transcript | Set-Content (Join-Path $OutDir "transcript.txt") -Encoding utf8
$minutes | Set-Content (Join-Path $OutDir "minutes.md") -Encoding utf8
Write-Host "完了: transcript.txt と minutes.md を保存しました" -ForegroundColor Green
スクリプトの解説(ざっくり)
| 部分 | やっていること |
|---|---|
| 設定 | キーなどをスクリプトに直書きせず、環境変数から読む(キーの流出防止) |
| ① 文字起こし | 音声ファイルを Azure AI Speech の Fast transcription API に送り、全文テキスト(combinedPhrases)を受け取る。言語は ja-JP(日本語) |
| ② 議事録整形 | 文字起こしを GPT モデルに渡し、決められた形式の議事録にしてもらう。「書かれていないことを足さない」 と指示しているのが大事なポイント |
| ③ 保存 | 文字起こしと議事録をファイルに保存 |
エンドポイント(送り先)の使い分けは次のとおりです。
- 文字起こし:
https://{リージョン}.api.cognitive.microsoft.com/speechtotext/transcriptions:transcribe - GPT:
https://{リソース名}.openai.azure.com/openai/v1/chat/completions(modelにはデプロイ名を入れる。v1 API ではapi-versionの指定は不要)
どちらも、Foundry リソースの同じキーで認証できます。
手順8:実行する
8-1. テスト用の音声を用意する
今回は、note で公開されている議事録練習用の音声「議事録練習音声(どこかのIT企業)」(さぴさん作)の、無料公開されているサンプル音声(約5分)を利用しました。
| 項目 | 内容 |
|---|---|
| 想定している会議 | IT企業の週次定例進捗会議 |
| 音声長 | 約5分 |
| 音声形式 | wav |
| 配布形態 | noteで公開 |
| 利用目的 | 議事録作成の練習用 |
音声や解答案の権利は元記事の著者にあります。この記事では音声ファイルや解答案そのものは掲載しません。利用条件については配布元の記載を確認してください。
- 配布元の記事(参考リンク参照)からサンプル音声をダウンロード
- ファイル名を
meeting.wavに変更 -
minutes.ps1と同じフォルダに配置
対応形式は WAV、MP3、OPUS/OGG、FLAC、WMA、AAC などです。
もしサンプル音声を利用しない場合は、次の文章をスマホやPCのレコーダーで録音して試すこともできます。
それでは定例会議を始めます。まず先月の売上報告です。売上は目標の95パーセントでした。次に新機能のリリース日ですが、12月10日で決定します。デザインの最終確認は田中さんが11月20日までに行ってください。テスト環境の準備は佐藤さんが来週金曜日までにお願いします。最後に、来月の出張の件は予算が未確定のため、次回に持ち越します。以上で終わります。
- 保存形式は mp3 か wav にしてください(Windows のサウンドレコーダーなら、設定で保存形式を変更できます。m4a は非対応の可能性があります)
- 対応形式は WAV、MP3、OPUS/OGG、FLAC、WMA、AAC などです
- ファイル名は
meeting.mp3として、minutes.ps1と同じフォルダに置きます
8-2. 環境変数をセットする
PowerShell 7 を起動し、作業フォルダに移動して、手順4・5でメモした値を入れます。
cd C:\minutes
$env:AZ_KEY = "手順4でコピーしたキー1"
$env:AZ_REGION = "japaneast"
$env:AZ_RESOURCE = "minutes-test-yourname"
$env:AZ_DEPLOYMENT = "gpt-6-luna"
この設定は、今開いている PowerShell のウィンドウの中だけで有効です。ウィンドウを閉じると消えるので、キーがパソコンに残りません。次回はまた入力し直します。
8-3. スクリプトを実行する
pwsh -ExecutionPolicy Bypass -File .\minutes.ps1 -AudioPath .\meeting.mp3
(-ExecutionPolicy Bypass は、このコマンドの間だけスクリプトの実行制限を回避する指定です。設定を恒久的に変える必要はありません。)
次のように表示されれば成功です。
① 文字起こし中...
② 議事録を作成中...
完了: transcript.txt と minutes.md を保存しました
実行結果の例
以下は説明用のイメージです。実際の出力は、モデルやタイミングで毎回少し変わります。
transcript.txt(文字起こし)
それでは定例会議を始めます。まず先月の売上報告です。売上は目標の95%でした。次に新機能のリリース日ですが、12月10日で決定します。…
minutes.md(議事録)
## 概要
定例会議。先月の売上報告、新機能のリリース日決定、各担当へのタスク割り当てを行った。
## 議論の要点
- 先月の売上は目標の95%だった
- 新機能のリリース日について検討した
- 来月の出張は予算が未確定
## 決定事項
- 新機能のリリース日は12月10日とする
## ToDo
| 担当者 | 内容 | 期限 |
|---|---|---|
| 田中 | デザインの最終確認 | 11月20日 |
| 佐藤 | テスト環境の準備 | 来週金曜日 |
## 未決事項・次回への持ち越し
- 来月の出張の件(予算が未確定のため次回に持ち越し)
minutes.md は Markdown 形式なので、VS Code などで開くと見やすく表示できます。
よくあるエラーと対処
| 症状 | 原因と対処 |
|---|---|
Invoke-RestMethod : パラメーター 'Form' が見つかりません |
PowerShell 5.1 で実行している。PowerShell 7 で実行する(手順6) |
401 / Access denied due to invalid subscription key
|
キーの貼り間違い、または AZ_REGION がリソースのリージョンと違う(キーは作成したリージョンでのみ有効) |
文字起こしで 404 や「リージョン非対応」系のエラー |
そのリージョンが Fast transcription 非対応の可能性。別リージョンでリソースを作り直す(手順3の注意を参照) |
議事録作成で 404 / DeploymentNotFound
|
AZ_DEPLOYMENT(デプロイ名)や AZ_RESOURCE(リソース名)が違う。Foundry ポータルの「デプロイ」一覧と、ポータルの「キーとエンドポイント」で再確認 |
429 |
短時間にリクエストしすぎ。少し待って再実行 |
| 日本語が文字化けする | スクリプトを UTF-8 で保存し直す |
| 文字起こし結果が空 | 音声が無音、または対応していない形式。mp3 / wav で録音し直す |
エラー時は、赤字で表示される 文字起こしでエラー: / 議事録作成でエラー: の後ろのメッセージに原因が書かれています。そこを読むのがいちばんの近道です。
後片付けと使いすぎ防止
試し終わったら、課金対象のリソースを残さないようにしましょう。
- 無料期間終了後も利用できるが、その場合は従量課金となる。ただし議事録用途なら月数百円〜数千円程度で運用できるケースが多い
-
リソースグループごと削除:Azure ポータルで
rg-minutes-testを開き、「リソース グループの削除」をクリック(確認のため名前の入力が求められます) - 予算アラートを設定:ポータルの「Cost Management」→「予算」で、たとえば月 500 円で通知が届くように設定しておくと安心です
- キーの管理:使い終わったキーは「キーの再生成」で無効化しておくとより安全です
精度を上げるコツ・次のステップ
まずは最小構成が動いたら、次のような拡張ができます。
- 用語の誤認識を減らす:Speech の「フレーズリスト」機能で、製品名・人名などの専門用語を登録する
- 誰が話したかを区別する:Fast transcription の話者分離(diarization)を使う
- 長時間の会議に対応する:文字起こしが長い場合は、分割して要約→統合する
-
モデルを上げる:議事録の出来が物足りなければ、デプロイ名を
gpt-6.1-solなどに替える(費用は上がります) - 自動配信:Azure Functions や Power Automate で、SharePoint 保存・Teams 投稿・メール送信につなぐ
- 本番運用:キーを使わない Microsoft Entra ID 認証(キーレス認証)に切り替える
AI が作った議事録は、必ず人が確認してから配布してください。 決定事項やToDoの担当者・期限を取り違えることがあります。「書かれていないことを足さない」というプロンプトで抑えられますが、ゼロにはなりません。
次回予告
今回は Azure の無料アカウントに付属する $200 クレジットを活用し、できるだけシンプルに議事録の自動生成を試しました。
一方で、
「無料期間が終わった後も、完全無料で議事録を作れないの?」
と思った方もいるかもしれません。
現在、Whisper 系の音声認識モデルとローカルで動作する LLM を組み合わせて、
- 音声ファイル → 文字起こし
- 議事録生成
- ToDo 抽出
までを完全無料で実現できるか検証しています。
うまくまとまったら、構築手順や精度、必要なPCスペックを含めて別記事として公開予定です。
まとめ
- 有料の Copilot を契約しなくても、Azure の無料アカウント($200 クレジット)の範囲で、音声から議事録を自動作成できる
- 必要なのは Foundry リソース1つ(文字起こし + GPT)と、PowerShell スクリプト1本
- 議事録整形のモデルは、安い
gpt-6-lunaから試すのがおすすめ - 試し終わったら リソースグループごと削除して、課金を残さない
この記事が、議事録作成の自動化を試す最初の一歩になれば幸いです。



