呪文工房(日本語からNovelAIのタグを作るWebツール)の連載記事です。
この記事では、全体の構成と、手元から本番へ出すまでの手順、外部の翻訳の使い方を書きます。
なお、コードの多くはClaude Code(AIのコーディングツール)に書かせています。
全体の構成
ブラウザ ──┬─ 画面(Astroで先に作ったHTML・CSS・JS)
└─ /api/translate ─ Cloudflare Workers(1つ)
├─ D1(辞書。同じものを2つ持ち、どちらを使うかはKV=設定値の置き場に書く)
├─ Workers AI+Vectorize(意味の近さ)
├─ Google Cloud Translation(辞書に無い語だけ)
└─ Analytics Engine(辞書に無かった語の回数)
自宅サーバー ─ 毎月の辞書づくり(材料の取得 → 辞書の生成 → 評価 → 控えのD1へ → 切り替え)
└─ 10分ごとの見張り(トップと翻訳。止まったらスマホへ)
画面とAPIはどちらも1つのWorkerから配っています。
ページはAstroで先に作り、Workerの静的アセット(Workerがそのまま配るファイル)として置いています。
フレームワークは使わず、画面の動きは素のTypeScriptで書いています。
使っているパッケージ
npmで足したのはastroとwranglerとtypescriptだけです。
テストはNodeのnode --testで書いています。
TypeScriptのファイルをそのまま実行できるので、テストのために態々ビルドを挟まなくて済むのが楽だろう。
という判断です。
辞書を作るスクリプトはPythonで、こちらも標準ライブラリだけで書いています。
手元から本番まで
変更したら、npm run checkで型の検査・テスト・ビルド・出力の検査をまとめて回します。
通ったらnpm run deployで、もう一度検査してからwrangler deployし、その日に更新したページだけを検索エンジンに知らせています(IndexNow)。
mainへのpushでは本番は変わらず、デプロイは手元のコマンドで行っています。
辞書づくりは自宅サーバー
辞書の材料の取得と集計は時間がかかるので、自宅のサーバーで回しています。
Danbooruの取得は1秒に1回までにしていて、これだけで25分ほどかかります。
毎月2日の朝に、自宅サーバーの決まった時刻の処理が辞書を作り直して本番に入れ替えます。
入れ替えの中身は「品質維持の設計(No.04)」で説明する予定です。
機械翻訳
辞書にも無い語だけは機械翻訳に回しています。
パソコン版のChromeとEdgeにはブラウザ内蔵の翻訳があるので、使える端末では辞書で見つからなかった行をブラウザで訳して、英語だけをサーバーに送り直しています。
async function builtinTranslator() {
const T = globalThis.Translator;
if (!T) return null; // スマホなど。サーバー側の機械翻訳に回す
const a = await T.availability({ sourceLanguage: 'ja', targetLanguage: 'en' });
if (a === 'unavailable') return null;
return T.create({ sourceLanguage: 'ja', targetLanguage: 'en' });
}
それ以外の端末はWorkerからGoogle Cloud Translationを呼んでいて、訳はその場で使うだけで辞書には貯めていません。
出力を使って同社のモデルの代わりを作ることを禁じる条項が規約にあって、訳を辞書に貯めていくのはそれに近いと判断したためです。
辞書に無かった語の記録
辞書で見つからなかった語は、語句と回数だけをWorkers Analytics Engine(Cloudflareのアクセス集計の仕組み)に記録しています。
IPは残さず、数字やURLを含む行も残さないようにしています。
よく出る語から辞書に足していくつもりです。
費用
| 項目 | 月額の目安 |
|---|---|
| Workersの有料プラン | 5ドル(Vectorizeに20万件置くため) |
| Vectorize(20万件) | 1.65ドルくらい(料金表からの試算。検索と保存の合計) |
| Workers AI(bge-m3) | 無料枠に収まる見込み |
| Google Cloud Translation | 月50万字まで無料 |
Vectorizeは保存した件数がそのまま毎月の費用になるので、投稿数の多い上位のタグで止めています。
一方で、見通しが立てにくいのは機械翻訳の費用です。
辞書で引ける割合が上がるほど安くなるので、辞書に無かった語を記録しているのは、半分は費用を抑えるためでもあります。
連載
- サービス概要(No.01)
- 辞書とSQLの実装・設計思想(No.02)
- 開発の進め方と構成(No.03)(この記事)
- 品質維持の設計(No.04)
呪文工房について
日本語の語句を1行ずつ書くと、NovelAIで使える英語のタグに変換するWebツールです。
強弱は「+」「-」で付けられ、倍率が数字で表示されます。
キャラごとの欄、トークン数の表示、1語だけ違うプロンプトの作成にも対応しています。
無料で、登録は不要です。
呪文工房はこちら→ https://jumon-koubou.com/