ほんやくコンニャクお味噌味を食べて論文を読もう！

# Abstract
ブラウザを使って論文を"Read online"で読む際に、DeepLによるページ翻訳もどきを行うツールを紹介する。このツールはChromeさえ入っていれば、会社などインストールに制限がある環境でも実行できる。

**[Github「TranslationGummyOmiso」](https://github.com/KYU49/TranslationGummyOmiso)**

に導入方法と使用方法を示してあるため、別途こちらも参考いただきたい。この記事は半分お遊びで執筆したため、技術的な内容に興味がない場合や、**使用のみを目的とする場合はGithubだけ読むことを強く推奨**する。

# Introduction
> ほんやくコンニャクお味噌味は「ドラえもん のび太の日本誕生」にて使用された、食べると未知の言語間でも会話が可能となるひみつ道具である。

......という話はここではおいておいて、このツールは2020年12月に[岩崎 修登](https://twitter.com/cabernet_rock) 氏が「[「ほん訳コンニャク」 を食べて 論文を読もう](https://qiita.com/cabernet_rock/items/670d5cd597bcd9f2ff3f)」内で紹介した[Translation-Gummy](https://github.com/iwasakishuto/Translation-Gummy)をオマージュして作成したツールである。岩崎氏は論文ページのURLやPDFファイルを投げることでDeepLやGoogle翻訳によって日本語訳したPDFファイルを出力するツール[Translation-Gummy](https://github.com/iwasakishuto/Translation-Gummy)を公開している。DeepL/Google翻訳の操作およびPDFの編集に用いるソフトウェアのインストールと、WindowsであればPython実行環境の構築が必要ではあるが、論文調査を効率化する画期的なツールである。

しばしば企業研究者が直面する課題として、ソフトウェアの任意のインストールが制限される問題がある。多くの場合、業務内で該当のソフトウェアを使用する旨を示し、申請を行う必要がある。さらに、セキュリティが厳しい場合ではそもそもインストールが認められない場合もある。このような制限環境においてプログラムを使用するためには、Windowsに標準搭載されているコマンドプロンプト、PowerShell、VBS、C#コンパイラ(csc.exe)であったり、ほとんどの場合にインストールされているOfficeのExcelやVBAを用いたりする代替手法で対応する必要がある。また、近年ではインターネットを使用する業務の増加に伴い、ブラウザとしてChromeがインストールされている場合もあり、JavaScriptを始めとするウェブベースのプログラムも代替手法として利用できるようになってきた。

慣れない分野の論文探索や日常的な情報収集においては、翻訳機能の利用が効率向上に重要であるが、企業研究者はその制限環境の問題から、原文のままで読むことや、Chromeに搭載されたGoogleページ翻訳機能の利用を強いられている。しかし、Google翻訳は論文文章の翻訳において必ずしも高い精度を発揮するとは限らず、翻訳精度に定評のある[DeepL翻訳](https://www.deepl.com/ja/translator)を利用したい場合も多い。DeepLはブラウザ上で翻訳を行うことができる利点がある一方、無料版ではページ翻訳に対応しておらず、文章ごとにコピペする必要がある。そこで、私は「[ほんやくコンニャクお味噌味](https://github.com/KYU49/TranslationGummyOmiso)」(Omiso)を開発し、Windowsに標準搭載されているソフトウェアとChromeだけを使用して、DeepLによるページ翻訳を実現した。

# Material and Method
Omisoの導入方法は[Github](https://github.com/KYU49/TranslationGummyOmiso)に示した。Omisoの実行には、Windows標準ツールとして、コマンドライン、PowerShellを使用し、別途Chromeのインストールを必要としている。論文ページの翻訳機能はFirefox、Chrome、Microsoft Edgeを用いて動作確認を行った。

# Results
Omisoの使用には事前にOmisoServerの起動が必要である。OmisoServer実行時にはコマンドプロンプトに"Translation Gummy Omiso server is running..."の文字が表示される(Fig. 1)。
![OmisoServer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396838/8ea6752e-9053-6a4e-eac8-e360039bb1bd.png)

**Fig. 1 OmisoServerの実行画面** 1行目, ダウンロード時にZone.Identifierが付加される場合があるため、削除; 2行目, StartOmisoServer.batによるOmisoServer.ps1の呼び出し; 3行目, サーバーの実行状態。エラー発生時にはこの画面が表示されない場合がある。

OmisoServerを起動した状態のままブラウザのブックマークレットからOmisoBookmarklet.jsの内容を実行すると、10 sほどでページ上部から段落ごとに翻訳が進行していく。DeepLへの負担を減らすため、ページのスクロールに応じて翻訳は適宜行われる。翻訳が終了した文章も右上の🔄をクリックすることで、翻訳前の文章と切り替えることができる。
まれにページに段落(HTMLのpタグ)が設定されていない場合においては、翻訳ができない場合がある。翻訳できない文章は🔄が表示されないようになっている。また、OmisoServerが起動していない場合は30 s後にエラーメッセージが表示される。

# Discussion
OmisoServerは「[PowerShellのHttpListnerによる簡易サーバーで複数リクエスト処理](https://qiita.com/Dr-KYU/items/43131413afa4b8ff66ea)」にて紹介した、PowerShell Scriptを用いた.NetのHttpListnerによるローカルサーバーである。このサーバーはChromeの標準機能であるHeadless Chrome(画面に表示されないままウェブページの実行が可能)を介してDeepLを開き、翻訳内容をJSONP形式で返却する。

DeepLのページはURLの末尾に[UTF-8 文字エンコーディング](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)した原文を添えて開くことで、入力内容をその場で翻訳する機能を有している。翻訳はページを開いた後、ブラウザ上で動的に実行されるため、httpリクエストでは内容を取得できない。そこで、前述のHeadless Chromeでページを開いた後、10 s待ってからブラウザ上に描画された翻訳後の文章を取得している。例えば、"This is a pen."を翻訳したい場合、`https://www.deepl.com/translator#en/ja/This%20is%20a%20pen.`を開くことで、DeepLによる翻訳を実行することができる。

ブラウザ側ではブックマークレットから、OmisoServerに翻訳したい内容を送る。この際、DeepLの負担を減らすため、下記のようなルールを設けている。

* 最初は上部5段落のみを翻訳
* マウスカーソルが段落に載せられた場合、その段落と次の段落を翻訳する
* 200文字以下の段落は段落とみなさない

また、論文のページ上でブックマークレットを実行しているため、論文のドメインとlocalhostが異なり、一般的な方法では情報の受け渡しができない。そのため、OmisoServerからのレスポンスはJSONP形式で受け取り、scriptタグをページに埋め込むことでcallbacck関数を実行している。この際、JSONP injectionの危険があるため、サーバーからのレスポンスには特定の文字の変換処理を行っている。

最後に、OmisoはPowerShellを用いたサーバーからHeadless Chromeを呼び出し、DeepLのページに翻訳をさせ、JSONPでブラウザに返す手法で論文ページのリアルタイム翻訳を実現した。論文を英語で読む技術は重要であるが、より多く、より手軽に読めるようにすることで、本業である研究に費やす時間を増やすことができると期待される。

# Acknowledgement
このツールは[Translation-Gummy](https://github.com/iwasakishuto/Translation-Gummy)に触発されて開発した。素晴らしいツールを考案した[岩崎 修登](https://twitter.com/cabernet_rock) 氏には感謝の意を表する。翻訳には[DeepL Translator (free)](https://www.deepl.com/ja/translator)を使用しており、高度な翻訳技術を提供しているTechCrunch社にも感謝を述べたい。また、本ツールは210912現在、利用規約に沿った形でDeepLを使用しているが、TechCrunch社からの要請や利用規約の変更があれば、事前告知なく公開を停止したり、仕様を変更したりする場合があることを承知いただきたい。DeepLのページレイアウトが変更された際には、私の意図なくHeadless Chromeでの翻訳後文章の取得ができなくなる可能性もある。