すごい広島 95 に参加してきました。
事前に呼びかけてみたら、NVDAユーザ会広島の関係者が、私を含めて3人集まりました。
やること宣言した作業は NVDA 日本語版の点訳エンジンに関する下記の検討でした。
日本語点訳で (日) と (火) の区別がつかない
NVDA 日本語版のソースコードは Git で管理されています。
また、NVDA 日本語版に含まれている日本語点訳エンジンにはテストコードが用意されており、なにか修正をしたときに、いままでうまくいっていた点訳の事例を壊さないように作業をしています。
テスト駆動開発の理念を尊重して作業しています。
いわゆる「デグレード」を避けるべき理由はいろいろあるでしょうが、不具合が増えてしまうと、それを嫌って「古いバージョンをわざわざ使う人」が増えてしまいます。
NVDA 本家版はそのようなことがないように努力しているのがわかるので、日本語版もそうしたいと思います。
私がこの日にやった作業は以下のような感じでした。
- 点訳エンジンのテストを実行して、既存のテストケースでエラーが出ていないことを確認
- 報告があった「不具合の事例」をテストケースに追加
- 追加されたテストケースで、テストを実行して、そこだけが新しいエラーになることを確認
本当はエラーが出ているのでコミットするべきではないですが、作業手順の説明とバックアップのためにコミットされました。
帰宅して数日のうちにもうひとつのコミットを行い、この時点でエラーの数は0に戻りました。
作業はチケットに対応するトピックブランチ ti34973 で行い、作業が完了してから master にマージされました。
この作業をしたレポジトリは通称 miscDepsJp と呼んでいるもので nvdajpmiscdep という名前で管理されています。
この miscDepsJp レポジトリは nvdajp 本体のレポジトリから submodule として参照されています。
NVDA 日本語版の実行ファイルをビルドすることなく、miscDepsJp のソースだけで点訳エンジンの開発と単体テストが可能になっています。
修正の中身をすこし詳しく説明しておきます。
日本語点訳において(日)(火)などの曜日表記が、読み付与が間違っているためにどちらも「ヒ」になっていて、区別がつかない。
このような事例だけでも個別対応をして修正できないか、というのがいただいた要望でした。
日本語点訳の読み付与は Open JTalk の処理系に合わせて MeCab で行っています。
一般的には「日」や「火」という文字が出てくるたびにすべてを「ニチ」「カ」のように変換してしまうわけにはいかず、本来は文脈に応じた処理を行う必要があります。
もし文脈に応じた処理をしないと、たぶん既存のテストケースのどこかが壊れてしまうでしょう。。
今回はメーリングリストでいただいたアイディアを参考に、「(日)」のように「前後にカッコ、カッコとじがついている場合」だけ特別な対応をするという方針で作業をしてみましたが、実際には「記号」「一般名詞」「記号」という3つの形態素として処理されるべきなので、MeCab の辞書登録に加えて形態素解析結果の後処理で正規化(形態素の分割)を行って、なんとかつじつまを合わせています。
MeCab の辞書に単語を追加したので JTalk の読み上げにも影響が及ぶのですが、今回の作業の結果 JTalk の読み上げで「(日)」「(火)」は「ヒ」「ヒ」のままになっています。
音声読み上げについては音声合成に送られる前に句読点記号辞書が適用されるので、音声エンジンが受け取る前に「カッコ 日 カッコトジ」「カッコ 火 カッコトジ」のような文字列になってしまいます。
なので「(火)」のような単語を MeCab 辞書に追加しても、点訳エンジンに対してしか効果はありません。
以上、やった作業の簡単な報告でした。
NVDA 日本語チームのメーリングリストにおいて、日本語テキスト解析に関する開発には多くのひとが興味をお持ちのようなので、この部分に特化した開発をしていただくために、ソース、ドキュメント、ツールなどを整理したいと思っています。
複雑な作業であることにはかわりないので「誰でも開発に参加できるようになる」と期待されるとつらいですが。。
なお NVDA 日本語版のソースコード管理システムを github にまとめる作業を進めているところです。
ソースを github にコミットすると点訳エンジンのテストを自動実行する、いわゆる「継続的インテグレーション」などもやりたいと思っています。