LoginSignup
24
29

More than 5 years have passed since last update.

Node.jsで音声合成するモジュールをつくった

Posted at

概要

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を使いました。

mogemimiさんによるgypの使い方の貴重な日本語の資料

24
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
29