Azure Cognitive ServicesのTranslatorでDocument Translationを使って論文をそのまま翻訳してみる

# Translator/Document Translation とは
Azure Cognitive Servicesにも翻訳機能のためのTranslatorが用意されています。昨日のBuild2021にてDocument TranslationというPowerPointやExcel,PDFなんかをそのまま翻訳できる機能がリリースされましたので早速使ってみることにしました。APIを介してCognitive Services側に指示を出していくので少し状況が掴みづらくて時間がかかりましたが無事に機能を試すことができたので共有まで。

# 使ってみる
Azure PortalからTranslatorのリソースを作成します。無料のプランでもDocument Translationは利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/10153afe-ea0a-3ce7-e252-f9e61cdad1ca.png)

利用方法としては以下のイメージです。予めAzure Blob Storageに翻訳したい文書を格納するSourceコンテナと、翻訳後の文書を出力するTargetコンテナを作成しておきます。
![Flow_6sec.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/12ca9a94-fe1d-e6cd-f1f6-b698a9fe631d.gif)

その状態で、POSTMAN等のHTTPクライアントからエンドポイントに対してPOSTリクエストを投げ、翻訳を開始させます。GETリクエストを投げると現在の翻訳状況が確認できます。この際エンドポイントとしてカスタムエンドポイントを利用するようにしてください。Azure Portalから確認できるエンドポイントではありません。リソース名を以下のURLに挿入して利用します。

```
https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.0-preview.1
```

リクエストの中身ですが、コンテナ内のすべてのファイルを翻訳したい場合は以下のようになります。コンテナは匿名アクセスを有効化せず、SASトークンで認証するようにしましょう。

```json:payload.json
{
    "inputs": [
        {
            "source": {
                "sourceUrl": "https://<STORAGE-NAME>.blob.core.windows.net/translatorsource?<SAS-TOKEN>"
            },
            "targets": [
                {
                    "targetUrl": "https://<STORAGE-NAME>.blob.core.windows.net/translatortarget?<SAS-TOKEN>",
                    "language": "ja"
                }
            ]
        }
    ]
}
```
SASトークンは認証情報付きのURLを発行して特定の期間アクセスを許可するものです。コンテナ上で右クリックすることで作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/cde3dbab-0617-3715-0622-7f1be4ed7d93.png)


それぞれの翻訳プロセスには`Operation-Location`が割り当てられます。これはPOSTリクエストのレスポンスヘッダーから確認できます。

```
https://<NAME-OF-YOUR-RESOURCE>.cognitiveservices.azure.com/translator/text/batch/v1.0-preview.1/batches/<OPERATION-LOCATION>
```

このURLに対してGETリクエストを投げるとそのプロセス単位で翻訳処理の状況を確認できます。`Operation-Location`を指定しない場合はリソースに紐づいているプロセス全てに関して状況が出力されます。

```json:response.json
    "value": [
        {
            "id": "cf72f27d-33a5-4a30-b9f5-67c0bc607982",
            "createdDateTimeUtc": "2021-05-28T01:28:55.0128022Z",
            "lastActionDateTimeUtc": "2021-05-28T01:28:57.1343876Z",
            "status": "Running",
            "summary": {
                "total": 4,
                "failed": 0,
                "success": 0,
                "inProgress": 4,
                "notYetStarted": 0,
                "cancelled": 0,
                "totalCharacterCharged": 0
            }
        }
```

翻訳に成功した場合、Targetコンテナの方に翻訳後のファイルが生成されます。Targetコンテナに同名ファイルが既に存在している場合Failedになるようなので注意が必要です(もしかしたら上書きのオプションもあるかも)。

その他ファイルサイズの制限もあるのでご注意ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/9b60a09f-9f1d-273c-eb3c-246f145edc6c.png)


# 結果
論文翻訳が丸ごと簡単に出来たら楽だと学生の頃思っていたのでCIDErの論文を翻訳してみました。

- 原文：英語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/5f793bf3-e26c-28ad-66d1-8d5fb711de4c.png)

- 翻訳：フランス語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/0395f6f6-d8b5-a76d-702b-89b79e8a6e32.png)

- 翻訳：日本語
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205918/b5d40ba8-e729-8202-6fc6-1b4f97045289.png)

若干のフォーマットずれはあるものの、全体の構造は残したまま翻訳できることが分かりました。もう少し精度が良くなればかなり実用性がありそうですね。

# おわりに
- GUIが用意されていないのでAPIとやり取りしながら翻訳を進めました。
- エラーが掴みづらく躓くことも多々ありましたが翻訳を実現できました。
- 翻訳の精度に関してはPowerPointはまだ発展途上という感じでした。

1つのファイルを同時に複数言語へ翻訳できたり、コンテナ内のファイルを丸ごと変換できたりするのが非常に効率的だと思いました。さらなる精度向上に期待です。

参考
https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/document-translation/get-started-with-document-translation?tabs=csharp