Notion ブログに AI 自動翻訳を追加した
私のブログは Notion でコンテンツを管理しています。普段の記事執筆、紹介文の修正、思い付きの記録は、すべて Notion 内で完結し、ウェブサイトがその内容を表示します。ブログに英語版と日本語版ができてから、メンテナンスする内容も増えた。中国語の記事を1本公開したら、2つの翻訳を用意しなければならない。数日後に中国語の一部を直したら、他の2言語も同期して修正するのを忘れてはいけない。もし一部の翻訳がすでに手作業で調整されていたら、更新時には気をつけて、その修正を上書きしないようにしなければならない。私は引き続き中国語で書きたいと思っている。同時に、他の言語のコンテンツももっと保守しやすくしたい。そこで、ブログに翻訳バックエンドを作った。(主に私が怠け者だからだ)
Notion から別の2言語へ
一連の流れは次のように理解できます。Notion から中国語の内容を読み取り、英語と日本語を生成し、訳文を保存してから、Web サイトに公開します。
Notion は今も私が中国語の原文を管理している場所であり、多言語対応のために同じ内容のページを二つ用意する必要はありません。翻訳は別途保存し、ウェブサイトがアクセス言語に応じて表示します。
翻訳範囲には記事以外の内容も含まれます:ホームページの紹介、作品、随想、旅程、そしてAboutページも、同じ管理画面で管理できます。
誰かが英語または日本語のページを開くと、ウェブサイトはあらかじめ用意された翻訳をそのまま表示します。翻訳作業は事前に完了しており、読者は AI がその場で生成するのを待つ必要はありません。
一連のプロセスは5つのステップに分けられます:
- Notion で中国語のコンテンツを公開または編集する。
- バックエンドで公開済みのコンテンツを読み取り、欠落している翻訳と変更された原文を確認します。
- モデルを呼び出し、英語と日本語の翻訳を生成します。
- 結果を検証し、完全な訳文とタスクの進捗を GitHub リポジトリに保存します。
- 翻訳が変更されると、Vercel のデプロイをトリガーして、ウェブサイトを更新します。
バックエンドが何が起きたのかを教えてくれた
これらのフローは最終的に1つの管理ページにまとめられます。
コンテンツの分類ごとに、英語と日本語のステータスを確認できます。未翻訳のもの、処理中のもの、完了したもの、原文の更新により再確認が必要なものです。失敗した場合でも、記録を確認して再送信できます。
必要に応じて、私は1つの記事の1つの言語だけを翻訳することもできれば、公開済みのすべてのコンテンツをすぐに確認することもできます。
また、自動チェックのスイッチも作り、毎時・毎日・毎週からチェックを選べるようにしました。時間になると、システムはまず内容に変化があるかどうかを判断し、その後翻訳が必要かどうかを決めます。変化がない場合は、既存の結果をそのまま保持します。
変更した箇所は、そこを更新する
最も直接的な方法は、中国語を修正するたびに、記事全体を再翻訳することです。しかしこれでは、変化のない内容を重複して処理することになるうえ、もともと満足していた表現が変わってしまう可能性もあります。
そこで、各段落のバージョンをシステムに記憶させています。
例えば、ある記事にすでに英語と日本語の翻訳があり、後から私が第2段落だけを修正しました。次回のチェック時に、システムはこの1か所の変更を検出し、他の段落を再利用して、翻訳が必要な部分だけを更新します。
2つの文書を照合するようなものだと考えてください。まずどこが変わったかを見つけ、次にその箇所を処理します。
本文以外にも、タイトル、要約、画像の説明もそれぞれチェックされます。変更のない内容については、再度AIにリクエストする必要はありません。
AI に文字の翻訳だけに専念させる
Notion の記事にはテキストだけでなく、見出しの階層、画像、リンク、リスト、コードも含まれます。記事全体を AI に自由に書き換えさせると、更新後のレイアウトや構造を保証するのは難しくなります。
私のやり方は、プログラムが記事の構造を管理し、翻訳が必要なテキストを抽出して AI に渡し、完了後に元の位置に戻すというものです。
例えば、文章の中にリンクが1つある場合、AI は読者に見えるリンク名を翻訳でき、リンク先のアドレスはそのまま保持されます。画像の位置や本文中のコードも、プログラムが保持する役割を担います。
こうすることで、翻訳時に記事の他の部分への影響を減らすことができます。もちろん、言い回しが自然かどうか、語調が適切かどうかは、依然として人が判断する必要があります。
翻訳が失敗した場合は、すでに完了した作業を保持してください
自動翻訳でも中断が起こることがあります。ネットワークがタイムアウトしたり、モデルサービスが一時的に利用できなくなったり、比較的長い記事では途中まで翻訳してからエラーになることもあります。
そのため、システムは各段落の処理が完了するたびに進捗を保存します。再度実行する際は、残りの部分から処理を続けられ、重複作業を減らせます。
進捗の保存と訳文の公開は別々に行われます。翻訳全体が完了し、処理中に中国語の原文に変更がないことが確認された場合にのみ、システムは外部に表示されるバージョンを更新します。
更新に失敗した場合、読者には引き続き前のバージョンの完全な翻訳が表示されます。バックエンドにはエラー記録が保持され、後で再試行できるようになります。
人が手直しした訳文は、読者の心に残るものでなければならない
AI が生成した内容は、出発点として使える。意味は正確でも、自分の表現したい語調とは思えない文もあるし、語によっては記事の文脈に合わせて調整する必要もある。
そのため、バックエンドでは段落ごとの対訳が提供されています。中国語を見ながら、対応する英語や日本語を修正できます。
手動で保存すると、この段落はロックされ、以降の自動翻訳では私の修正が保持されます。対応する中国語がさらに変更された場合、システムはそれを「手動レビュー待ち」とマークし、戻って対応するよう通知します。
こうして、自動翻訳は反復作業を担い、人手による調整も徐々に蓄積されていきます。
保存してから、ウェブサイトに公開します
訳文は最終的に GitHub リポジトリに保存されます。この個人ブログにとっては、これによって毎回の変更記録を確認でき、必要なら以前のバージョンに戻すこともできます。
実際の翻訳タスクは GitHub Actions によってバックグラウンドで実行されます。タスクが完了し、翻訳文の保存が成功した後、Vercel を介して再デプロイし、新しいバージョンがサイト上に表示されるようにします。
そのため、「翻訳」をクリックした後は、処理、保存、公開といういくつかのステップを順に経ることになります。バックエンドの役割の一つは、これらの状態を表示し、コンテンツがどこまで進んでいるのかを私に知らせることです。
このワークフローにはまだいくつかの制約があります:自動チェックの実行が遅れる可能性があり、翻訳更新後はデプロイの完了を待つ必要もあります。翻訳品質、とりわけトーンや微妙なニュアンスについては、依然として人が読んで確認する必要があります。
私にとって、この管理画面の最大の助けは、多言語のメンテナンスに再利用できる一連の流れができたことです。これからも Notion で中国語を書き、繰り返しの同期作業はプログラムに任せ、時間は内容そのものと、丁寧に推敲する価値のある文章に残せます。