since 2012-05-09
nvda 2012.2 から導入されるアドオンの話。
基本的には zip で固めたプラグインやドライバ。
グローバルプラグイン、アプリケーションモジュール、音声ドライバ、点字ドライバなど。2012.2 からアドオンとしてパッケージ管理できる。
翻訳チームが国際化をしているアドオンのレポジトリ
since 2011-06-13
例えば brailleDisplayDrivers/brltty.py は brltty/brlapi のラッパー。
ドライバのベースクラスは braille.py にある BrailleDisplayDriver クラス。
遠回りかも知れないが。。
brltty http://mielke.cc/brltty/
brlapi http://brl.thefreecat.org/
http://mielke.cc/brltty/doc/Manual-BrlAPI/English/BrlAPI.html
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
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
since 2011-11-10
http://twitter.com/#!/jcsteh/status/133801412038635520
tesseract / leptonica というエンジンが使われている。英語のみ。
C:\Users\(ユーザ名)\AppData\Roaming\nvda\globalPlugins に ocr フォルダをコピーして NVDA-R で実行。
「パフォーミングオーシーアール・・・ダン」という声は聞こえる。
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 はそのままディレクトリ名になる。
アドオンにしたことで特に変更はされていない様子。
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 で始まる。。