😀
Translate-shellを無限に動かして遊ぶ
はじめに
- Translate-shellというものがある。
- これは
trans
コマンドとしてCLI上で翻訳を行うことができるすごいコマンドである。 - また翻訳はデフォルトでGoogle Translate API(Bing Translator, Yandex.TranslateやApertiumも使用可能)を叩いて行っている。
- 主な処理系がAWKで実装されているというのも良い。
- しかし使っているうちに、いくらかすると結果が帰ってこなくなることがあるのに気づいた。
- 具体的に言うと、連続して大量の文章翻訳を試み、API制限に引っかかった時だった。(この記事内)
- 他の記事やサイトには回避方法が見当たらなかったのでその方法含め記事にした。
- この記事では、
trans
コマンドの使用方法と、この制限される問題を解消する方法を紹介する。 - なお、音声読み上げ機能(
-p
,-sp
)やGoogle API以外での翻訳(-e ENGINE
)については割愛する。
簡単な使用例
- 以下を踏まえれば
trans
コマンドの主な使用法は理解できる。 - 公式の使用例はこちら(英語)。
インストール
- まずインストールしよう。
Terminal
$ brew install translate-shell # か
$ apt-get install translate-shell # でインストール
Help
<details><summary>trans -hの出力(英語)
</summary><div>
Terminal
$ trans -h|sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
Usage: trans [OPTIONS] [SOURCES]:[TARGETS] [TEXT]...
Information options:
-V, -version
Print version and exit.
-H, -help
Print help message and exit.
-M, -man
Show man page and exit.
-T, -reference
Print reference table of languages and exit.
-R, -reference-english
Print reference table of languages (in English names) and exit.
-L CODES, -list CODES
Print details of languages and exit.
-S, -list-engines
List available translation engines and exit.
-U, -upgrade
Check for upgrade of this program.
Translator options:
-e ENGINE, -engine ENGINE
Specify the translation engine to use.
Display options:
-verbose
Verbose mode. (default)
-b, -brief
Brief mode.
-d, -dictionary
Dictionary mode.
-identify
Language identification.
-show-original Y/n
Show original text or not.
-show-original-phonetics Y/n
Show phonetic notation of original text or not.
-show-translation Y/n
Show translation or not.
-show-translation-phonetics Y/n
Show phonetic notation of translation or not.
-show-prompt-message Y/n
Show prompt message or not.
-show-languages Y/n
Show source and target languages or not.
-show-original-dictionary y/N
Show dictionary entry of original text or not.
-show-dictionary Y/n
Show dictionary entry of translation or not.
-show-alternatives Y/n
Show alternative translations or not.
-w NUM, -width NUM
Specify the screen width for padding.
-indent NUM
Specify the size of indent (number of spaces).
-theme FILENAME
Specify the theme to use.
-no-theme
Do not use any other theme than default.
-no-ansi
Do not use ANSI escape codes.
-no-autocorrect
Do not autocorrect. (if defaulted by the translation engine)
-no-bidi
Do not convert bidirectional texts.
-bidi
Always convert bidirectional texts.
-no-warn
Do not write warning messages to stderr.
-dump
Print raw API response instead.
Audio options:
-p, -play
Listen to the translation.
-speak
Listen to the original text.
-n VOICE, -narrator VOICE
Specify the narrator, and listen to the translation.
-player PROGRAM
Specify the audio player to use, and listen to the translation.
-no-play
Do not listen to the translation.
-no-translate
Do not translate anything when using -speak.
-download-audio
Download the audio to the current directory.
-download-audio-as FILENAME
Download the audio to the specified file.
Terminal paging and browsing options:
-v, -view
View the translation in a terminal pager.
-pager PROGRAM
Specify the terminal pager to use, and view the translation.
-no-view, -no-pager
Do not view the translation in a terminal pager.
-browser PROGRAM
Specify the web browser to use.
-no-browser
Do not open the web browser.
Networking options:
-x HOST:PORT, -proxy HOST:PORT
Use HTTP proxy on given port.
-u STRING, -user-agent STRING
Specify the User-Agent to identify as.
-4, -ipv4, -inet4-only
Connect only to IPv4 addresses.
-6, -ipv6, -inet6-only
Connect only to IPv6 addresses.
Interactive shell options:
-I, -interactive, -shell
Start an interactive shell.
-E, -emacs
Start the GNU Emacs front-end for an interactive shell.
-no-rlwrap
Do not invoke rlwrap when starting an interactive shell.
I/O options:
-i FILENAME, -input FILENAME
Specify the input file.
-o FILENAME, -output FILENAME
Specify the output file.
Language preference options:
-l CODE, -hl CODE, -lang CODE
Specify your home language.
-s CODES, -sl CODES, -source CODES, -from CODES
Specify the source language(s), joined by '+'.
-t CODES, -tl CODES, -target CODES, -to CODES
Specify the target language(s), joined by '+'.
Text preprocessing options:
-j, -join-sentence
Treat all arguments as one single sentence.
Other options:
-no-init
Do not load any initialization script.
See the man page trans(1) for more information.
</div></details>
Helpの翻訳
※一部オプション名までもが翻訳されているがそこはご愛嬌…
<details><summary>trans -h
の出力をtrans
で翻訳する</summary><div>
Terminal
$ sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" <(trans -h) \
| trans en:ja -b \
| awk 'NR%2==0{print$0};NR%2==1{print" "$0}'
使用法:trans [OPTIONS] [SOURCES]:[TARGETS] [TEXT] ...
情報オプション:
-V、-version
バージョンを出力して終了します。
-H、-help
ヘルプメッセージを出力して終了します。
-M、-man
マニュアルページを表示して終了します。
-T、-reference
言語の参照表を印刷して終了します。
-R、-reference-english
言語の参照表(英語名)を出力して終了します。
-Lコード、-listコード
言語の詳細を印刷して終了します。
-S、-list-engines
利用可能な翻訳エンジンを一覧表示して終了します。
-U、-upgrade
このプログラムのアップグレードを確認してください。
翻訳者オプション:
-eエンジン、-engineエンジン
使用する翻訳エンジンを指定します。
表示オプション:
-冗長
詳細モード。 (デフォルト)
-b、-brief
簡易モード。
-d、-dictionary
辞書モード。
-識別する
言語識別。
-show-original Y / n
元のテキストを表示するかどうか。
-show-original-phonetics Y / n
元のテキストの音声表記を表示するかどうか。
-show-translation Y / n
翻訳を表示するかどうか。
-show-translation-phonetics Y / n
翻訳の音声表記を表示するかどうか。
-show-prompt-message Y / n
プロンプトメッセージを表示するかどうか。
-show-languages Y / n
ソース言語とターゲット言語を表示するかどうか。
-show-original-dictionary y / N
元のテキストの辞書エントリを表示するかどうか。
-show-dictionary Y / n
翻訳の辞書エントリを表示するかどうか。
-show-alternatives Y / n
別の翻訳を表示するかどうか。
-w NUM、-width NUM
パディングの画面幅を指定します。
-インデントNUMBER
インデントのサイズ(スペースの数)を指定します。
-テーマFILENAME
使用するテーマを指定します。
-テーマなし
デフォルト以外のテーマは使用しないでください。
-no-ansi
ANSIエスケープコードを使用しないでください。
-自動修正なし
自動修正しないでください。 (翻訳エンジンによってデフォルト設定されている場合)
-のびび
双方向テキストを変換しないでください。
-bidi
常に双方向テキストを変換します。
-警告なし
警告メッセージをstderrに書き込まないでください。
-投げ捨てる
代わりに生のAPI応答を出力します。
音声オプション:
-p、-play
翻訳を聞いてください。
-話す
元のテキストを聞いてください。
-n VOICE、-narrator VOICE
ナレーターを指定し、翻訳を聞きます。
-playerプログラム
使用するオーディオプレーヤーを指定し、翻訳を聞きます。
-遊びません
翻訳を聞かないでください。
-翻訳なし
-speakを使用するときは何も翻訳しないでください。
-ダウンロード-オーディオ
オーディオを現在のディレクトリにダウンロードします。
-download-audio-as FILENAME
指定されたファイルに音声をダウンロードします。
端末のページングとブラウジングのオプション:
-v、-view
ターミナルページャーで翻訳を表示します。
-ポケットベルプログラム
使用するターミナルページャーを指定し、翻訳を表示します。
-no-view、-no-pager
ターミナルページャーで翻訳を表示しないでください。
-ブラウザプログラム
使用するWebブラウザーを指定します。
-ブラウザなし
Webブラウザーを開かないでください。
ネットワークオプション:
-x HOST:PORT、-proxy HOST:PORT
指定されたポートでHTTPプロキシを使用します。
-u STRING、-user-agent STRING
識別するユーザーエージェントを指定します。
-4、-ipv4、-inet4-only
IPv4アドレスのみに接続します。
-6、-ipv6、-inet6-onlyのみ
IPv6アドレスのみに接続します。
対話型シェルオプション:
-I、-interactive、-shell
対話型シェルを開始します。
-E、-emacs
対話型シェルのGNU Emacsフロントエンドを起動します。
-no-rlwrap
対話型シェルを起動するときにrlwrapを呼び出さないでください。
I / Oオプション:
-i FILENAME、-input FILENAME
入力ファイルを指定します。
-o FILENAME、-output FILENAME
出力ファイルを指定します。
言語設定オプション:
-l CODE、-hl CODE、-lang CODE
自国語を指定します。
-s CODES、-sl CODES、-source CODES、-from CODES
「+」で結合されたソース言語を指定します。
-t CODES、-tl CODES、-target CODES、-to CODES
「+」で結合されたターゲット言語を指定します。
テキストの前処理オプション:
-j、-join-sentence
すべての引数を1つの文として扱います。
他のオプション:
-no-init
初期化スクリプトをロードしないでください。
詳細については、manページtrans(1)を参照してください。
</div></details>
普通に使う
- 「○○語から☓☓語へ」は
<変換元言語コード>:<変換先言語コード>
で指定。(言語コード一覧は公式Wikiや-R
オプションから確認できる)
<details><summary>言語リスト
</summary><div>
Terminal
$ trans -R
┌───────────────────────┬───────────────────────┬───────────────────────┐
│ Afrikaans - af │ Hebrew - he │ Portuguese - pt │
│ Albanian - sq │ Hill Mari - mrj │ Punjabi - pa │
│ Amharic - am │ Hindi - hi │ Querétaro Otomi- otq │
│ Arabic - ar │ Hmong - hmn │ Romanian - ro │
│ Armenian - hy │ Hmong Daw - mww │ Russian - ru │
│ Azerbaijani - az │ Hungarian - hu │ Samoan - sm │
│ Bashkir - ba │ Icelandic - is │ Scots Gaelic - gd │
│ Basque - eu │ Igbo - ig │ Serbian (Cyr...-sr-Cyrl
│ Belarusian - be │ Indonesian - id │ Serbian (Latin)-sr-Latn
│ Bengali - bn │ Irish - ga │ Sesotho - st │
│ Bosnian - bs │ Italian - it │ Shona - sn │
│ Bulgarian - bg │ Japanese - ja │ Sindhi - sd │
│ Cantonese - yue │ Javanese - jv │ Sinhala - si │
│ Catalan - ca │ Kannada - kn │ Slovak - sk │
│ Cebuano - ceb │ Kazakh - kk │ Slovenian - sl │
│ Chichewa - ny │ Khmer - km │ Somali - so │
│ Chinese Simp...- zh-CN│ Klingon - tlh │ Spanish - es │
│ Chinese Trad...- zh-TW│ Klingon (pIqaD)tlh-Qaak Sundanese - su │
│ Corsican - co │ Korean - ko │ Swahili - sw │
│ Croatian - hr │ Kurdish - ku │ Swedish - sv │
│ Czech - cs │ Kyrgyz - ky │ Tahitian - ty │
│ Danish - da │ Lao - lo │ Tajik - tg │
│ Dutch - nl │ Latin - la │ Tamil - ta │
│ Eastern Mari - mhr │ Latvian - lv │ Tatar - tt │
│ Emoji - emj │ Lithuanian - lt │ Telugu - te │
│ English - en │ Luxembourgish - lb │ Thai - th │
│ Esperanto - eo │ Macedonian - mk │ Tongan - to │
│ Estonian - et │ Malagasy - mg │ Turkish - tr │
│ Fijian - fj │ Malay - ms │ Udmurt - udm │
│ Filipino - tl │ Malayalam - ml │ Ukrainian - uk │
│ Finnish - fi │ Maltese - mt │ Urdu - ur │
│ French - fr │ Maori - mi │ Uzbek - uz │
│ Frisian - fy │ Marathi - mr │ Vietnamese - vi │
│ Galician - gl │ Mongolian - mn │ Welsh - cy │
│ Georgian - ka │ Myanmar - my │ Xhosa - xh │
│ German - de │ Nepali - ne │ Yiddish - yi │
│ Greek - el │ Norwegian - no │ Yoruba - yo │
│ Gujarati - gu │ Papiamento - pap │ Yucatec Maya - yua │
│ Haitian Creole - ht │ Pashto - ps │ Zulu - zu │
│ Hausa - ha │ Persian - fa │ │
│ Hawaiian - haw │ Polish - pl │ │
└───────────────────────┴───────────────────────┴───────────────────────┘
</div></details>
- 早速翻訳しよう。
Terminal
$ trans en:ja hello world\! # これだとhelloしか返らない
hello
/heˈlō,həˈlō/
こんにちは
(Kon'nichiwa)
Definitions of hello
[ English -> 日本語 ]
noun
今日は
hello, good day
hello
こんにちは, もしもし
Terminal
$ trans en:ja "hello world" # ""や''で囲むといい(-j(join-sentence)でもOK)
hello world
こんにちは世界
(Kon'nichiwa sekai)
Translations of hello world
[ English -> 日本語 ]
hello world
こんにちは世界
$ trans -s ja シェル芸 # -s(source)で単語の意味を辞書のように引ける
シェル芸
(Sheru-gei)
Shell art
Translations of シェル芸
[ 日本語 -> English ]
シェル芸
Shell art, Shell arts
- ファイルへの出力やパイプで渡す時は色コードが書き込まれるので処理しづらくなる。
Terminal
$ trans en:ja Lisp > lisp_mean
$ cat lisp_mean
Lisp
/lisp/
^[[1m舌足らずの発音^[[22m
^[[1m(Shitatarazu no hatsuon)^[[22m
Definitions of ^[[4mLisp^[[24m
[ ^[[4mEnglish^[[24m -> ^[[1m日本語^[[22m ]
noun
^[[1m リスプ^[[22m
lisp
^[[4mLisp^[[24m
^[[1m舌足らずの発音^[[22m, ^[[1mLisp^[[22m, ^[[1mリスプ^[[22m
- そこで
-no-ansi
をつけると色コードを削除できる。
Terimnal
$ trans en:ja lisp -no-ansi > lisp_mean
$ cat lsip_mean
lisp
/lisp/
舌足らずの発音
(Shitatarazu no hatsuon)
Definitions of lisp
[ English -> 日本語 ]
noun
リスプ
lisp
lisp
舌足らずの発音, Lisp, リスプ
- 変換元省略で言語を自動検出する。
- また標準入力やファイル、Webページからも文章を入力できる。
Terminal
$ echo "Импровизируй. Адаптируйся. Преодолевай" | trans :ja
Импровизируй. Адаптируйся. Преодолевай
(Improviziruy. Adaptiruysya. Preodolevay)
即興。適応します。克服する
(Sokkyō. Tekiō shimasu. Kokufuku suru)
Translations of Импровизируй. Адаптируйся. Преодолевай
[ Русский -> 日本語 ]
Импровизируй.
即興。
Адаптируйся.
適応します。, 適応。
Преодолевай
克服する, 打ち勝ちます
Terminal
$ cat uae_song
عِيشِي بِلَادِي عَاشَ اتِّحَادُ إِمَارَاتِنَا
عِشْتِ لِشَعْبٍ دِينُهُ الْإِسْلَامُ هَدْيُهُ الْقُرْآنُ
حَصَّنْتُكَ بِاسْمِ اللهِ يَا وَطَنُ
بِلَادِي بِلَادِي بِلَادِي بِلَادِي
حَمَاكِ الْإِلَهُ شُرُورَ الزَّمَان
أَقْسَمْنَا أَنْ نَبْنِيَ نَعْمَل
نَعْمَل نُخْلِص نَعْمَل نُخْلِص
مَهْمَا عِشْنَا نُخْلِصْ نُخْلِصْ
دَامَ الْأَمَانُ وَعَاشَ الْعَلَم يَا إِمَارَاتِنَا
رَمْزَ الْعُرُوبَة كُلُّنَا نَفْدِيكِ
بِالدِّمَاء نَرْوِيكِ
نَفْدِيكَ بِالْأَرْوَاحِ يَا وَطَن
Terminal
$ trans ar:ja file://uae_song # ファイルを入力
私の国を長生きし、首長国連邦を長生きします。
クルアーンの指導であるイスラム教を宗教とする人々が長生きしています。
国よ、神の名においてあなたを強化した
私の国、私の国、私の国、私の国
神はあなたを時の邪悪から守ってくれます
私たちの誓いは、仕事を構築することです
私たちは仕事をし、私たちは仕事をします
どれだけ救われても救われる
私たちの首長国よ、安全で旗が長生きする限り
私たち全員がArabわれているアラビア主義の象徴
血であなたを見る
私たちは魂であなたをredいます
$ trans ar:ja -i uae_song -o uae_song_ja # -i(input)で入力, -o(output)で出力
$ trans :ru https://www.example.com # 翻訳ページURLを生成
https://translate.google.com/translate?hl=en&sl=auto&tl=ru&u=https://www.example.com
-
-b(-brief)
で結果のみ。
Terminal
$ trans en:ja -b "Qiita is god."
Qiitaは神です。
$ trans en:zh -b "Qiita is god."
Qiita是上帝。
$ trans :@ja -b "დღეს ცივა." #-bの時, :@<国コード>で発音を表示する
Kyō wa samuidesu.
-
-L(list)
で言語情報の表示、-id(identify)
で言語検出。
Terminal
$ trans -L eo
Esperanto
Name Esperanto
Family Artificial Language
Writing system Latin
Code eo
ISO 639-3 epo
SIL http://www-01.sil.org/iso639-3/documentation.asp?id=epo
Glottolog http://glottolog.org/resource/languoid/id/espe1235
Wikipedia http://en.wikipedia.org/wiki/Esperanto_language
$ trans -id "ચાલો દીકરી સાસિરયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી"
ગુજરાતી
Name Gujarati
Family Indo-European
Writing system Gujarati
Code gu
ISO 639-3 guj
SIL http://www-01.sil.org/iso639-3/documentation.asp?id=guj
Glottolog http://glottolog.org/resource/languoid/id/guja1252
Wikipedia http://en.wikipedia.org/wiki/Gujarati_language
$ trans :en -b "ચાલો દીકરી સાસિરયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી"
Did you mean: ચાલો દીકરી સાસરિયા - ગુજરાતી લગ્નનું ગીત - હિતેન કુમાર, રાજ લક્ષ્મી
Let's Daughter Sasiriya - Gujarati Wedding Song - Hiteen Kumar, Raj Lakshmi
- 以上のオプションを使えばいろいろと遊ぶことができる。
API制限の回避
- 応用に入る前に、ひとつ注意することとして、何回か連続してコマンドを叩くときはランダムウェイトをとった方がいい。
- 特に無限回実行し続けたい時には。
- そうしなければ途中で何も結果が返ってこなくなる。(空文字列が返ってくる)
- この状態になると1時間ほど待たないといけないのが辛い。
- しかしこれはAPI制限のせいらしい。
- 以下の実験で回避するための最良のランダムウェイトを探す。
<details><summary>実験(面倒くさいので飛ばして良い)
</summary><div>
- 少し実験をする。
- 以下のコマンドを一時間ほど放置して、結果が返り続けるか検証する。
Terminal
# 固定ウェイト 1s
$ c=1;while :;do echo $[c++];trans en:ja "hello." -b;sleep 1;done
1
こんにちは。
…(略)…
52
こんにちは。
53
54
こんにちは。
55
56
… # 55回目でストップ
# 固定ウェイト 5s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep 5;done
1
こんにちは。
…(略)…
35
こんにちは。
36
37
… # 36回目でストップ
# ランダムウェイト 5~9s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+5];done
1
こんにちは。
…(略)…
375
こんにちは。
376
こんにちは。
… # OK
# ランダムウェイト 4~8s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+4];done
1
こんにちは。
…(略)…
79
こんにちは。
80
81
こんにちは。
82
83
… # 82回目でストップ
# ランダムウェイト 1~5s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5+1];done
1
こんにちは。
…(略)…
36
こんにちは。
37
38
… # 37回目でストップ
# ランダムウェイト 0~4s
$ c=1;while :;do echo $[c++];trans en:ja "Hello." -b;sleep $[RANDOM%5];done
1
こんにちは。
…(略)…
41
こんにちは。
42
43
… # 42回目でストップ
</div></details>
- 結論として
sleep $[RANDOM%5+5]
がちょうどいい感じに制限を回避できた。 - よってこれをウェイトに用いる。
- これよりいいモノがあればコメントください。
応用して遊ぶ
- ここでは2つ無限に翻訳/出力するコマンド(スクリプト)例を考えた。
例1, いろんな国の「こんにちは」を連続表示
Terminal
# まず使用可能な言語コード一覧をWikiからとってその中の1つを取得
$ curl -s "https://github.com/soimort/translate-shell/wiki/Languages"|grep -oE '<strong><code>[^<]+<'|sed -r 's/^<strong><code>([^<]+)</\1/g'|shuf -n1
Cyrl
# その返り値を指定して実行(行頭の>はTerminal上での改行なので削除して実行してください)
$ while :
do
curl -s "https://github.com/soimort/translate-shell/wiki/Languages" \
| grep -oE '<strong><code>[^<]+<' \
| sed -r 's/^<strong><code>([^<]+)</\1/g' | shuf -n1 \
| tee >(xargs -I{} trans -L {} \
| awk 'NR==2{print$2}') >(xargs -I{} trans -b :{} 'Hello.') \
| tr \\n :;sleep $[RANDOM%5+5]
done
sn:Shona
Mhoro.
la:Latin
Salve.
fy:Frisian
Hoi.
...
例2, 辞書ファイルの単語を無限翻訳
Terminal
# 大体のubuntuには/usr/share/dictに以下のような辞書ファイルがある
$ ls /usr/share/dict
american-english cracklib-small words
british-english README.select-wordlist words.pre-dictionaries-common
$ shuf -n1 /usr/share/dict/american-english
downstream
$ c=0;while :
do
let c++
echo -e "###\n`printf %03d $c`\n###"
shuf -n1 /usr/share/dict/american-english \
| trans :ja
sleep $[RANDOM%5+5]
done
###
001
###
Colombian
コロンビア人
(Koronbia hito)
Translations of Colombian
[ English -> 日本語 ]
Colombian
コロンビア人, コロンビア
###
002
###
accounted
会計済み
(Kaikei-zumi)
Definitions of accounted
[ English -> 日本語 ]
verb
占む
command, occupy, account, hold
みなす
account, reckon
accounted
会計済み, 占めました
###
003
###
Garfield's
ガーフィールド
(Gāfīrudo)
Translations of Garfield's
[ English -> 日本語 ]
Garfield's
ガーフィールド, ガーフィールドさん
…(略)
楽しい。
結論
たのしいし辞書代わりにもなるtrans
くん最高!
シェル芸が捗る〜〜〜〜〜〜〜〜!!!!!!!!
Discussion