はじめに
この記事では、Microsoft Power Automateを使って議事録生成のフローを作成していきます。議事録の生成にはGPT-4を活用しています。
使ったもの
- Microsoft Power Automate
- Microsoft Lists
- OpenAIのAPI
事前準備
今回はMicrosoft Power Automateにファイルを送る手段としてMicsoft Listsのリストを使用するので、Microsoft Listsのリストを作成してください。
また、添付ファイルに議事録を作成したい会議のファイルをアップロードしてください。
本編
概要
Microsoft Power Automateで作成するフローの概要は以下のようになります。
graph LR 1.トリガー -->2.ファイルの取得とデータ加工 -->3.議事録の生成
トリガーでMicrosoft ListsのレコードのIDを渡して、そのIDのレコードの添付ファイルを取得し、その添付ファイル(会議の音声データ)をもとに議事録を生成します。
会議の音声データはMicrosoft Teamsの会議を文字起こししたもの(拡張子が.vttのファイル)を想定しています。
トリガー
トリガーではMicrosoft Power Automateのフローが開始される条件を設定します。
今回はフローを手動でトリガーするというトリガーを使用しました。
このトリガーを使用する理由としてはテストが容易になるからです。
![image block](/notion/bd20af3e-496e-4533-bfe2-23d3cb2c8f9e/Untitled.png)
ここからトリガーの編集について説明します。
まず、+入力の追加を選択します。
![image block](/notion/4cb8b607-1c82-434d-b791-ca996784e851/Untitled.png)
次に、Numberを選択します。
![image block](/notion/5ac30b51-262b-45c2-a9d0-2ddffbfa2add/Untitled.png)
最後に、以下の入力欄に入力名とその説明を書いてください。
![image block](/notion/280b9f80-1300-4ae0-a842-e16fc8fdca0a/Untitled.png)
Microsoft ListsのレコードのIDは以下の赤枠の部分です。
![image block](/notion/d845a184-5049-4779-8abc-9bffe12929e1/Untitled.png)
以上でトリガーの編集は終了です。
ファイルの取得とデータ加工
ファイルの取得とデータ加工では受け取ったIDのレコードの添付ファイルを取得します。また、今回はVTTファイルを想定しているので、議事録を生成する上で必要のない情報を取り除くようにデータを加工します。
ここからファイルの取得のフローについて説明します。
まず、先ほど編集したトリガーの下の+をクリックして、アクションの追加を選択します。
![image block](/notion/31ed0e9a-5bcc-41c5-8aec-8f493ef2eb1d/Untitled.png)
次に、出現したサイドバーの検索欄に「SharePoint」と入力し、SharePoint関連のアクションのさらに表示を選択します。
![image block](/notion/0552cb51-8058-433b-a738-a34936d20097/Untitled.png)
SharePoint関連のアクションの一覧から項目の取得というアクションを探し、選択します。
![image block](/notion/16456801-e6c8-4bd6-87fc-69d8bb585597/Untitled.png)
最後に、このアクションの編集をします。
![image block](/notion/a3127128-ced0-4990-b5c9-bd529edfe1a8/Untitled.png)
-
サイトのアドレス
Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)
-
リスト名
任意のリストの名前を選択します。
-
ID
⚡を選択し、動的なコンテンツのフローを手動でトリガーするからIDを選択して、渡します。
続いて、上と同様の手順で添付ファイルの取得というアクションを追加します。
![image block](/notion/7f04ffc0-508e-45b9-a283-5a40ce9b7015/Untitled.png)
このアクションの編集をします。
![image block](/notion/eaee475a-90fe-49c9-a706-87e2c02e6b0d/Untitled.png)
-
サイトのアドレス
Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)
-
リスト名
任意のリストの名前を選択します。
-
ID
⚡を選択し、動的なコンテンツの項目の取得からIDを選択して、渡します。
さらに続いて、上と同様の手順で添付ファイルのコンテンツの取得というアクションを追加します。
![image block](/notion/6a3fd602-d5ba-49d4-acb7-99b2926e203f/Untitled.png)
このアクションの編集をします。
![image block](/notion/23789458-9ce1-4132-ac6d-6ab832032219/Untitled.png)
-
サイトのアドレス
Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)
-
リスト名
任意のリストの名前を選択します。
-
ID
⚡を選択し、動的なコンテンツの項目の取得からIDを選択して、渡します。
-
ファイル識別子
⚡を選択し、動的なコンテンツの添付ファイルの取得からIdを選択して、渡します。(For eachという処理が自動的に加わりますが問題ありません)
フローを動かすうえでは項目の取得というアクションは必要ありません。
しかし、このアクションがあることでトリガーに変更があった場合に、フローの編集が最小限で済みます。
ここからはデータ加工のフローについて説明します。
まず、アクションの追加を選択し、「変数」と検索し、変数関連のアクションのさらに表示を選択します。
![image block](/notion/3da8bc68-e8f8-4400-866c-3df2c7ada49f/Untitled.png)
次に、変数を初期化するを選択します。
![image block](/notion/7f6a11d1-4df5-41c7-9e0c-eb804630c498/Untitled.png)
最後に、このアクションの編集をします。
![image block](/notion/67e6686b-48e6-4d41-88f6-13db4bc8cb21/Untitled.png)
-
Name
任意の変数名を入力します。今回は「加工済みデータ」としています。
-
Type
データ型をStringに指定します。
-
Value
を選択し、下の赤枠に関数を入力します。
入力する関数
replace(replace(replace(replace(replace(replace(replace(base64ToString(trim(body('添付ファイルのコンテンツの取得')[0]?['$content'])),'WEBVTT',''),' --> ',''),'<v',''),'</v>',''),':',''),'.',''),'>',': ')
この関数でVTTファイルに共通して含まれる余分な文字列をできるだけ取り除いています。
関数名 説明 trim 文字列の先頭と末尾の空白を削除する base64ToString base64にエンコードされた文字列をデコードする replace 指定された文字列を与えられた文字列で置き換える
そのほかのデータ加工手法として、Excel Onlineのアクションを用いて、Office Scriptを実行する手法があります!
この手法を用いるとMicrosoft Power Automateでは使えない正規表現を使ったデータ加工が可能になりますが、Microsoftのライセンスのアップグレードが必要になるので今回は使用しません。
議事録の生成
議事録の生成では、OpenAIのAPIにHTTPリクエストしてGPT-4を使って議事録を生成します。
ここから議事録の生成フローについて説明します。
まず、データ加工のフローでも使用した変数を初期化するというアクションを2つ作ります。
それぞれの役割と入力項目について説明します。
1つ目の変数では、OpenAIのAPIキーの定義を行います。
-
Name
任意の変数名を入力します。今回は「OPENAI_API_KEY」としています。
-
Type
データ型をStringに指定します。
-
Value
OpenAIのAPIキーを入力します。
2つ目の変数では、GPT-4に投げるプロンプトの定義を行います。
-
Name
任意の変数名を入力します。今回は「プロンプト」としています。
-
Type
データ型をStringに指定します。
-
Value
プロンプトを入力します。
今回使用したプロンプトは以下の通りです。
以下のフォーマットに従って、会議の議事録を出力してください。項目ごとに詳細に箇条書きにしてください。 To Doに関しては、誰がいつまでに行うか記載してください。誰がいつまでに行うか明瞭でない場合は記載しなくて良いです。 決定事項とTo Doを混同しないようにしてください。決定事項は会議で決まったアクションや方針で、To Doは取り組むべきタスクです。 議題については、議題をただ記載するだけでなく、議題の内容を詳細に記載してください。 出力する内容は必ず詳細な情報を含むようにしてください。 # フォーマット ``` ## 議題 1. 2. ## 決定事項 1. 2. ## To Do 1. 2. ## 会議の要約 ``` # 会議の内容 @{variables('加工済みデータ')}
会議の内容は動的なコンテンツから変数の加工済みデータを選択します。
上の例の通りに「@{variables('加工済みデータ')}」と書き込んで動的なコンテンツを指定することも可能です。
次にHTTPリクエストを作成します。
アクションの追加を選択し、「HTTP」と検索し、HTTP関連のアクションのHTTPを選択します。
![image block](/notion/e2414674-9190-47b7-a5fa-31654e2e589f/Untitled.png)
このアクションの編集を行います。
![image block](/notion/399cfba7-d50a-4098-a495-b2bbefaeab03/Untitled.png)
-
URI
リクエストURLを入力します。
-
Method
POSTを選択します。
-
Header
ヘッダーを入力します。
キー 値 Content-Type application/json Authorization Bearer @{variables('OPENAI_API_KEY')} Authorizationでは動的なコンテンツから変数のOPENAI_API_KEYを選択します。
上の例の通りに「@{variables('OPENAI_API_KEY')}」と書き込んで動的なコンテンツを指定することも可能です。
-
Body
リクエストボディを入力します。
今回のリクエストボディは以下の通りです。
{ "model": "gpt-4-1106-preview", "messages": [ { "role": "system", "content": "あなたは優秀な編集者です。" }, { "role": "user", "content": @{variables('プロンプト')} } ] }
では動的なコンテンツから変数のOPENAI_API_KEYを選択します。
上の例の通りに「@{variables('OPENAI_API_KEY')}」と書き込んで動的なコンテンツを指定することも可能です。
今回はBodyに関しては必須の項目のみ使用していますが、任意の項目でより詳細に仕様を指定することも可能です。詳しくはこちらをご覧ください。
今回は1回のHTTPリクエストで議事録を生成しましたが、長い会議の内容の議事録やよりクオリティの議事録を生成するために、複数のHTTPリクエストを活用する方法もあります。
以上でフローの作成は終了です!
最後に保存を押して、テストをします。
![image block](/notion/80effaf7-872d-4e03-adce-3671169e4e62/Untitled.png)
手動を選択してテストを押します。
![image block](/notion/4eb5b2fe-b353-4fc5-8bdc-dd634ecc1531/Untitled.png)
任意のMicrosoft ListsのリストのレコードのIDを入力してフローの実行を押します。
![image block](/notion/17a267b1-c7c2-4450-9aae-2499d6625bba/Untitled.png)
テスト終了後にログを確認できるので、HTTPアクションの出力を確認すると、議事録が生成されています。
今回使用した会議ファイルと生成された議事録は以下の通りです。
WEBVTT
00:00.000 --> 00:01.300
<v Aさん>今日の議題はリサイクルについてです。</v>
00:01.700 --> 00:02.000
<v Bさん>決定事項としてはプラスチックの再利用の促進が挙げられます。具体的には、会社で出たプラスチックごみをリサイクルできる工場に送ります。</v>
00:02.300 --> 00:03.000
<v Aさん>取り組むべきこととして、プラスチックごみの分別意識の向上とごみ箱の配置があげられます。</v>
## 議題
1. リサイクルについて
- リサイクルの重要性と環境への影響を考慮し、会社のプラスチックごみの取り扱い方法についての話し合い。
- プラスチックの再利用をどのように促進するか、既存の取り組みの改善点、新しい施策についての提案と議論。
## 決定事項
1. 会社で出たプラスチックごみを再利用促進のため、リサイクル可能な工場に送ることが決定された。
## To Do
1. Aさん: プラスチックごみの分別に関する社内意識向上キャンペーンの企画と実施を、次回会議までに準備する。
2. Bさん: リサイクルのためのごみ箱の選定と配置場所の決定を、1ヶ月以内に完了する。
## 会議の要約
本日の会議では、リサイクルに関する議論が行われ、特にプラスチックごみの再利用に重点を置いた話し合いがなされました。決定事項として、会社が発生させるプラスチックのごみを積極的にリサイクルするために、適切なリサイクル工場に送ることが決められました。さらに、今後のTo Doとしては、Aさんが分別の意識向上のためのキャンペーンを企画し、Bさんが必要なごみ箱の配置について取り組むことが課されました。
おわりに
この記事ではMicrosoft Power AutomateでOpenAIのAPIを活用して議事録を生成する方法を紹介しました。
今回は簡単なフローを作成し、手動でフローを動かしました。
より実用的にするにはPowerAppsと連携させたり、HTTPリクエストを複数活用して長い文章に対応したクオリティの高い議事録を生成したりする方法もあります!