音声認識とKAKASIでポケットミクにもっとしゃべってもらう


概要
--------------------
学研からでている[ポケミク](http://otonanokagaku.net/nsx39/)の制御アプリは js で作られています。なのでさっそく Chrome の音声認識（speech API）つかってミクさんにしゃべってもらうアプリ作ったのですが、じつはすでに似たようなのありました。

[Kodama Application](http://yamaha-webmusic.github.io/nsx1-apps/kodama/)

ただこのアプリでミクさんが発話してくれるのはひらがなだけです。もちろんそんなミクさんもかわいいのですが、KAKASI を使ってもう少ししゃべれる単語増やしてみようと思います。

![pokemiku.png](https://qiita-image-store.s3.amazonaws.com/0/20773/d0eb6dd5-3978-8818-396c-bfb1888ffc08.png "pokemiku.png")

構成
--------------------

1.【Kodama】Speech API で音声をテキストに変換
2.【新規作成】Node.js 経由で KAKASI を使って漢字カタカナをひらがなに変換
3.【Kodama】nsx39.js 使ってポケミクを制御

てな感じです。
元の Kodama からフォークしたプロジェクトは下記から。
https://github.com/nenjiru/nsx1-apps

以下、簡単に解説です。

環境を作る
--------------------
Node と npm はインストール済みの前提です。
kodama の下にある node ディレクトリで npm install してください。

```sh
$ cd nsx1-apps/kodama/node
$ npm install
$ node server
```

サーバを立ち上げると、ブラウザが起動します。
自動で起動しなければ http://localhost:3939 を開きます。

まずはポケミクをつないで **NSX-1モード** にします。
NSX-1モードにするには、U + ↑ + ↓ の同時押しで切り替わります。
認識に成功すると MIDI OUT のリストででてきます。

![nsx39.png](https://qiita-image-store.s3.amazonaws.com/0/20773/58bb201e-7341-86cc-e0e8-f0984cac38e7.png "nsx39.png")

Chrome の音声認識、Speech API のディクテーションは非常に良く出来ていて、漢字混じりの文章に変換してくれます。
ところが、漢字のためにうまく発声できないことがあります。

![ng.png](https://qiita-image-store.s3.amazonaws.com/0/20773/b9f1d989-5106-e9fe-e939-e53599ee15b5.png "ng.png")
_こうなっちゃう_

これをすべてひらがなにします。

KAKASIを準備する
--------------------
ひらがなに変換してくれるwebサービスとかありそうですが、今回はローカルで使える KAKASI で変換します。

http://kakasi.namazu.org/
上記サイトよりダウンロードして解凍後のディレクトリに移動したら、ターミナルからインストールを実行します。

````sh
$ ./configure
$ make
$ su
$ make install
````

インストール完了。
私の環境では nkf で文字コードを変換してやる必要ありました。

````sh
$ echo チョコレート食べたい | nkf -e | kakasi -JH -KH  | nkf -w
````

>ちょこれーとたべたい

と変換されるはずです。
これを node 経由で叩きます。

APIサーバをたてる
--------------------
[restify](https://www.npmjs.org/package/restify) をつかって簡易なAPIサーバをたてます。

```js:server.js
var restify = require('restify'),
	server = restify.createServer();

server.get(/\/.*/, restify.serveStatic({
    directory: __dirname + '/../',
    default: 'index.html'
}));
```

ポケミクの制御アプリなどの静的リソースは kodama ディレクトリを参照させておきます。

次にひらがな変換APIを用意します。
/kakasi に POST でリクエストを受け取り、child_process を使って kakasi でひらがなに変換して返すようにしておきます。

```js:server.js
var exec = require('child_process').exec;

server.post('/kakasi', function (req, res, next)
{
	var text = req.params.text,
    	command = 'echo '+ text +' | nkf -e | kakasi -JH -KH  | nkf -w';

	exec(command, function(error, stdout, stderr)
    {
		if (!error && !stderr)
		{
			// 変換結果を返す
			res.send(stdout);
		}
		else
		{
			// エラー処理
		}
	});

    next();
});
```

最後に kodama の制御部分を修正します。

app.jsを修正
--------------------
改変箇所は下記。

```js:app.js

function playKodama(spWord ,delay) {

	// ひらがなAPIを経由させる
	toHiragana(spWord, function (word) {
		// 元の処理
	});
}

/**
 * ひらがなに変換する
 */
function toHiragana(word, callback) {
    var form = new FormData();
    form.append('text', word);

    var xhr = new XMLHttpRequest();
    xhr.open('POST', '/kakasi', true);

    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            callback(xhr.responseText.replace(/\\n|\"/g, ''));
        }
    };
    xhr.send(form);
};
```

修正箇所は以上です。
詳しい修正内容はソースコードを参照してください。