【Ren’Py】機械翻訳に頼ってできるだけ楽に翻訳を行う

:::note info
2023年7月1日時点Ren'Py ver.7.6.0の初心者の覚書。
変なところやもっと効率的な部分があったら教えてください。
英語もわからないのでこのやり方で良い英訳ができたのかは今も分かっていません。
:::
この記事で目指す内容は以下です。
1. Ren’Pyで英語の翻訳ファイルを作りたい
2. 英訳作業にかける時間を短くしたい
3. 出力された文書と生成された言語のコピペの回数をなるべく減らしたい
4. 英訳の確認の手間をなるべく減らしたい
5. できるだけ間違いの少ない英文を目指したい

# 前提条件
* VSCodeを利用していること
* Windows環境であること（書いている人間がそれしかないので他の環境の確認ができない）
* ゲームのテキスト部分が完成していること
* 以下の記事の手順を実践できること
[Ren'Pyで制作したゲームをDeepL API x Pythonで自動翻訳する](https://qiita.com/salt_crab/items/755cc99f63ed87a98ff3) : DeepLの自動翻訳
[【備忘録】日本語未対応のゲームを自動翻訳して遊ぶ方法](http://guiltyjake.blog95.fc2.com/blog-entry-3934.html) : VNTranslater
[VS Code上でGrammarlyを使って英語ドキュメントの執筆に役立ててみる](https://qiita.com/simonritchie/items/f49943f08cd09b92f3f9) : Grammarlyプラグイン

# 翻訳作業の流れ
なるべく他人の力を借りて楽をするぞー！という気持ちで以下の作業を行います。
1. Ren’Pyで翻訳用のファイルを作成する
2. 翻訳ファイルの整形
3. DeepLAPIでの自動翻訳
4. 余計な翻訳のpass処理の追加
5. VNTranslaterとDeepLでの翻訳確認
6. Grammarlyプラグインでの文法確認

## 1.Ren’Pyで翻訳用のファイルを作成する
公式ドキュメントの[翻訳](https://www.renpy.org/doc/html/translation.html)を参考にしてください。
1. Launcherで「翻訳の生成」を押下する
1. 言語に「english」を設定する
2. 選択オプションで「翻訳を空の文字列で生成する」を選択する
3. 「翻訳の生成」を押下する

これでgame/tl/に英語用のファイルが生成されました。
[Ren'Pyで制作したゲームをDeepL API x Pythonで自動翻訳する](https://qiita.com/salt_crab/items/755cc99f63ed87a98ff3)ではcommon.rpyだけは「翻訳を空の文字列で生成する」を選択していない状態で作るのが推奨されていましたが、私もそれがオススメです。

## 2.翻訳ファイルの整形
以下の手順はDeepLの翻訳ミスを減らすための下準備です。
以降の作業はgame/tl/配下のscript.rpyとscreen.rpyに対して行います。
多分以下のようなコードがいっぱい出力されていると思います。
``` scree.rpy 
# game/script.rpy:20
translate english awakening_acfbd0e3:

    # mc "目が覚めると 真っ白な部屋にいた\n {w}ここはどこだろう"
    mc ""
```
DeepLAPIを使った翻訳は、コメントの` # mc "目が覚めると 真っ白な部屋にいた\n {w}ここはどこだろう"`の台詞を取得して翻訳を行うので、こちらのコメントを修正すると翻訳の結果も修正されます。

### 台詞中に含まれるタグの削除
台詞に含まれるタグ`\n`や`{w}`を削除します。
これらが含まれていると、DeepLの翻訳でエラーが出やすくなります。
一括置換で削除を行ってください。
``` diff_python 
# game/script.rpy:20
translate english awakening_acfbd0e3:

-    # mc "目が覚めると 真っ白な部屋にいた\n {w}ここはどこだろう"
+    # mc "目が覚めると 真っ白な部屋にいた ここはどこだろう"
    mc ""
```
こんな感じに修正されればOK

**※ここより下は手動と目視作業です。面倒な人はもうDeepLの翻訳作業に移っていいかもしれない。**

### 用語集を作る
DeepLやGrammarlyで期待通りの翻訳をしてほしい単語を設定するために、用語集をメモします。
後続の作業で生成されたテキストを読み返すことになるので、それらの作業と並行して行ってください。
csvかtsvで作ると良いそうです。
``` glossaries.csv
由里タイガ,Yuri Taiga
由里大河,Yuri Taiga
捜査官,Detective
オニユリ,tiger lily
華麗,brilliant
愉快,delightful
陽気,cheerful
賢者,wise
```
こんな感じ。
用語として登録しておくと良いな～と思った要素は以下です。
* 登場人物の名前
* 固有名詞（植物の名前や場所など）
* 作中で反復される台詞や単語(全く同じ台詞でもDeepLの機嫌によって返却される内容が変わるので、同じ台詞を言っていることをわかりやすくしたいという演出意図がある場合は追加した方が良い)

### 1文の区切りを分かりやすくする
文章の終わりをわかりやすくするために、句点が正しくついているか確認してください。
キャラクターの台詞の末尾などは句点が抜けがちです。
これを行った方が、DeepL側に正しい文章が認識されやすくなります。
 ``` diff_python 
# game/script.rpy:20
translate english awakening_acfbd0e3:

-    # mc "目が覚めると 真っ白な部屋にいた ここはどこだろう"
+    # mc "目が覚めると 真っ白な部屋にいた。 ここはどこだろう。"
    mc ""
```
こんな感じに修正されればOK

### 台詞が分断されている部分を合成する
人によっては台詞をまたいだ長めの一文があると思います。私のコードだと以下の感じです。
 ``` scree.rpy 
# game/script.rpy:744
translate english prosecution_e64d616f:

    # mc "逃げればいいと いう人だっていましたけど、"
    mc ""

# game/script.rpy:745
translate english prosecution_0a1afe5b:

    # mc "みんなあの人の 執着心を知らないんです。"
    mc ""

```
DeepLAPIに投げる際、これはそれぞれ別の一文として投げられてしまい、DeepL側が意味が取りにくくなったり人称がおかしくなったりする可能性が高いので、一文にまとめます。
 ``` diff_python 
# game/script.rpy:744
translate english prosecution_e64d616f:
-    # mc "逃げればいいと いう人だっていましたけど、"
+    # mc "逃げればいいと いう人だっていましたけど、みんなあの人の 執着心を知らないんです。"
    mc ""

# game/script.rpy:745
translate english prosecution_0a1afe5b:

    # mc "みんなあの人の 執着心を知らないんです。"
    mc ""

```
貼り付ける方のコメントは一応残しておきます。
ここに出力される英文は後ほどスキップする処理を追加するので、忘れそうな時はコメントの頭に★とか追加しておいてください。
`# ★mc "みんなあの人の 執着心を知らないんです。"`

以下の作業を追加した方が精度が上がるかもしれないが、私はこの作業はAPI翻訳の後に手動でやったのであくまで予想です。
* 主語や目的語が不明瞭な文章に加筆
`# mc "目が覚めると 真っ白な部屋にいた。 ここはどこだろう。"`
↓
`# mc "目が覚めると 私は 真っ白な部屋にいた。 ここはどこだろう。"`
* 慣用句の平易な言い換え
`# yurivo "あなたは 俺の手の到底届かない 高嶺の花なんです。"`
↓
`# yurivo "俺にとって、あなたは美しく気高い白百合なんです。"`

**翻訳ファイルに対する操作は以上で終わりです。お疲れ様でした！**

## 3.DeepLAPIでの自動翻訳
[Ren'Pyで制作したゲームをDeepL API x Pythonで自動翻訳する](https://qiita.com/salt_crab/items/755cc99f63ed87a98ff3)の記事を参考にして、DeepLAPIでの自動翻訳を行います。
その際に、**2.翻訳ファイルの整形**で作成した用語集を利用してください。
WindowsでPythonを使ったことがない人がいた場合は、途中のAPIを利用するコードが動かないかもしれないので、その際は以下の手順を実行してください。
[pipのインストール方法](https://qiita.com/suzuki_y/items/3261ffa9b67410803443)
[【Python】Requestsをインストールする方法 - 鎖プログラム](https://pg-chain.com/python-requests-install#:~:text=%E3%80%8CRequests%E3%80%8D%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%BB,%E3%82%AD%E3%83%BC%E3%82%92%E3%81%8A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)

 ``` diff_python 
# game/script.rpy:20
translate english awakening_acfbd0e3:

    # mc "目が覚めると 真っ白な部屋にいた。 ここはどこだろう。"
    mc "When I woke up, I was in a blank room. I wondered where I was."
 ```
上記のように英語が出力されていれば成功です。
私はscreen.rpyとscript.rpyで大体5000wordsくらいが10分程度で終わりました。

## 4. 余計な翻訳のpass処理の追加
2.翻訳ファイルの整形のうち、**台詞が分断されている文章を合成する**で不要になった台詞を以下のように修正します。
 ``` diff_python 
# game/script.rpy:745
translate english prosecution_0a1afe5b:

    # ★mc "みんなあの人の 執着心を知らないんです。"
-    mc "But no one knows my father's obsession."
+    # mc "But no one knows my father's obsession."
+    pass
 ```
上記のように`pass`を追加することで、不要な台詞をスキップできます。
出力されたキャラクターの台詞は削除しても大丈夫です。
日本語のコメントの方は、どの台詞をスキップしているのかの目印になるので残しました。
参考ドキュメントは翻訳の[より複雑な翻訳](https://ja.renpy.org/doc/html/translation.html#more-complex-translations)

## 5. VNTranslaterとDeepLでの翻訳確認
翻訳された内容を確認します。

### ゲームの設定を変更する
```diff_python  
+define config.default_language = "english" #言語設定を英語に変更

init python:
# define build.itch_project = "renpytom/test-project"
+    config.keymap['dismiss'].append('mousedown_5') #マウスのスクロールで表示行を戻せるように設定を追加
```
option.rpyに上記の処理を追加します。
場所は言語設定はinit python:(160行目くらい)より前、マウスの設定はinit python:の後でお願いします。
これでゲーム内の起動時の言語設定が先ほど作成した英訳ファイルを参照するように変更されました。
最後の追加はテストの英語の確認作業を楽にするために追加しました。
マウスを使わない人はコッチの方がいいかもしれない
`config.keymap['dismiss'].append('K_PAGEDOWN') `



### VNtranslaterで翻訳の確認をする
[【備忘録】日本語未対応のゲームを自動翻訳して遊ぶ方法](http://guiltyjake.blog95.fc2.com/blog-entry-3934.html)を参考にして、[VNTranslater](https://fazx.itch.io/visual-novel-translator)をインストールします。
VNTranslaterはRen’Py作品の画面に表示されている文字列を取得して、DeepL経由で翻訳してくれるツールです。
出力された英文をDeepLに張り付ける作業を代わりにやってくれるツールということです！
VNTranslaterはRen’Pyのランチャーのデバックモードでも利用できるので、こちらを使ってちゃんとDeepLの翻訳ができたか確認します。
手順としては以下です。
1. VNTranslaterを起動する
1. 翻訳を行ったプロジェクトを起動する
1. プロジェクトを起動した状態でCtrl+Rを押下する(修正を行ったときのリロード設定の起動
1. プロジェクトを起動した状態でCtrl＋alt＋Cを押下する(VNTranslaterが画面のキャプチャをできるようにする設定の起動
![screenshot0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/50b3ed4e-3186-14b2-8c2c-375309d79e11.png)
これでゲーム内の英語の確認ができます。
デバックでもしながらゲーム内の英語翻訳の確認をしてください。
改行やクリック待ち、ダイアログ内の文章の区切りなどの確認をここで行うと効率的かと思います。
DeepLの翻訳は割と揺れるので、私は3回くらい通しでやりました。

### 翻訳がおかしかった時
翻訳の誤りによる対応は以下です
* 自分で修正方法が分かる時（一人称や三人称や大文字小文字の誤りなど）
① tl/english/screen.rpyの該当の箇所を探し、英文を修正して保存する
② 再読み込みが走って修正された英文をVNTranslaterが正しく翻訳するか確認する
これで修正されるようであればOKです。そのまま作業を続けましょう。


* 翻訳が大幅におかしい時/修正方法がわからない時
**諦めてDeepLやGoogle翻訳を利用して手動でコピペなどをして修正しましょう。**
とりあえず私は以下の方法でなんとなく翻訳対応を行いました。
・主語述語目的語を正しく記述する
・平易な日本語に組み替える
・前後の台詞を追加して、DeepLに意図が伝わりやすくする
・文章が長い場合は2文以上に切り分ける
・重要度の低い副詞や形容詞を削除する
・出力された文章を[DeepLWrite](https://www.deepl.com/ja/write#en)に入れてみる
平易な文章を目指すとDeepLも拾ってくれる体感です。
ちゃんとできているのかはわからない。
## 6. Grammarlyプラグインでの文法確認
大体の翻訳が通るようになったら、最後に文法の細部確認です。
[Grammarly](https://app.grammarly.com/)は英文の文法ミスやスペルミスなどを検出してくれるツールです。
[VS Code上でGrammarlyを使って英語ドキュメントの執筆に役立ててみる](https://qiita.com/simonritchie/items/f49943f08cd09b92f3f9) を参考にして、Grammarlyプラグインのインストールとユーザー登録を行ってください。
ユーザー登録は行わなくていいかもしれないが、喋っているキャラクター名に毎回赤文字が出てどこがエラーなのか分かりにくいので登録することをお勧めします。
この際にも、**2.翻訳ファイルの整形**で作成した用語集を利用すると便利かと思います。
画面左下くらいにスコアが出ているので、80点くらいを目指すといいらしいです。ゲームの口語体テキストなので、私はそこへ見送りました。

上手くいくとこんな感じでエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487997/a429e994-9cc6-9a5c-654d-ec86368e700d.png)
クイックフィックスでDismissじゃない方を選択すればGrammarlyの指示通りの修正を、Dismissを選択するとGrammarlyの指示を無視できます。
赤いエラーが出なくなればひとまず完了です。

**以上で翻訳作業は終了です。お疲れ様でした。**

# まとめ
機械翻訳に頼ってできるだけ楽に翻訳を行うでした。
以上の流れだと、自分で作業する箇所は**2.翻訳ファイルの整形**と**5. VNTranslaterとDeepLでの翻訳確認**の大きな翻訳誤りがあった時だけまで減らすことが出来ました。
個人的には割と作業量を減らすことができたのではないかと思います。
**2.翻訳ファイルの整形**の作業が一番面倒ですが、そこを真面目にやれば**5. VNTranslaterとDeepLでの翻訳確認**の誤りが減るのでやる価値はあるのではないかと思います。
それはそれとして、一文ずつDeepLに張り付けて「へ～いろんな翻訳ができるんだな～」と確認する時間は嫌いではないのであとは個人の趣味です。