目次
NVDA add-on
since 2012-05-09
nvda 2012.2 から導入されるアドオンの話。
基本的には zip で固めたプラグインやドライバ。
グローバルプラグイン、アプリケーションモジュール、音声ドライバ、点字ドライバなど。2012.2 からアドオンとしてパッケージ管理できる。
レポジトリ
翻訳チームが国際化をしているアドオンのレポジトリ
テンプレート
NVDA ページから移動した情報
点字ドライバ
since 2011-06-13
例えば brailleDisplayDrivers/brltty.py は brltty/brlapi のラッパー。
ドライバのベースクラスは braille.py にある BrailleDisplayDriver クラス。
brltty ドライバを理解する
遠回りかも知れないが。。
brltty http://mielke.cc/brltty/
brlapi http://brl.thefreecat.org/
http://mielke.cc/brltty/doc/Manual-BrlAPI/English/BrlAPI.html
音声ドライバ
Virtual synth driver
since 2011-07-14
言語ごとにエンジンを切り替える仮想音声ドライバの話。
中国語と英語の組み合わせで検討が進んでいる。
グローバルプラグイン
2011.1 から実装。
JAWS における SkypeWatch の実装がよくなかったので、同じようなことをもっと上手に、という話。
[NVDA-dev] [NVDA] #1323: Plugin development tutorial というチケットが出ているが、チュートリアルはないらしい。
globalPluginHandler を継承する。
nvda-dev 2011-01-10 の発言より:
#helloWorld.py #A simple NVDA Global Plugin example #Written by Hrvoje Katic <hrvojekatic******gmail.com> import globalPluginHandler import ui class GlobalPlugin(globalPluginHandler.GlobalPlugin): """ This is our plugin class, that must be present in order for plugin to work. It must be named exactly as shown above, otherwise the plugin will not be recognized by NVDA. """ def script_helloWorldScript(self,gesture): ui.message(_("Hello, world! To access main NVDA window, press Insert+n.")) script_helloWorldScript.__doc__=_("It's a very friendly script! It'll say Hello to you and will tell you some simple steps to get started!") #This description in a docstring form will be spoken while input help is enabled def terminate(self): """ Speaks the message at the moment when plugin is terminating on NVDA exit. """ return ui.message(_("The NVDA is terminating, so I am dieing...")) #: Now defining a dictionary with key bindings for this plugin __gestures = { "kb:NVDA+h": "helloWorldScript", #will execute our script on pressing control+shift+h keystroke }
アプリケーションモジュール
アプリケーションごとにプラグインを実現したい場合に使う。
appModuleHandler.AppModule を継承する。このクラスの docstring 参照。
http://www.nvda-project.org/documentation/developerGuide.html#toc9
notepad.py 拡張
since 2012-07-16
notepad.py をすこしいじって、編集画面だけを出力抑止できるか試してみる。
オーバーレイの remove はこういうときに使えばいいのだろうか。。
下記でできたと思ったが、Enter を押すと編集画面を読み上げてしまう。
import appModuleHandler from NVDAObjects.window import Window from NVDAObjects.window.edit import Edit class AppModule(appModuleHandler.AppModule): def chooseNVDAObjectOverlayClasses(self, obj, clsList): if isinstance(obj, Window) and obj.windowClassName == "Edit" and obj.windowControlID == 15: try: clsList.remove(Edit) clsList.remove(Window) except ValueError: pass
OCRプラグイン
since 2011-11-10
http://twitter.com/#!/jcsteh/status/133801412038635520
tesseract / leptonica というエンジンが使われている。英語のみ。
C:\Users\(ユーザ名)\AppData\Roaming\nvda\globalPlugins に ocr フォルダをコピーして NVDA-R で実行。
「パフォーミングオーシーアール・・・ダン」という声は聞こえる。
OCR プラグイン
nvda に書いたことの続き。
アドオン開発の準備として、やっていることを調べる。
グローバルプラグインで、キーが押されたときに何かをする:
nav = api.getNavigatorObject() # NVDAObjects.NVDAObject またはそのサブクラスが返る (api.py) # NVDAObjects.NVDAObject は NVDAObjects/__init__.py にある
NVDAObject には def event_typedCharacter(self,ch) ってのがあるが、ここでは余談。。
画像を認識してバッファーにブラウズモードのバッファーにテキストを突っ込む処理は makeTextInfo(self,position) が使われる。
# Let the user review the OCR output. nav.makeTextInfo = lambda position: OcrTextInfo(nav, position, parser) api.setReviewPosition(nav.makeTextInfo(textInfos.POSITION_FIRST))
class OcrTextInfo は textInfos.offsets.OffsetsTextInfo のサブクラス。
textInfos/offsets.py
class OffsetsTextInfo は textInfos.TextInfo のサブクラス。
アドオンの試作
since 2012-05-15
nvdajp_jtalk アドオンを試作してみた。まだ実行には成功していないが。。
manifest.ini:
name = nvdajp_jtalk summary = Japanese speech engine based on Open JTalk version = 12.05.15 author = Takuya Nishimoto <nishimotz@gmail.com> description = Japanese speech engine based on Open JTalk, developed by NVDA Japanese Team. url = http://en.sourceforge.jp/projects/nvdajp/
> dir /w [.] [..] [globalPlugins] manifest.ini [synthDrivers]
> 7z a ..\nvdajp-jtalk-120515.zip * > cd .. > move nvdajp-jtalk-120515.zip nvdajp-jtalk-120515.nvda-addon
みたいなかんじ。。
アドオンマネージャーでインストールするとこうなる:
> cd C:\nvda-portable\userConfig\addons\nvdajp_jtalk > dir > dir /w [.] [..] [globalPlugins] manifest.ini [synthDrivers]
既存の C:\nvda-portable\userConfig\synthDrivers などと独立してファイルが管理される。
manifest.ini の name はそのままディレクトリ名になる。
OCR Add-on
アドオンにしたことで特に変更はされていない様子。
http://open.salon.com/blog/the_weird_writer/2012/05/10/nvda_now_has_ocr_recognition
> move ocr_0.20120511.01.nvda-addon ocr_0.20120511.01.zip > mkdir ocr_0.20120511.01 > cd ocr_0.20120511.01 > 7z x ..\ocr_0.20120511.01.zip # globalPlugins/ocr/__init__.py の先頭で PLUGIN_DIR = os.path.dirname(__file__) を実行。 # これで globalPlugins/ocr のパスが取れている。
アドオンの国際化
2012-05-16
OCR add-on の国際化が nvda-dev で始まる。。
- locale-name フォルダ
- manifest.ini : 翻訳された manifest
- LC_MESSAGE フォルダ
- nvda.po : 翻訳されたメッセージ