みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
以前、Google Apps Scriptを使って「おみくじチャット」を作りました。
「わーい、今日は大吉だ!」
…なんて、まあまあ楽しいのですが、残念ながら仕事にはあんまり役に立たないです。
ですが、Google Apps ScriptとチャットワークAPIを使って
- チャットワークからメッセージを受け取り
- 何かしらの処理をして
- チャットワークにメッセージを返す
というベースの仕組みは非常に応用性の高いものです。
そこで、この仕組みを応用して「翻訳チャット」を作っていきたいと思います。
ちょっと調べものをしているとき、チャットで翻訳ができたら…けっこう便利そうですよね!?
では、いってみましょう!
おみくじチャットのおさらい
最初にベースとなるおみくじチャットプログラムをおさらいしておきたいと思います。
function getOmikuji(){ var token = 'APIトークン'; //チャットワークAPIトークン var room_id = XXXXXXXX; //ルームID var json = fetchMessage(token,room_id); /* json内に「おみくじ」メッセージがあればチャットワークに送信 */ for each(var obj in json){ if(obj.body === "おみくじ"){ var body = "[rp aid=" + obj.account.account_id + " to=" + room_id + "-" + obj.message_id + "] " + obj.account.name + "さん[info]おみくじの結果:" + generateOmikuji() + "[/info]"; //チャットワークに送るテキスト sendMessage(token,room_id,body); } } }
いくつか独自の関数がありますが
fetchMessageはチャットワークの特定のルームから未取得のメッセージをjson形式で取得してくる関数
– 引数 token:APIトークン, room_id:ルームID
– 返り値 json:レスポンスをJSON解析した配列
sendMessageはチャットワークの特定のルームにメッセージを送る関数
– 引数 token:APIトークン, room_id:ルームID, body:メッセージ本文
– 返り値 なし
generateOmikujiは”大吉”,”中吉”,”小吉”,”吉”,”半吉”,”末吉”,”凶”の中からランダムにいずれかを返す関数です(この関数については今回は関係ないですね)。
9行目から始まるfor each文で取得した全てのメッセージについての繰り返しとしています。
取得したメッセージが「おみくじ」とイコールであれば、12~16行でメッセージを成形しつつ、チャットワークにメッセージを送ります。
詳しくはこちらの記事をご覧くださいね。
翻訳をするtranslateメソッド
さて、翻訳チャットシステムのキモとなる翻訳処理をいかにするか考えます。
Google翻訳のサービスは今や世界中のたくさんの方が利用してるかと思いますが、Google Apps ScriptからGoogle翻訳の機能を利用するためにLanguageApp.translateメソッドが用意されています。
と書きます。
言語のところは日本語なら「ja」、英語なら「en」など、2文字であらわされる言語ごとのコードを入力します。
これはISO 639-1に登録されているもので、ウィキペディアにコード一覧がありますので、どうぞご活用下さい。
例えば、resultという変数に日本語から英語への翻訳結果を格納したい場合は
var result = LanguageApp.translate("日本語から英語へ翻訳します", "ja", "en");
とします。簡単でしょ?
さらに、ここがすごいのですが、第二引数の「元の言語」に空の文字列を設定した場合は元のテキストから言語が自動検出されます。
var result = LanguageApp.translate("日本語から英語へ翻訳します", "", "en");
でも良いということです。
便利ですね~。
ですから翻訳システムとしては、翻訳する本文と翻訳後の言語だけユーザーに指定をさせれば動かすことができる、ということですね。
翻訳チャットシステムの概要
さて、今回作る翻訳チャットのシステムですが、翻訳に必要な情報は
- テキスト本文
- 翻訳する言語
となりますので、動作としては
- チャットワークに「言語コード;本文」とメッセージを送信
- その返信の形で翻訳結果を返す
という動作にしたいと思います。セミコロンの前に翻訳をする言語コードを指定して、セミコロンの後に本文を書くという形です。
システムの流れとしては、おみくじチャットを応用して
- チャットワークから未取得のメッセージをjson形式で取得
- 取得したすべてのメッセージについて
- セミコロンで言語コードと本文を分ける
- 翻訳
- チャットワークに送るテキストを成形
- チャットワークにメッセージを送信
という流れです。
2-1,2-2を作って、2-3をちょっと変更すればOKです。
翻訳チャットの最も簡単なスクリプト
実際のスクリプトはこちらです。
function translateChat() { var token = 'APIトークン'; //チャットワークAPIトークン var room_id = XXXXXX; //翻訳さんのルームID var json = fetchMessage(token,room_id); //翻訳さんグループチャットのメッセージを取得 /* 各メッセージについて 繰り返す */ for each(var obj in json){ var arr = obj.body.split(';'); //セミコロンでsplitして配列に格納 var result = LanguageApp.translate(arr[1], "", arr[0]); //翻訳 var body = "[rp aid=" + obj.account.account_id + " to=" + room_id + "-" + obj.message_id + "] " + obj.account.name + "さん[info]翻訳結果:" + result + "[/info]"; //チャットワークに送るテキスト sendMessage(token,room_id,body); //チャットワークにメッセージを送る } }
splitメソッドで特定の文字で文字列を分割して配列に格納する
11行目で取得したメッセージをセミコロンで分割をしています。
文字列を特定の文字で分割する場合はsplitメソッドを使い
とします。結果は配列として格納されます。
今回はarrという配列を指定していますので、メッセージがルールに則ったものであれば
- arr[0]:言語コード
- arr[1]:本文
と格納されるはずです。
実行結果
チャットワークにルール通りにメッセージを送った上でスクリプトを実行しますと
このような形で翻訳結果が返ってきます。
シンハラ語のほうは…合ってるかわかりませんが…汗
まとめ
Google Apps Scriptとチャットワークで翻訳チャットを作成しました。
…すごいですね。便利ですね。
さて、今回のプログラムではルールに則っていないメッセージをチャットワークから送るとGoogle Apps Scriptではエラーとなり、正しく動作しません。
ということで、次回はGoogle Apps Scriptでエラーが発生したときに処理を分ける方法についてお伝えします。
どうぞお楽しみに!