Mac Sierraでも動作するAquesTalkの音声再生アプリMYukkuriVoiceを作った
アプリの説明は動画の中で説明しているので、この記事では、このアプリを作った時に得られた
(役に立たない部分が多そうな)知見について話そうと思う。
https://github.com/taku-o/myukkurivoice
Macのゆっくり事情
いわゆるゆっくりの声はAquesTalkというライブラリで作るのだけど、この声を出すアプリは、
- SofTalk (Windows) http://www35.atwiki.jp/softalk/
- 棒読みちゃん (Windows) http://chi.usamimi.info/Program/Application/BouyomiChan/
- ゆっくろいど (Mac) http://www.yukkuroid.com
- ゆくも (Webブラウザ版) http://www.yukumo.net
などがある。
AquesTalk
この系統のアプリの仕組み
AquesTalk(http://www.a-quest.com)のライブラリには、
- AqKanji2Koeという音声記号列に変換するライブラリと、
- AquesTalk(1と2とpicoがある)という、↑で作成した音声記号列をWAVに変換するライブラリ
があり、
この2つの機能を利用して声を再生および保存するのが、この手のアプリの基本的な仕組みです。
日本語のメッセージ ↓ ↓ AqKanji2Koe ↓ 音声記号列 ↓ ↓ AquesTalk ↓ WAVバイナリ
AquesTalkのライセンス
AquesTalkのライブラリには
- 開発するためのライセンスと、
- 使用するためのライセンスと、
- 頒布するためのライセンス
がある。
これらのライセンスは AQUEST Online Store(http://shop.a-quest.com/?mode=cate&cbid=1377248&csid=0)で購入する。
よって、商売などで作成したアプリを配布するには頒布ライセンスが必要なのだが、
広く公開するアプリで個人利用における無償配布規定に従える場合は、
個人利用ライセンスを利用できる(審査あり)。
Node.js + Native
- 今回作成したアプリはElectronで作られている。
- AquesTalkのライブラリはダイナミックライブラリで出来ている。
ということで、
アプリの機能を実現するには、Node.jsからダイナミックライブラリを呼び出す方法が必要になった。
Node.jsからNativeの機能を呼び出す方法は、調べると、
- Node.jsのネイティブ拡張
- Node ffi https://github.com/node-ffi/node-ffi
- SWIG http://swig.org
- emscripten https://github.com/kripken/emscripten
などがあった。
3番目のSWIGは色々な言語からの呼び出しに対応していて、一見凄そうだが、
冷静に考えると使う側からすると、必要な言語から呼び出せれば、それで良いかな、という気がしないでもない。
一番下のemscriptenはよく調べていないけれど、
Node ffiとSWIGは、最終的にはNode.jsのネイティブ拡張と同じことをしているっぽい?
(深く追いませんけど)
今回はNode ffiを利用しましたが、結構安定している印象。
Node ffiの使い方の例は、大体このような感じ
var ffi = require('ffi'); var ref = require('ref'); var ptr_uchar = ref.refType(ref.types.uchar); var ptr_int = ref.refType(ref.types.int); var ptr_void = ref.refType(ref.types.void); // unsigned char * AquesTalk2_Synthe_Utf8(const char *koe, int iSpeed, int * size, void *phontDat) var framework_path = 'AquesTalk2.framework/Versions/A/AquesTalk2'; var ptr_AquesTalk2_Synthe_Utf8 = ffi.DynamicLibrary(framework_path).get('AquesTalk2_Synthe_Utf8'); var fn_AquesTalk2_Synthe_Utf8 = ffi.ForeignFunction(ptr_AquesTalk2_Synthe_Utf8, ptr_uchar, [ 'string', 'int', ptr_int, ptr_void ]); var alloc_int = ref.alloc('int'); var encoded = ''; var speed = 100; var phont_data = ....; var r = fn_AquesTalk2_Synthe_Utf8(encoded, speed, alloc_int, phont_data); var buf_wav = ref.reinterpret(r, alloc_int.deref(), 0);
動画
動画作成者向けのアプリなので、その層の人に情報を伝えるには、動画を作る必要がある。たぶん。
ボイスロイド
この動画はボイスロイドを解説者として採用している。
(おっさんの声より良いという判断。だが、実際、ミス無く喋るのは難しい、ので手間はあまり変わらないのだ)
ボイスロイドの会話は、ゆっくり系の声より会話の速度が速い。同じ会話を話させても短い時間で終わる。
ゆっくりに同じ早さで話させると、早口に聞こえがちなようだ。
解説者として使いやすいボイスロイドは、自分の主観では、
結月ゆかりの方が使いやすい。
たまに苦手な台詞、言い回しがあり、その場合は、台詞を変えて回避すると良い。
逆に使いにくそうなのは、
調音が少し難しいのと、関西弁の発音にされちゃうのが理由。
会話のリズム
動画の会話の間をうまく制御できない人は、セリフの合間を作らずにひたすら喋らせまくれば、
センスが無い人でもそれなりに誤魔化せる、という動画作成者的ノウハウがあるらしい。
(1秒以上、会話していない時間を作らないようにする)
実際、このノウハウは効果的だと思う。
2人以上話す人が居ると、切れ間のない会話を作りやすい。
おわり
未知の作業が多かったので、いろいろ勉強になった