Mac Sierraでも動作するAquesTalkの音声再生アプリMYukkuriVoiceを作った

アプリの説明は動画の中で説明しているので、この記事では、このアプリを作った時に得られた
(役に立たない部分が多そうな)知見について話そうと思う。
https://github.com/taku-o/myukkurivoice

Macのゆっくり事情

いわゆるゆっくりの声はAquesTalkというライブラリで作るのだけど、この声を出すアプリは、

などがある。


Mac環境唯一のアプリゆっくろいどMac Sierraで動作しなくなったのが、
今回のアプリの作成の経緯ですね。

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の機能を呼び出す方法は、調べると、

などがあった。


3番目のSWIGは色々な言語からの呼び出しに対応していて、一見凄そうだが、
冷静に考えると使う側からすると、必要な言語から呼び出せれば、それで良いかな、という気がしないでもない。


一番下のemscriptenはよく調べていないけれど、
Node ffiSWIGは、最終的には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人以上話す人が居ると、切れ間のない会話を作りやすい。

おわり

未知の作業が多かったので、いろいろ勉強になった

vagrant + debian + plone

install vagrant

  • 省略

install Debian

cd /usr/local/src/vagrant
vagrant box add debsqueeze64 http://www.emken.biz/vagrant-boxes/debsqueeze64.box
vagrant box list
vagrant init

edit Vagrantfile

  • 運用スタイルに合わせて適当に
- config.vm.box = "base"
+ #config.vm.box = "base"
+ config.vm.box = "debsqueeze64"
- #config.vm.network :public_network
+ config.vm.network :public_network
  • 動作確認
# 起動/停止/ssh
vagrant up
vagrant halt
vagrant ssh

install plone

vagrant up
vagrant ssh
  • ploneのインストール。
    • 使いたいバージョンを入れる。この例では古いバージョン
sudo apt-get update
sudo apt-get install python-setuptools python-dev build-essential libssl-dev libxml2-dev libxslt1-dev libbz2-dev libjpeg62-dev
sudo apt-get install libreadline-dev wv poppler-utils
sudo apt-get install git
wget --no-check-certificate https://launchpad.net/plone/3.3/3.3.6/+download/Plone-3.3.6-UnifiedInstaller.tgz

tar xf Plone-3.3.6-UnifiedInstaller.tgz
cd Plone-3.3.6-UnifiedInstaller.tgz
./install.sh standalone
  • 動作確認
cd ~/Plone/zinstance
# foreground/start/stop
bin/plonectl fg
bin/plonectl start
bin/plonectl stop
/sbin/ifconfig

追加の設定

  • sitecustomize.pyを入れる
vi /home/vagrant/Plone/Zope-2.10.13-final-py2.4/lib/python/sitecustomize.py
+ import sys
+ sys.setdefaultencoding("utf-8")
  • ploneのポートを適当に設定
vi /home/vagrant/Plone/zinstance/parts/instance/etc/zope.conf
+ <http-server>
+   address 12200
+ </http-server>
+ <ftp-server>
+   address 12221
+ </ftp-server>

Emacs Lispテクニックバイブル 感想

Emacs Lisp テクニックバイブルを入手して読了。
読み終わるのに結構時間かかった。

http://www.amazon.co.jp/dp/4774148970

  • 一般的な言語の教科書っぽい感じ
  • 練習問題って項目だけど、かならず問題って訳ではなくて、操作の例とかの場合も
  • まとめがいい感じ


Emacs Lispをバリバリ書かない人には、間違いなく良い本。
書いている人にとっても、本の後半、テストデバッグ、モード作成、外部プログラムとの協調、非同期処理あたりは面白い感じ。
前作のEmacsテクニックバイブルと違って、即使える系の本じゃないけど、エディタマニアー↑な自分には面白かった。


Emacs本、あんまり頻繁に出る訳じゃないから、
たまに出る本ががっかりだと、残念感が半端無いから、良い本で本当によかった。

ujihisa.vim#2

  • 2011/11/19 13:00 - 20:00
  • mixi
  • #ujihisa

http://partake.in/events/b886679b-e8c0-44af-9df2-62a6e5cfd6ed

menu

  • Keynotes
    • "To be a good programmer" with ujihisa
    • "Illustrate Vim core source code, dissing" with KoRoN
    • "The truth of Vim by unprecedented point of view" with ShougoMatsu
  • Tech talks
    • "(untitled)" with Kana Natsuno
    • "Vim script getting started" with m-kanno
    • "Vim-pep8" jbking
    • "(something technological)" with ShougoMatsu
    • "LiveCoding: implementing quickrun hook" with thinca
    • "All about eskk.vim with vital.vim" with tyru
    • "Simplenoting with Vim" with sora_h
  • Lightening talks
    • "Start Vim script" with choplin
    • "My Unite plugins" with basyura

"Illustrate Vim core source code, dissing" with KoRoN

  • too many ifdef

ifdefは本当に多い!!

  • many static variables
  • big big switch

insert、normalなどの処理がswitchに集中。そこで全て処理。

"My Unite plugins" with basyura

  • unite-yarm
    • yet another redmine
      • チケットの一覧
      • チケットの編集保存
      • ブラウザの起動
  • unite-uiki
    • おれおれwiki
    • キーワードjump
  • unite-rails
    • コントローラー、モデル、ビューの制御

"Vim script getting started" with m-kanno

  • :help
  • :help use-cpo-save

"Vim-pep8" jbking

  • pep8

"LiveCoding: implementing quickrun hook" with thinca

"The truth of Vim by unprecedented point of view" with ShougoMatsu

  • いつもの

"世界に一つだけのエディタ" with ShougoMatsu

  • いつもの

"Start Vim script" with choplin

  • URL捜索中

"To be a good programmer" with ujihisa

"(untitled)" with Kana Natsuno

  • いない

"All about eskk.vim with vital.vim" with tyru

  • いない

感想

  • いろいろなイベントと日付が重なりすぎて、さすがにもったいなかった気もする。
  • ところで、あんまり関係ないけど、家に帰ったら、Vimテクニックバイブル第2刷が家に届いていた!!!

[perl] YAPC::Asia Tokyo 2011

YAPC::Asia Tokyo 2011
2011/10/15 大岡山キャンパス
http://yapcasia.org/2011/


スポンサー枠で遊びに行ってきました。
仕方ない話だけど、遅くにしかいけなくて、LTしか見られなかった。

ぼくのかんがえたさいきょうのてきすとえでぃた by kiwanami

  • データベースが欲しい。 → Perlでつくろう。PerlLisp連携。

Common Lispってどんな言語か

福岡のいいところ

  • 交通便利
  • 物価安い
  • 食べ物うまい
  • ガイアックスは福岡に拠点をつくる予定

ロケタッチアプリ

Perlnのモジュール

  • akefile

アケファイルって何
MakefilePerl -M → akefaile

  • Mモジュール

全部書きたい人用だから、何も機能がない

プログラムの静的解析で悪いモジュールを探す

  • 多くの人が関わる大きなモジュール
  • 多くのライブラリを使い、多くのライブラリから使われるモジュール
  • 計測して見つけ出す

ぼくのかんがえたさいきょうのえろさいとの舞台裏

Acme::MineChan

マインスイーパーを解決するプログラム

Managing A Band of Hackers

  • ハッカーの特徴
  • 一人では生きられない
  • 物事に飽きやすい
  • 興味を優先する
  • 朝遅い
  • 空気読めない
  • ほかにもマネージメントの進め方みたいな話。一番参考になったかも

Yokohama.vim #2

座談形式Vim勉強会
2011/09/25 13:00 〜
http://atnd.org/events/19649

キーマッピングを考える by tsukkee

:help ,
submode.vim

https://github.com/kana/vim-submode
状況によってマッピングを変更したり

arpeggio.vim

https://github.com/kana/vim-arpeggio
同時押しをサポートしている。
実装がおもしろいよ

Shougoさん発表

いろいろ

Vimテクニックバイブルの中から良いと思うネタはどれ

ぼくがさいきょうとかんがえているちっぷすはとりあげられませんでした。

感想

Yokohama.vimは、参加者全員でつくる形の勉強会だから、
なかなかコントロール難しいよね、とか、思ったりしたのでした。
単純に発表オンリーなら、よりコントロールしやすくなるけど、それがYokohama.vimなのだ。

開発環境勉強会 2011/08/07

地震で延期して、なんとなく行けることになってしまった開発環境勉強会いってきました。
何故か、難度高め。

グリー株式会社 2011/08/07 12:00-
http://partake.in/events/afe6657b-b54c-44d2-8af5-d39e98e6f2bd

XMonadv by @pi8027

  • 設定の進め方とか

Vim愛について by @ShougoMatsu

  • 途中で意識が飛んだ
  • Vimテクニックバイブル

http://nanasi.jp/articles/howto/note/vimtech-150tips-book.html

スーツとEmacsと開発環境 by @kiwanami

  • 交通費が会社から出ているんだって
仕事
  • 謝罪、消火
  • 技術、人員調整
  • 受注前活動
開発環境どっち使うみたいな
  • レガシー vs モダン
  • 開発環境に時間がかかるなら、
Cacoo

ベンチマークドリブン開発の話 by @nyaxt

  • 無駄なツールを入れないで、作業に集中できるように
  • 現実逃避しづらくする
ベンチマークドリブン開発
  • テストドリブンとの違い。性能を重視のすすめかた
  • 性能の変化をみて、何か問題が起きていないかを調べる方法の提唱。
  • モチベーションを維持しやすくなる
  • Loboというツールが良いらしい。

xkeyremapについて by @m2ym

  • 入力を横取りー
  • キーコードを書き換え
  • 異常終了時の対応などがまだTODO
  • 「みなさんのMacbookにはGentooが入ってると思いますが」

(途中抜け)

貧者の入力デバイス by @todesking

  • 「キーボードを切りました」