ちょっと話題の記事

[Node.js]node.jsからゆっくりボイスをしゃべらせる[ネタ]

2013.03.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

node.jsからゆっくりボイスをしゃべらせる

ゆっくりボイスといえば、ニコニコとかでよく聞くあれです。
Windowsの場合、softalkを使えば再生したりファイルに保存したりできます。
Macでゆっくりボイスを使いたい場合、Yukkuroidというアプリがあります。
これはMacでゆっくりボイスをしゃべらせるためのアプリなのですが、外部からアクセスするためのAPIも公開しています。
今回はこのアプリのAPIに、以前紹介したNodObjCを使用して、
アクセスしてみましょう。 

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Node.js : v0.8.1
  • Yukkuroid : v0.4.1

適当なディレクトリを作成し、そこでnpmを使用してNodObjCをインストールします。

% mkdir yukkuri
% cd yukkuri
% npm install NodObjC

また、Node.jsからアクセスする際、Yukkuroidが起動している必要があるので、ここからダウンロード、
インストールし、起動しておいてください。

ゆっくりAPIにアクセスするモジュールを作成

yukkuri.jsという名前で、ゆっくりAPIにアクセスするためのモジュールを作成します。
やっていることは単純で、Objective-Cのプロセス間通信を使用して、公開されているAPIにアクセスしているだけです。

var $ = require('NodObjC');
$.import('Foundation');
$.import('Cocoa');

var processName,
	host,
	proxy,
	pool;

/**
 * 初期化処理.
 * ここで自動解放プールの作成と必要なNSStringの作成.
 */
exports.init = function() {
	pool = $.NSAutoreleasePool('alloc')('init');
	processName = $.NSString('stringWithUTF8String', 'com.yukkuroid.rpc');
	host = $.NSString('stringWithUTF8String', '');
	proxy  = $.NSConnection('rootProxyForConnectionWithRegisteredName',processName,'host',host);
};

/**
 * 終了処理.リソースを解放する.
 */
exports.release = function() {
	pool('drain');
};

/**
 * NSConnectionを取得する.
 */
exports.getProxy = function() {
	return proxy;
};

/**
 * 通常テキスト欄に値をセット.
 */
exports.setKanjiText = function(jsStr) {
	var objCStr = $.NSString('stringWithUTF8String', jsStr);
	proxy('setKanjiText',objCStr);
};

exports.getKanjiText = function() {
	return proxy('getKanjiText');	
};

/**
 * 音声を再生する.
 */
exports.play = function() {
	proxy('pushPlayButton',0);
};

今回は初期化とか再生とか、いくつかのAPIしか使ってません。実際は、しゃべる速度とか音量とか、いろいろできます。

ゆっくりモジュールを使う

ではyukkuri.jsを使ってみましょう。app.jsという名前でファイルを作成します。
yukkuri.jsをrequireし、コマンドライン引数からしゃべらせたい文字を取得、再生しましょう。

//app.js var yukkuri = require('./yukkuri');

var word;

if (process.argv.length <= 2) { console.log("引数にしゃべらせたい文字を指定してください"); process.exit(0); } //初期化 yukkuri.init(); //引数から文字を取得してセット yukkuri.setKanjiText(process.argv[2]); var text = yukkuri.getKanjiText(); console.log("しゃべる文字:",text); //再生 yukkuri.play(); //後処理 yukkuri.release(); [/javascript]

実行!

コンソールから実行してみましょう。
ゆっくりボイスでしゃべります。
※Yukkuroidは起動しておいてください

% node app.js ゆっくりしていってね

まとめ

いかがでしょう。Node.jsからNodObjCのプロセス間通信をつかってAPIにアクセスすることができました。
なお、YukkuroidとかsoftalkがベースとしているAquesTalkを使えば、もっといろんな使い方ができるとおもいます。

参考サイトなど