Open1

[Node.js] オンライン会議の議事録を AiNote + Claude3.5 で自動作成する

nmakinmaki

本記事では、録画対応したオンライン会議における、AiNote と Claude を使った議事録の生成方法について記載します。

用意するもの

  • Google meet (録画が残せるツール)
  • ffmpeg
  • AWS アカウント(有料)
  • LINE WORKS AiNote(無料)

手順

  1. meet を使って録画する(.mp4形式のファイルが得られます)
  2. ffmpeg を使って、音声を .wav へ抽出する
  3. AiNote で .wav を解析する(.txt形式のファイルが得られます)
  4. AWS bedrock へ API リクエストする

ffmpeg による変換について

手順2において、mp4→wavの抽出変換を行います。
AiNoteはメジャーな音声コーデックに複数対応しているので、必須というわけではありません。

ffmpeg -i input.mp4 -vn -ac 1 -c:a pcm_s16le -ar 16000 -f wav output.wav

LINE WORKS AiNote について

もともとが CLOVER Note というβサービスで提供しており、2024年の11月から正式サービスになったようです。無料契約でやっていけるかはデータ量によりますが、2月13日時点でアカウント開始すると572分のデータを無料で解析できるようです。
pyannote.audiowhisper を組み合わせた自前変換と比較して、AiNote は圧倒的に速かったです。約1時間の音声データ解析にかかる時間を比較すると、数分(AiNote)vs一晩(自前変換)という格差でした。精度においては、あまり大きな違いがなさそうでした。

AWS bedrock について

https://aws.amazon.com/jp/bedrock/pricing/
価格としては Claude の公式と比較して、追加費用は特に発生しません。
https://www.anthropic.com/pricing#anthropic-api

現状は Claude を使用しておけば良いという印象ですが、色々な後発モデルを試せることも重要です。
後述のコードでは管理画面に表示される Inference profile IDmodelId に設定することによって、対象のモデルを簡単に切り替えることができます。

なお、Claudeが使用できるregionには、2024年8月以降で東京が追加されています。価格の差はなさそうでした。
後述のコードでは、以前から使用可能となっていたムンバイを選択しています。

Node.js 実行コード

プロンプトとテキストをそれぞれローカルファイルから読み込んで、出力ファイルを作成する想定のコードです。

const { BedrockRuntimeClient, InvokeModelCommand } = require("@aws-sdk/client-bedrock-runtime");
const fs = require('fs');

function summarizeText(promptTemplate, inputText) {
  // BedrockRuntime クライアントの初期化
  const client = new BedrockRuntimeClient({ region: "ap-south-1" });

  // プロンプトの作成
  const prompt = {
    anthropic_version: "bedrock-2023-05-31",
    max_tokens: 2000,
    messages: [{
      role: "user",
      content: `${promptTemplate}\n${inputText}`
    }]
  };

  // リクエストパラメータの設定
  const params = {
    // Inference profile ID
    modelId: "apac.anthropic.claude-3-5-sonnet-20240620-v1:0",
    contentType: "application/json",
    accept: "application/json",
    body: JSON.stringify(prompt)
  };

  // モデルの呼び出し
  const command = new InvokeModelCommand(params);
  return client.send(command).then(response => {
    console.log(response.body);
    const responseBody = JSON.parse(new TextDecoder().decode(response.body));
    return responseBody.content[0].text;
  }).catch(error => {
    console.error("API呼び出しエラー:", error);
    throw error;
  });
}

function main() {
  try {
   // ファイルの読み込み
   const promptTemplate = fs.readFileSync('./prompt_template.txt', 'utf8');
   const inputText = fs.readFileSync('./input_text.txt', 'utf8');
   // 要約の実行
   summarizeText(promptTemplate, inputText).then(summary => {
     // 結果の出力
     console.log("要約結果:");
     console.log(summary);
     // 結果をファイルに保存
     fs.writeFileSync('./summary_result.txt', summary, 'utf8');
     console.log("結果を summary_result.txt に保存しました");
   }).catch(error => {
     console.error("要約中にエラーが発生しました:", error);
   });
  } catch (error) {
      console.error("ファイル操作でエラーが発生しました:", error);
  }
}

main();

まとめ

オンライン会議の議事録化するためには、(映像→)音声→文字→要約という3〜4段階のプロセスが必要です。言葉に関してAIが強みを発揮できる時代においても、やることは減っていません。また、精度を確保するためには、ツールの選定や会議自体を客観的にわかりやすく進めることが欠かせません(特に後者の意識は、会議の存在意義を常に見直すことになるためおすすめです)。技術としてはまだまだ発展途上であることを認識したうえで、柔軟に変化できるような自動化を目指しておくと良いでしょう。