AI
2024/03/08
上田 裕大

Whisper、ChatGPT、Google DriveのAPIを使って議事録を自動生成してみた(part3: UIの作成 / Google Cloud Functionsを使用した実行)

前回までで作成した議事録を自動生成するコードを継続的に実行するために、Google Cloud Functionsを使用しました。今回はPub/Subを使ってシグナルを作成し、それをトリガーに実行することを考えます。本記事ではGoogle Cloud Functionsで動くための実装と手順について説明します。

はじめに

少し時間が空いてしまいましたが、議事録の自動生成アプリケーションのUI部分の実装を行なったので2回に分けてまとめさせていただきます。以前の記事をご覧になっていない方はぜひご覧ください(part1, part2, WhisperAPIについて)。

今回はGoogle Drive上の特定のフォルダに対してファイルをアップロードすると、それを検知して別のフォルダにアップロードするようなUIにしました。これによりユーザーはアップロードするだけで、議事録が自動生成されることになります。

システム全体の概要


これまでの実装でローカル環境で動くようなコードが作成できていたので、それをGoogle Driveにデータをアップロードしたタイミングで、Google Cloud Functionsを実行環境として動かすことを検討しました。Google Cloud FunctionsはPub/Subをトリガーとして使用することができるので、Pub/Subに対してアップロード時にシグナルを送るような機構を作成しようと思い至りました。

一方で、問題となったのはPub/Subに送るメッセージをどのように設定するかでした。Google Drive APIにはファイルがアップロードされたタイミングでシグナルを送るような機構がないようで、また、Pub/Subを定期実行するのはその度費用がかかり無駄が多いです。

そこで、今回は無料で実行することができるGoogle Apps Script(GAS)を定期実行することで監視を行い、更新があったタイミングでPub/Subにメッセージを送ってGoogle Cloud Functionsを実行するという形をとりました。

Google Cloud ConsoleからGoogle Cloud Functions作成

Google Cloud Functionsとは


シンプルに言えば、特定の関数(functions)を実行するためだけのマシンをGoogle側が自動的に割り当てて、自分でインスタンスを立てる等をしなくても、その関数をクラウド上で実行できる仕組みです。今回のケースのようにバックグラウンド的に実行したい関数があるが、それが限定的であるような場合に特に有用です。

Google Cloud Functionsは、実行するためのトリガーとして今回使用するPub/Subの他にもHTTPリクエストなども使用できるため、用途に合わせて決めましょう。今回はPub/Subを使用する場合に限って説明していきます。

Google Cloud Functions作成方法


Google Cloud Console上でGoogle Cloud Functionsと検索していくと、このような既存の functionsが並んだ画面になるかと思います。まずは、図の赤色の部分から作成していきます。


それぞれ情報を入れて「次へ」を押します。今回はトリガーのタイプとしてPub/Subを使用します。既存のPub/Subトピックを使用する場合はそれを選択し、新規で作成する場合は「トピックを作成する」から作成しましょう。

また、ここでは詳しく説明しませんが、冒頭にある世代とはGoogle Cloud Functionsそのものの世代であり、第2世代は特にCloud Runと呼ばれることもあるなど相違点が多くあります。自分の状況に合わせて選びましょう。環境変数についてもここで併せて設定することができ、コード内で使用できます。


なお、第2世代を選んでトリガーとしてPub/Subを選択すると、以下のような権限エラーが出ることがあります。これは世代間の必要な権限の差で生じるものなので、権限を付与してあげましょう。


最後にコードを記述します。直接編集する方法とファイルやサービスから読み込む方法があるので都合の良い方を使用してください。ランタイムはこの関数で使用する言語やバージョンに応じて決め、エントリポイントはこのコードの中に含まれている関数のうち最初に実行される関数名を書いてください。また、使用する別途インストールが必要なパッケージについてはpackage.jsonやrequirements.txtのような用意されたファイルにまとめて記述しましょう。

編集が完了したらデプロイをします。

コーディングにおける注意点

実装の大部分はこれまでのブログ記事のものを修正したものなので、ここではPub/Subメッセージをトリガーとしたcloud functionsで実行するために修正した部分について触れます。

まず、エントリポイントとなる関数の引数についてです。これはあらかじめ決められていて、eventとcontextを取りましょう。pythonをランタイムとして使用する場合には、eventの中の”data”という要素にPub/Subで受け取ったメッセージが入っているので、これをデコードして使いましょう。


def main(event, context):
if "data" in event:
# Pub/Subメッセージの解析
message_data = base64.b64decode(event["data"]).decode("utf-8")
file_ids = json.loads(message_data)



また、Google Cloud Functionsの中で書き込み可能なファイルシステムは/tmp以下のみです。逆に言えば、/tmp以下にデータを格納することは可能なので、効率的に使用しましょう。

終わりに

今回はローカルで実装したPythonコードをGoogle Cloud Functionsに移植して、Pub/Subメッセージをトリガーとして実行する方法をご紹介しました。ここまでで、Pub/Subメッセージを生成する仕組みをつくりさえすれば、それを受け取ってPythonコードを動かすことができます。

次回はGASを使ってPub/Subメッセージを生成する部分について説明します。

New call-to-action