org-mode ドキュメントの翻訳ツール検討

Page content

私は org-mode を使って LuneScript のリファレンスを作成しています。

日本語のリファレンスを書くのも大変ですが、 それを英訳しようとすると気が遠くなります。

そこで機械翻訳を使う予定ですが、 .org ファイルをそのまま機械翻訳で処理すると、 コードブロックや org-mode の区切り記号まで変換され、 意図した結果を得られません。

そこで今回は、org-mode の機械翻訳をスムーズに行なえるツールを検討します。

構成

今回検討する org-mode 翻訳ツールは、以下の構成とします。

  • 入力

    • .org ファイル
  • 出力

    • 翻訳後の .org ファイル
  • 処理

    • .org ファイルの parse

      • <https://github.com/niklasfasching/go-org>
    • 機械翻訳

      • GCP の Cloud Translation API
      • <https://cloud.google.com/translate/docs/basic/translating-text?hl=ja>
    • 全体制御

      • LuneScript で自作

go-org

.org ファイルの parse には go-org を利用します。

go-org は、go で実装された .org ドキュメントの parser で、 hugo はこれを利用して .org ファイルを read しています。

LuneScript のリファレンスは、 hugo で構築しているので、 hugo で利用されているものと同じ parser を使えば、 問題なく parse 出来ると考えて選択しました。

GCP Cloud Translation API

翻訳には、GCP の Cloud Translation API を利用します。

幾つか機械翻訳サービスがありますが、自分がアカウントを持っていて、 無料で使えるのが GCP なのでこれを選択しています。

GCP の Cloud Translation API も一定量を越えれば有料になりますが、 今回使う程度であれば越えることはないでしょう。

ちなみに、1ヶ月間のリクエスト文字数が 500,000 文字までが無料となります。

<https://cloud.google.com/translate/pricing?hl=ja>

ここで言う 文字数 とは、以下によると

<https://cloud.google.com/translate/pricing?hl=ja#charged-characters>

バイト数ではなく、 日本語なら日本語の 1 つのキャラクタを 1 文字として扱うようです。 例えば多くの日本語は utf-8 で 1 文字 3 バイトですが、 1 文字が何バイトであっても 1 としてカウントされます。

<p>こんにちは</p> を翻訳対象として API に渡した場合、12 文字として扱われます。 これは、 HTML の <p></p> の 7 文字と こんにちは の 5 文字の合計です。

ちなみに、 LuneScript のリファレンスの .org ファイルは約 380KB です。 仮に全て utf-8 の日本語として考えると、約 126,000 文字となります。

実際には、 .org には翻訳対象外のサンプルコードが含まれ、 それを除外したデータを機械翻訳 API で処理させるため、 Cloud Translation API で翻訳する文字数は約 126,000 文字よりも 少なくなることが考えられます。

よって、 500,000 文字の無料枠を越えずに .org 全体に翻訳をかけるテストを数回実行できる計算になります。

開発ステップ

ツールの開発ステップとしては、以下を考えています。

  • go-org を使って .org ファイルを parse する。
  • parse した要素から翻訳する/しないを判別する。
  • 翻訳する要素をまとめて翻訳 API で翻訳する。
  • 翻訳した要素と、翻訳していない要素から .org を生成する

もちろん、 go-org, 翻訳 API の使い熟しが前段階にあります。

GCP Cloud Translation API

今回は Translation API の REST の v2 basic を利用します。

REST v2 basic を利用する場合、以下の注意が必要です。

  • 一度に翻訳できる文字列数は、 128 個まで
  • API の body のサイズは 200KB まで

上記の条件を満さない場合は、エラーとなります。

なお、エラーの場合は課金対象にならないようです。

GCP のライブラリを利用すると、 ライブラリ側がこの制限を満すように制御するため、 制限を意識する必要はありません。