WhisperとGPT-3のAPIを用いて会議音声とアジェンダから議事録を自動生成する

## 概要
以前から議事録を自動で生成できないかと考えていたところ、@sakasegawa さんがOpenAIのWhisperとGPT-3を用いて記事を投稿されていたため、業務にも適用できそうだと考え試してみた記事です。

https://qiita.com/sakasegawa/items/3855472a8566ea302a99

元の記事との違いは、文字起こし（Whisper）に関してローカルでモデルをキャッシュせず、OpenAIのAPIを利用している点です。そのため、ローカルに十分なストレージや推論実行環境（GPU等）がなくとも高速に結果が得られます。

実装したコードはGitHubに公開しています。ご自由にお使いください。

https://github.com/5enxia/gen-minutes-using-whisper-gpt/blob/main/main.ipynb

## 実行環境
- Macbook Pro M2 Max
- macOS Ventura 13.2.1
- Python 3.9.12

## コード解説

### モジュールのインストール
まず、pipでopenaiのパッケージをインストールします
```py
!pip3 install openai
```

### パラメータの指定
次に、OpenAIのAPIを利用するためのAPIキーとWhisperに与える音声ファイルのパスをセットします。
APIキーは[こちら](https://platform.openai.com/account/api-keys)から取得することができます。
音声ファイルは`mp3, mp4, mpeg, mpga, m4a, wav, webm`に対応しています。
```py
api_key = "" # OpenAIのAPIキー
audio_file_path = "" # 音声ファイルのパス
```

### モジュールのインポート&APIキーのセット
次にopenaiのモジュールをインポートし、`api_key`をセットします。
```py
import openai
openai.api_key = api_key
```

### Whisperで文字起こし
次に音声ファイルを読み込み、WhisperのAPIに文字起こしのリクエストを送信します。
そして結果を`transcript`に格納しています。

```py
with open(audio_file_path, "rb") as f:
    transcribe = openai.Audio.transcribe("whisper-1", f)
transcript = transcribe['text']
```

同時に、結果をJSONファイルに保存します。
```py
import json
with open(f'transcribe.json', 'w') as f:
    json.dump(transcribe, f, indent=4)
```

### プロンプトの準備
次に議事録作成の準備をします。
ここでは、出力させたい議事録のフォーマットを指定しています。
このフォーマットの指定の仕方によって生成される議事録が大きく変わるので、色々と試してみると面白いです。（いわゆるプロンプト芸）
```py
agenda_format = f"""
売上
- 先月
- 今月

アクション
- 今月
- 来月
"""
```

次にプロンプトのテンプレートを作成します。`{transcript}`には文字起こしが、`{agenda_format}`には上記の議事録フォーマットが入ります。
```py
prompt = f"""以下は、ある会議の文字起こしです。

{transcript}

この会議の議事録を作成してください。
フォーマットは以下の通りです。

{agenda_format}
"""
```

### GPTで議事録の生成
最後に上記で作成したプロンプトをOpenAIのGPTのAPIに送信します。
モデルは現在Completion提供されているなかでもっとも精度が高いとされている`text-davinci-003`を利用しています。
```py
response = openai.Completion.create(model="text-davinci-003", prompt=prompt, max_tokens=1024, temperature=1.0, top_p=1.0, frequency_penalty=0.02)
summary = response['choices'][0]['text']
```

`gpt-3.5-turbo`を用いたバージョン
```py
response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[ {"role": "user", "content": prompt}])
summary = response["choices"][0]["message"]["content"]
```

そして結果をテキストに保存します。
```py
# 結果を保存
with open(f'summary.txt', 'w') as f:
    f.write(summary)
```

## 使用したデータ
音声ファイルは、長さが5分ほどのスクラム朝会の音声データを利用しました。

## 結果
WhisperのAPIに上記の音声データを投げたところ、20秒ほどで文字起こしが完了しました。（参考として、ローカルのCPUでの推論には20分かかりました。）
また、GPT-3にプロンプトを投げたところ、10秒ほどで議事録の作成が完了しました。
※上記の結果はネットワーク環境等に影響されます

## 評価
主観的な評価になってしまいますが、文字起こしの精度はほぼ完璧、議事録の作成は下書きや補助として使えるなというレベルでした

## 今後
OpenAIはさらに大規模な言語モデルであるGPT-4をChatGPTを介して提供しており、[Waitlist](https://openai.com/waitlist/gpt-4-api)も設置されていることから、APIでの提供も間近ではないかと筆者は考えています。提供され次第、筆者もぜひとも利用し、精度を見てみたいと考えています。

## ※ChatGPTの機密情報の取り扱いについて
公式の[データ利用ポリシー](https://openai.com/policies/api-data-usage-policies
)やクラスメソッドさんがまとめられた[記事](https://dev.classmethod.jp/articles/openai-data-usage-policy/)にあるようにChatGPTは入力したプロンプトを学習データとして使用する可能性があります。対してAPIに関しては2023年03月に更新され、基本的に学習には利用されないとされています。
そのため、所属企業等で機密情報等の取り扱いに関して十分に留意する必要があります。
Panasonicさんはその点を踏まえAzure上のOpenAIを使って自前でチャット環境を用意しているようです。[記事](
https://news.panasonic.com/jp/topics/205071)