NVDA add-on

since 2012-05-09

nvda 2012.2 から導入されるアドオンの話。

基本的には zip で固めたプラグインやドライバ。

グローバルプラグイン、アプリケーションモジュール、音声ドライバ、点字ドライバなど。2012.2 からアドオンとしてパッケージ管理できる。

レポジトリ

翻訳チームが国際化をしているアドオンのレポジトリ

https://bitbucket.org/nvdaaddonteam

テンプレート

NVDA ページから移動した情報

点字ドライバ

since 2011-06-13

例えば brailleDisplayDrivers/brltty.py は brltty/brlapi のラッパー。

ドライバのベースクラスは braille.py にある BrailleDisplayDriver クラス。

brltty ドライバを理解する

音声ドライバ

Virtual synth driver

since 2011-07-14

言語ごとにエンジンを切り替える仮想音声ドライバの話。

中国語と英語の組み合わせで検討が進んでいる。

http://www.nvda-project.org/ticket/279

グローバルプラグイン

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

http://www.webbie.org.uk/nvda/index.htm

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 で実行。

「パフォーミングオーシーアール・・・ダン」という声は聞こえる。

http://code.google.com/p/tesseract-ocr/

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 : 翻訳されたメッセージ
nvda_addon.txt · 最終更新: 2013/01/20 11:40 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0