NVDAjp 2010.2に向けて開発メンバーは作業を進めています。
ここでは私の作業状況を簡単にお知らせします。
2010.2 ベースの JTalk の話速を速くする実装の目処は立っており、 bazaar のレポジトリ
lp:~nishimotz/nvdajp/with_jtalk
rev.3531 として launchpad.net に置いてあります。
ただし、このレポジトリには zjtalk.py と jtalk.py の2つのエンジンがあり、(内部の実装はどちらも _jtalk.py です)zjtalk のほうは音声設定で話速のスライダーが出てきます。
jtalk.py のほうは話速設定がうまくできません。話速設定のために supportedSettings をいじると espeak が起動時エラーで落ちます。
なぜ espeak に影響が及ぶのかいまだに不明なのですが、zjtalk.py にリネームしたら解決したので、クラスを読み込んで初期化する順序に依存する問題と思われます。この現象は silence.py で試しても同じでした。
それから NVDAjp そのものではないのですが、10月の開発ミーティングの後の交流会の議論を踏まえて
「読み上げの改良のための情報を集めるサイト」
を試作しました。
Python でなく Ruby on Rails で作ってますが(笑)
こちらについても時間ができたら改良に取り組みたいので、御意見を伺えれば幸いです。
追記(11月15日)
10月30日に 2010.2j がリリースされています。
話速設定については将来のバージョンで追加される予定です。
タグ: python
-
NVDAjp 2010.2に向けて
-
NVDAのための音声エンジン
NVDA日本語版は先日「ベータ版」という形で新たに公開されました。
http://accessibility.mitsue.co.jp/archives/000256.html
ベータ版に間に合わなかった音声エンジンの方を私が頑張ってるところです。。
8月末までにNVDAのための音声合成をやると宣言したのですが、とうとう今日で8月も終わりです。
New BSD ライセンスで公開されているエンジン Open-JTalk を Python から ctypes 経由で叩けるようにする作業を進めてきました。
さきほどやっと speak や stop などの基本コマンドが動くようになりました。
いまのところ成果は github の私のレポジトリにあります:
http://github.com/nishimotz/libopenjtalk
この中の lib というサブディレクトリが DLL 関連です。
cygwin gcc-3 の minGW 互換モードで DLL を作っています。
Python は cygwin 版 2.5 と Win32 版 2.6 の両方でチェックしています。
(ただし後述の nvwave.py の制約で cygwin 版 2.5 には非対応になりました)
ただし、技術的な制約で、open-JTalk に組み込まれている mecab (形態素解析エンジン)を使わず、単独で配布されている Win32 版の mecab DLL を組み合わせて使っています。(そのほうがライセンスも管理しやすいはず)
今後の拡張性や保守性を考慮して、オリジナルのエンジンが main 関数でやっている処理を python でほぼ実装しなおしました。
もともと Open-JTalk は HTS_Engine_API の中でオーディオ出力を行っていたようです。しかしスクリーンリーダのためには(音声対話システムであっても)「再生中の音声を自由に止める機能」が必要であるため、HTS_Engine_API 側のオーディオデバイス処理は(configureのオプションで)無効化しました。
ctypes でポインタやダブルポインタを渡す処理を苦労して書きましたが、Python 側にバッファのメモリ管理をやらせるとハマりやすい、ということが分かったので、DLL 側で malloc のラッパー関数を作ってごまかしつつあります。あとでメモリリーク対策が必要になりそうですが。。
NVDA が espeak の中でどのようにオーディオを叩いているかも調べました。(ctypesの参考になりました。。)
http://ja.nishimotz.com/espeak
Windows マルチメディア API で音声出力する部分が nvwave.py という Python のコードでコールバック処理もふくめて実現されています。
驚きでした。
この NVDA 的なやり方を見習って jtalk.py の実装を行いました。ただし DLL から音声波形をコールバックで受け取るのではなく、生成された波形をまとめて nvwave の player に渡しています。
この _espeak.py の実装では、メインスレッドとバックグラウンドスレッドでコマンドキューを共有し、バックグラウンドのスレッドがキューの再生を行っています。さらに stop 命令を受け取ると、キューの中で「時間がかかる処理」だけを削除し、モードの切り替えなどの処理はキャンセルしないで順次実行する、ということになっています。
このような処理は私が「ウチコミくん」で最初に Visual Basic Ver.6 で実装し、そして Galatea Dialog Studio でも実装したものです。
懐かしいような嬉しいような気もします。
そして Python という言語の奥の深さを感じます。
残った仕事は synthDrivers を継承して NVDA 用のドライバークラスを書くことです。
スクリーンリーダーに統合して、安定して動けばいいのですが。。
今回つくった音声合成エンジンでは、かなり多くの部分を Python で実装してあるので、例えば文字列の前処理くらいなら簡単にカスタマイズできそうです。
明日の夜は久しぶりに NVDA 日本語化プロジェクトの開発ミーティングです。 -
NVDA日本語アルファ版
6月30日にスクリーンリーダNVDA日本語化プロジェクトは「日本語アルファ版」をリリースしました。
このバージョンには限定的ながらも日本語IMEの読み上げに対応する機能が実装されました。
この件についてミツエーリンクスさんのブログでも紹介してくださいました。
昨日は開発ミーティングを開催しました。参加者は会場 3人+Skype 1人でしたが Ustream や Twitter で公開して様子をみていただきました。
Twitter発言のまとめはこちらです。
Google Groups に nvda-japanese-users というメーリングリストが開設されています。興味のある方はご参加ください。よろしくお願いします。
(さらに…)