この記事は公開されてから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を使えば、もっといろんな使い方ができるとおもいます。