概要
OpenJTalkという日本語の音声合成エンジンのNode.jsバインディングをつくりました。
リポジトリはこちら。
https://github.com/TanUkkii007/node-openjtalk
使い方
"すもももももももものうち"というセリフを読み上げます。
var Speaker = require('speaker');
var OpenJTalk = require('node-openjtalk').OpenJTalk;
var fn_voice = OpenJTalk.voices.mei_normal;
var open_jtalk = new OpenJTalk({voice: fn_voice});
var speaker = new Speaker({
channels: 1,
bitDepth: 16,
sampleRate: 48000
});
open_jtalk.synthesize("すもももももももものうち", function(error, buffer) {
if (!error) {
speaker.end(buffer);
}
});
感想
Node.jsのネイティブアドオンを初めて作りました。既存のライブラリへのバインディングを作るのは、結構たいへんでした。ビルドを通すまでは移植職人作業で、このとうりに進めました。ビルドが通ってからはNode.jsのインターフェースに合わせるため、データをBufferオブジェクトで取得するようにしたり、非同期なAPIを用意したりしました。
この大変さを緩和するため、より簡単なffiをコアモジュールにすることがNode.jsで検討されているようです。
参考文献
ネイティブアドオンを作るときに参考にした文献を紹介します。
公式ドキュメントのネイティブアドオンの項目。このとおりに作ると複数のバージョンのNode.jsで使えないので以下のNANを使う。
NAN: Node.jsのネイティブAPIの違いを吸収し、記述を簡単にするライブラリ
NodeSchoolのネイティブアドオンの作り方を解説したworkshopper
node-gypなどのモジュールの作者TooTallNateによるCライブラリをgypに移植するやり方の解説
いろいろなプロジェクトのビルド定義ファイルbinding.gypを集めたwiki。このなかでもnode-canvas, node-sqlite3, node-leveldownをよく参考にしました。
node-pre-gypというnode-gypに変わるネイティブアドオンのビルドツール。node-openjtalkではnode-pre-gypを使いました。
- http://enginetrouble.net/2013/07/getting-started-with-gyp.html
- http://enginetrouble.net/2014/01/gyp-basic-functions.html
mogemimiさんによるgypの使い方の貴重な日本語の資料