Whisper、ChatGPT、Google DriveのAPIを使って議事録を自動生成してみた(part2: GoogleDrive API編)

今回はGoogleDrive APIを使って、Drive上のファイル操作を行う方法を1から説明していきます。
はじめに
全体の概要
この記事では以下の手順で説明していきます。すでに完了している部分については適宜スキップしてください。
1. Google Cloud Platformでのプロジェクトの作成
2. サービスアカウントの作成と権限の付与
3. pythonコードからのPyDrive2を使ったアクセス
Google Cloud Platformでのプロジェクトの作成
Google Cloud Platform (GCP)とは
Googleの提供するサービスに対してAPIなどを通じて、アクセスする際に使用するプラットフォームです。そして、GCPでは通常タスクごとにプロジェクトを分けます。
このプロジェクトは動かすアカウントのグループです。プロジェクトにアサインされたユーザーはGoogle Accountごとにアクセスすることができて、権限等もGoogle Account単位で割り振れます。加えてこの中にはサービスアカウントという、いわばbotのような存在を作ることができます。今回はまずこれを作った上で、その中で権限等の管理を行います。
プロジェクトの作成
1回もGCPを触ったことがない場合このような画面になると思います。プロジェクトの選択から新規プロジェクトの作成を選びます。
組織とプロジェクト名を決めて作成します。組織名についてはGoogle Accountが特定の組織のアカウントでない場合、「組織なし」となっているかと思います。組織についてはとりあえず、複数のプロジェクトを一括して管理しているものと思っておけばよく、組織なしを選択しても不都合はないと思います。
プロジェクトを作成したら、冒頭のページから作成したプロジェクトを選択してコンソール画面に入ります。
APIの有効化とクライアントIDの作成
APIの有効化
今回使用するAPIはGoogle Drive APIと呼ばれる無料で使えるAPIになります。サイドメニューからAPIとサービスを選択し、APIライブラリからGoogle Drive APIを検索して有効化しましょう。
クライアントIDの作成
APIの有効化が終わったらクライアントIDの作成に移ります。同じようにサイドメニューからIAMと管理に進みましょう。
まず、OAuth 同意画面の設定に進みます。
ここでは以下のステータスを編集できます。
- 公開ステータス:サービスとして公開する場合にここを編集します。今回はテストのままで構いません。
- ユーザーの種類:組織を選択した場合に限り内部が選択できます。個人利用の場合などは外部で構いません。今回は外部に設定します。
- テストユーザー:公開ステータスがテストである場合に編集します。ここに記述したメールアドレスのユーザーのGoogle Driveに認証を行った上で、アクセスできるようになります。
続いてクライアントIDを作成します。認証情報を作成の部分を選択した上でアプリケーションの種類はウェブアプリケーションを選びます。
Pythonコード側での実装
モジュールのimport
from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
このコードを実行するとブラウザが表示されて承認が求められます(私はGoogle Chromeを使用していますが、実態としてはリンクを開いているだけです。自動でうまくできない場合は標準出力に出てくるリンクを手動で開きましょう)。ここでGoogle Account側からアクセスを許可することで、Google Driveにアクセスできるようになります。注意点として選択するGoogle Accountは、登録したプロジェクトのステータスがテストである場合、テストユーザーとして登録したものである必要があります。
gauth.LocalWebserverAuth()
の部分をコメントアウトして追加の処理を加えることによって2回目以降の認証をスキップできますが、複数のユーザーが使用する場合には毎回認証を挟む方がセキュリティ上の観点から好ましいです。ファイルのダウンロード
以下ではfilenameという名前のファイルをdriveからYour path
にダウンロードしています。内部的にfile_idというものでアクセスすることになっているので欲しいファイル名のidをfile_idとして取得した上で、それを使ってf.GetContentFile(Your path)
で取り込みます。
import sys
def get_audio_file(drive, filename):
try:
file_id = drive.ListFile({"q": f'title = "{filename}"'}).GetList()[0]["id"]
f = drive.CreateFile({"id": file_id})
f.GetContentFile(Your path)
except IndexError:
print("Presented file does not exist in the Google Drive.\n")
sys.exit(1)
ファイルのアップロード
アップロードについてもほとんど変わりません。今回はGoogle Drive上に新しくできるファイルなのでfile_idの指定がなく、作ったファイルを
Upload()
で送信するイメージです。def send_minutes_drive(drive, output_file_path):
f = drive.CreateFile()
f.SetContentFile(output_file_path)
f.Upload()
終わりに
今回は議事録自動生成の過程で使用したGoogle Drive APIによるファイルの入出力についてご紹介しました。GCPには他にもたくさんのAPIがあるので同じように使ってみましょう。