テックブログ

エルカミーの技術ブログです

📝 Power Automateで議事録生成

はじめに

この記事では、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
💡
今回はテストが容易になる点で上のトリガーを使用していますが、実用性の点で考えた場合はSharePointPowerAppsなどのMicrosoft製品のトリガーを使用することが多いです。

ここからトリガーの編集について説明します。

まず、+入力の追加を選択します。

image block

次に、Numberを選択します。

image block

最後に、以下の入力欄に入力名その説明を書いてください。

image block
📌
備考

Microsoft ListsのレコードのIDは以下の赤枠の部分です。

image block

以上でトリガーの編集は終了です。

ファイルの取得とデータ加工

ファイルの取得とデータ加工では受け取ったIDのレコードの添付ファイルを取得します。また、今回はVTTファイルを想定しているので、議事録を生成する上で必要のない情報を取り除くようにデータを加工します。

ここからファイルの取得のフローについて説明します。

まず、先ほど編集したトリガーの下のをクリックして、アクションの追加を選択します。

image block

次に、出現したサイドバーの検索欄に「SharePoint」と入力し、SharePoint関連のアクションのさらに表示を選択します。

image block

SharePoint関連のアクションの一覧から項目の取得というアクションを探し、選択します。

image block

最後に、このアクションの編集をします。

image block
📝
入力項目
  1. サイトのアドレス

    Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)

  2. リスト名

    任意のリストの名前を選択します。

  3. ID

    ⚡を選択し、動的なコンテンツのフローを手動でトリガーするからIDを選択して、渡します。

    image block

続いて、上と同様の手順で添付ファイルの取得というアクションを追加します。

image block

このアクションの編集をします。

image block
📝
入力項目
  1. サイトのアドレス

    Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)

  2. リスト名

    任意のリストの名前を選択します。

  3. ID

    ⚡を選択し、動的なコンテンツの項目の取得からIDを選択して、渡します。

    image block

さらに続いて、上と同様の手順で添付ファイルのコンテンツの取得というアクションを追加します。

image block

このアクションの編集をします。

image block
📝
入力項目
  1. サイトのアドレス

    Microsoft Listsの任意のリストのURLから取得できるアドレスを例に従って入力します。(カスタム値の入力を選択して、入力してください。)

  2. リスト名

    任意のリストの名前を選択します。

  3. ID

    ⚡を選択し、動的なコンテンツの項目の取得からIDを選択して、渡します。

    image block
  4. ファイル識別子

    ⚡を選択し、動的なコンテンツの添付ファイルの取得からIdを選択して、渡します。(For eachという処理が自動的に加わりますが問題ありません)

    image block

💡
SharePoint関連のアクションについて

フローを動かすうえでは項目の取得というアクションは必要ありません。

しかし、このアクションがあることでトリガーに変更があった場合に、フローの編集が最小限で済みます。

ここからはデータ加工のフローについて説明します。

まず、アクションの追加を選択し、「変数」と検索し、変数関連のアクションのさらに表示を選択します。

image block

次に、変数を初期化するを選択します。

image block

最後に、このアクションの編集をします。

image block
📝
入力項目
  1. Name

    任意の変数名を入力します。今回は「加工済みデータ」としています。

  2. Type

    データ型をStringに指定します。

  3. Value

    fxf_xを選択し、下の赤枠に関数を入力します。

    image block

    入力する関数

    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キーの定義を行います。

📝
入力項目
  1. Name

    任意の変数名を入力します。今回は「OPENAI_API_KEY」としています。

  2. Type

    データ型をStringに指定します。

  3. Value

    OpenAIのAPIキーを入力します。

2つ目の変数では、GPT-4に投げるプロンプトの定義を行います。

📝
入力項目
  1. Name

    任意の変数名を入力します。今回は「プロンプト」としています。

  2. Type

    データ型をStringに指定します。

  3. Value

    プロンプトを入力します。

    今回使用したプロンプトは以下の通りです。

    以下のフォーマットに従って、会議の議事録を出力してください。項目ごとに詳細に箇条書きにしてください。    
    To Doに関しては、誰がいつまでに行うか記載してください。誰がいつまでに行うか明瞭でない場合は記載しなくて良いです。
     決定事項とTo Doを混同しないようにしてください。決定事項は会議で決まったアクションや方針で、To Doは取り組むべきタスクです。    
    議題については、議題をただ記載するだけでなく、議題の内容を詳細に記載してください。    
    出力する内容は必ず詳細な情報を含むようにしてください。    
    # フォーマット    
    ```    
    ## 議題    
    1.    
    2.    
    ## 決定事項    
    1.    
    2.    
    ## To Do    
    1.    
    2.    
    ## 会議の要約  
      
    ```    
    # 会議の内容    
    @{variables('加工済みデータ')}

    会議の内容は動的なコンテンツから変数加工済みデータを選択します。

    上の例の通りに「@{variables('加工済みデータ')}」と書き込んで動的なコンテンツを指定することも可能です。

    image block

次にHTTPリクエストを作成します。

アクションの追加を選択し、「HTTP」と検索し、HTTP関連のアクションのHTTPを選択します。

image block

このアクションの編集を行います。

image block
📝
入力項目
  1. URI

    リクエストURLを入力します。

    今回は「https://api.openai.com/v1/chat/completions」です。

  2. Method

    POSTを選択します。

  3. Header

    ヘッダーを入力します。

    キー
    Content-Type application/json
    Authorization Bearer @{variables('OPENAI_API_KEY')}

    Authorizationでは動的なコンテンツから変数OPENAI_API_KEYを選択します。

    上の例の通りに「@{variables('OPENAI_API_KEY')}」と書き込んで動的なコンテンツを指定することも可能です。

  4. Body

    リクエストボディを入力します。

    今回のリクエストボディは以下の通りです。

    {
      "model": "gpt-4-1106-preview",
      "messages": [
        {
          "role": "system",
          "content": "あなたは優秀な編集者です。"
        },
        {
          "role": "user",
          "content": @{variables('プロンプト')}
        }
      ]
    }

    では動的なコンテンツから変数OPENAI_API_KEYを選択します。

    上の例の通りに「@{variables('OPENAI_API_KEY')}」と書き込んで動的なコンテンツを指定することも可能です。

今回はBodyに関しては必須の項目のみ使用していますが、任意の項目でより詳細に仕様を指定することも可能です。詳しくはこちらをご覧ください。

💡
HTTPリクエストについて

今回は1回のHTTPリクエストで議事録を生成しましたが、長い会議の内容の議事録やよりクオリティの議事録を生成するために、複数のHTTPリクエストを活用する方法もあります。

以上でフローの作成は終了です!

最後に保存を押して、テストをします。

image block

手動を選択してテストを押します。

image block

任意のMicrosoft ListsのリストのレコードのIDを入力してフローの実行を押します。

image block

テスト終了後にログを確認できるので、HTTPアクションの出力を確認すると、議事録が生成されています。

今回使用した会議ファイルと生成された議事録は以下の通りです。

📄
会議(VTTファイル)
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リクエストを複数活用して長い文章に対応したクオリティの高い議事録を生成したりする方法もあります!

参考