「Google 日本語入力 CGI API」があるなんて…!

Google CGI API for Japanese Input、Google 日本語入力 CGI API というモノを見つけた。

IME ソフトの「Google 日本語入力」(オープンソース版でいう Mozc) が行う漢字変換を API として利用できるらしい。すげぇ。

以下のように text クエリ文字列に、変換したい文章を渡す。漢字や英数字なんかが混じっていても動作する。

$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq
[
  [
    "たまに",
    [
      "たまに",
      "玉に",
      "珠に",
      "球に",
      "多摩に"
    ]
  ],
  [
    "いくなら",
    [
      "行くなら",
      "いくなら",
      "逝くなら",
      "育なら",
      "往くなら"
    ]
  ],
  [
    "こんな",
    [
      "こんな",
      "コンナ",
      "コンな",
      "婚な",
      "紺な"
    ]
  ],
  [
    "だがしやさん",
    [
      "駄菓子屋さん",
      "だがしやさん",
      "ダガシヤサン",
      "ダガシヤサン"
    ]
  ]
]

結果はこんな感じでトップレベルが配列だが JSON として機能している。文節で自動的に区切って、その文節ごとに変換候補を配列でいくつか提供してくれる。

API Key なども必要なく使える API なので、コレを使えば「文章を分節で区切る」とか「ひらがな → 漢字変換」だとかいう機能をコイツだけで実現できる。

$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq -r '.[][0]'
たまに
いくなら
こんな
だがしやさん
$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq -j '.[][1][0]|tostring'
たまに行くならこんな駄菓子屋さん

カンマ , を使うと強制的に分節を区切ったりできるので、それなりに精度の高い変換ができるだろう。

Node.js で叩くならこんな感じのコードで行ける。慣れている言語で API を叩いてみて、同じことができるコードを別の言語で書いてみることで、プログラミング言語学習にもなりそうだ。

const http  = require('http');
const https = require('https');

/**
 * Request
 * 
 * @param {string} url URL
 * @return {Promise<string>} Response
 */
const request = url => new Promise((resolve, reject) => {
  const req = (url.startsWith('https:') ? https : http).request(url, {}, res => {
    res.setEncoding('utf8');
    let data = '';
    res.on('data', chunk => { data += chunk; })
       .on('end' , ()    => { resolve(data); });
  }).on('error'  , error => { reject(error); })
    .on('timeout', ()    => { req.destroy(); reject('Request Timeout'); })
    .setTimeout(10000)
    .end();
});

(async () => {
  try {
    const text = process.argv.slice(2).join(' ').trim();
    if(text === '') return console.warn('Please Input Text');
    
    // [Google 日本語入力 - CGI API デベロッパーガイド](https://www.google.co.jp/ime/cgiapi.html)
    const url = `http://www.google.com/transliterate?langpair=ja-Hira|ja&text=${text}`;
    const response = await request(url);
    
    const json = JSON.parse(response);
    if(!Array.isArray(json)) {
      console.warn('Invalid Response', { response, json });
      throw new Error('Invalid Response');
    }
    
    const converted = json.map(item => {
      if(!Array.isArray(item) || item.length !== 2) {
        console.warn('Invalid Response Item', { response, json });
        throw new Error('Invalid Response Item');
      }
      const candidates = item[1];
      if(!Array.isArray(candidates) || candidates.length === 0) {
        console.warn('Invalid Response Candidates', { response, json });
        throw new Error('Invalid Response Candidates');
      }
      return candidates[0];  // 第1候補を使用する
    }).join('');
    console.log(converted);
  }
  catch(error) {
    console.error('Error :', error);
  }
})();

API Key が要らない Web API、気軽で最高。