🤖

Deno + Gemini(Vertex AI)+ GitHub Actionsでドキュメントを自動翻訳するやつを作った

2024/12/16に公開

英語を読むのが辛かったので、公式ドキュメントをAIにまとめて翻訳させてみました。せっかくなので簡単に紹介しようと思います。

作ったものー

今回はPlasmoというブラウザ拡張を作るフレームワークのドキュメントを翻訳してみました。なおコードは勢いで書いたので最悪です。そのうちリファクタリングしたい。

↓公開したサイト
https://plasmo-ja-docs.vercel.app/

↓ドキュメントのリポジトリ
https://github.com/SuperSandyman/plasmo-ja-docs/

↓スクリプトのリポジトリ
https://github.com/SuperSandyman/translate-docs-script

作った理由

英語の公式ドキュメントを読むのが苦痛なので翻訳させてみました。いちいちDeepLとかにかけるのも面倒なので、AIにまとめて翻訳させることにしました。

使用技術

  • Deno
  • Vertex AI
  • Gemini 1.5 Flash
  • GitHub Actions

ほとんどの技術が使ったことのないものだったので、それなりに苦労しました。地味にGoogle Cloud周りが一番きつかった気がする。

仕組みを解説するよ

月2でGitHub Actionsを走らせて翻訳する感じです。スクリプトの流れとしては、

  1. GitHub APIで指定したリポジトリからデータを取得
  2. 前回のハッシュ値を使い差分検知
  3. 変更があったものだけをGeminiに投げて翻訳
  4. 翻訳結果を書き込んだら最新のハッシュ値を記録し終了

となります。

差分検知のところは、GitHub APIで得られたハッシュ値と、jsonファイルに記録された前回実行時のハッシュ値とを比較することで実装しています。これによりAPI使用量が削減され、お財布に優しくなります。AIは高級品なのでね。

const loadAndDetectDiffs = async ( repoFiles: FileInfo[], hashFilePath: string ) => {
	try {
		const hashData = await Deno.readTextFile(hashFilePath);
		const existingsHashes = JSON.parse(hashData);

		const changedFiles = repoFiles.filter((file) => {
			return existingsHashes[file.path] !== file.sha;
		})

		return changedFiles;
	} catch (error) {
		if (error instanceof Deno.errors.NotFound) {
			console.log("ハッシュファイルが見つかりませんでした。");
			return repoFiles;
		} else {
			console.error(error);
			Deno.exit(1);
		}
	}
}

躓いたところ

Google Cloudの認証の設定

GitHub ActionsでGoogle Cloudの認証の設定をするのにかなり苦戦しました。google-github-actions/authというやつですね。Direct Workload Identity Federation?というのが今の推奨らしいのですが、情報量が少なくて難しかったです。そもそもGoogle Cloudの権限とかの仕組みをあまり理解していないという...(大丈夫なのかそれ)

GitHub Actionsのシークレットの設定、権限の設定

なんかいつも権限で躓いてますね。シークレット、環境変数の設定、GitHub APIに必要なトークンの権限の設定のところで、かなり時間を費やしてしまいました。このあたりもしっかり理解したい。

Vertex AIの実装

これに関しては躓いたわけではないですが、Vertex AIのJavaScriptのSDKも情報量が少なかったですね。ほぼ公式ドキュメントしかありませんでした。

まとめ

こんな感じで、ドキュメントをAIに自動翻訳させてみました。公式ドキュメントを読む心理的なハードルが下がって最高です。少しでもこの記事やリポジトリの内容が参考になれば幸いです。それでは。

Discussion