nvdajp IME対応

2010-12-09 nvdajp のページから IME 関連の西本のメモを移動しました。

IME 関連の作業は @hoozukiyama さんと協力して行なっていました。

ATOK26UIComment

since 2013-03-12

そのうち続きをやるのでメモ:

class ATOK26UIComment(IAccessible):
        name=_("ATOK comment")
        role=controlTypes.ROLE_WINDOW
 
        def event_show(self):
                tones.beep(880,20)
                log.debug("ui comment show")
                log.info(self.basicText)
                log.info(self.displayText.replace('\x00', ''))
 
       def event_gainFocus(self):
                log.info(self.basicText)
                log.info(self.displayText.replace('\x00', ''))

nvda-dev-asia

since 2012-08-13

inputMethods ブランチ関連

候補文字列については記号読みレベルの設定に関わらず記号を読む(nvda/inputMethods: Rev 5272):

speech.speakText(result,symbolLevel=characterProcessing.SYMLVL_ALL)

中国語

Microsoft の技術情報

2010-01-26 コードレビュー

2010-01-26 Twitter 記録

  • 遅刻。nvdaControllerClientの話をしている。 #nvdajp posted at 19:35:48
  • source/NVDAObjects/IAccessible/IME.py ってのがあるよ、という話をしています。 #nvdajp posted at 19:54:32
  • http://www.nvda-project.org/wiki/DesignOverview をみんなで読んでます #nvdajp posted at 20:08:39
  • accesibility API : MSAA = IAccesible / IAccessible2 / Java Acc Bridge / UI Automation = SRはここから情報を得る #nvdajp posted at 20:12:39
  • native api : MSAAで取れない情報をとるために使用。カーソルの位置など。Operating System Functions : バッテリ残量など。どっちも win32 を叩いている? #nvdajp posted at 20:14:17
  • NVDA Components : オブジェクト指向、抽象化された設計。コンポーネント化。Core 初期化してメインループに。 #nvdajp posted at 20:17:36
  • API Handlers : APIの初期化や終了 source/IAccessibleHandler.py を眺めてみる。 #nvdajp posted at 20:22:35
  • 中国語対応しかけた残骸らしいです RT @toratorax: @nishimotz IMEに対応しようとした痕跡でしょうか #nvdajp posted at 20:24:11
  • source/NVDAObjects/__init__.py にあった。class NVDAObject これが全ての基本 #nvdajp posted at 20:29:56
  • MSAA がイベントを出すとキューに入って、eventHandler.executeEvent で実行される?イベントは event_ で始まる。event_gainFocus and event_nameChange など #nvdajp posted at 20:33:53
  • ツール>ログ閲覧。設定>一般設定>ログ記録>デバッグ でいじってみる。#nvdajp 日本語を入力する。ローマ字入力の keypress しか来てないことを確認。 posted at 20:48:59
  • IME.py に from logHandler import log を入れてみようとしたが実行環境で動かすところまでいかず、時間切れ。現在nvdajpは本家と別のレポジトリを持っている TODO:実行環境を作るマニュアル改訂 posted at 20:58:07

その後、MLではソースから実行環境を作る情報を更新。西本は勝手に pyaa に取り組む。

2010-02-16 IME候補読み上げに取り組んだ

2010-02-16 定例ミーティング

  • MS-IME 2002 の候補読み上げ。pyaa による実験で分かったウィンドウクラスとロールを NVDAObjects/IAccessible/init.py に反映させてみる
  • ソースはTABコードでインデントされていることに注意。
  • 実行するときは python generate.py してから python nvda.pyw を行う。
  • ログ閲覧で print 文の出力を読める。その他に 1/0 を実行してエラーを出すテクニックも。

成果

  • とりあえず IME.py の init() は候補選択ごとに呼ばれている。
  • ここで _get_value() して speech.speakText() する。スペースバーを3回くらい押すとしゃべり始めることが確認できた。
  • ログ閲覧には1回目からprintされているので speakText() の問題ではないか?

注意:以下の設定が正しくないと再現できない

  • 「コントロールパネル」→「地域と言語のオプション」を表示させる
  • 「言語」タブに移動し、「テキストサービスと入力言語」を開く
  • 「規定の言語」を「日本語 - Microsoft IME Standard Ver.8.1」に設定する
  • 「詳細設定」タブに移動し、「詳細なテキストサービスをオフにする」チェックボックスのチェックをはずす
  • 「詳細なテキスト サービスのサポートをプログラムのすべてに拡張する」のチェックボックスをチェックする

今後の課題

  • appModules/ : ここに置いたファイルが自動的に読み込まれる。appModules をもうちょっと研究してみる?
  • speech モジュール。キューイングされているから1回目と2回目を読まない?
  • TSFに取り組まないとVista/7対応や新しいIME対応が難しい。COMラッパーを作れるように。。
  • 詳細読み辞書を組み込む。田町読み?

Twitter 記録

  • 今夜はNVDA日本語化プロジェクトの定例ミーティングに行ってきます #nvdajp posted at 13:01:16
  • NVDA日本語化プロジェクトのミーティング。西本からの報告終わり。これから本家のソース読み #nvdajp posted at 20:03:01
  • pyAA による実験で分かったウィンドウクラスとロールを NVDAObjects/IAccessible/__init__.py に反映させれば IME2002 の候補を読めるんじゃない?という話に #nvdajp posted at 20:28:17
  • 不完全ながらMS-IME2002の候補を読み上げ始めた! #nvdajp posted at 21:33:01

メモ

import 文が読み込んでいるソースファイルのディレクトリ階層はトップからの絶対位置。 ただし from . import の場合は当該ファイルからの相対位置。

NVDAObjects/IAccessible/__init__.py

363行
		elif windowClassName.startswith('Mozilla'):
			mozCls=__import__("mozilla",globals(),locals(),[]).Mozilla
			clsList.append( mozCls)

この __import__ の意味:
mozilla.py のなかの Mozilla クラスをインポートして clsList に追加する

1394行

###class mappings
_staticMap={

1394行
	("mscandui21.candidate",oleacc.ROLE_SYSTEM_PUSHBUTTON):"IME.IMECandidate",

どうやら mscandui21.candidate と IME.py はアジア圏のIME対応を試みたが成功しなかったときの残骸らしい。

西本が調べた情報によると "MSCandUIWindow_Candidate" と ROLE_SYSTEM_LISTITEM が IME2002 の登録に必要なクラス名とロールID。

これをやってみたのが今回のパッチ。

IMECandidate: event_objectSelection は入れてみたが、このメソッドは呼ばれていない。

2010-02-16 のパッチ

(ソースはnvdajpのsvnレポジトリ)

Index: NVDAObjects/IAccessible/IME.py
===================================================================
--- NVDAObjects/IAccessible/IME.py	(revision 65)
+++ NVDAObjects/IAccessible/IME.py	(working copy)
@@ -5,6 +5,13 @@
 
 class IMECandidate(IAccessible):
 
+	def __init__(self, *argv, **kw):
+		super(IMECandidate, self).__init__(*argv, **kw)
+		name = super(IMECandidate,self)._get_value()
+		if name is not None:
+			print "IMECandidate: " + name
+			speech.speakText(name)
+		
 	def _handleNewCandidate(self):
 		oldNav=api.getNavigatorObject()
 		if oldNav.windowClassName!=self.windowClassName:
@@ -20,3 +27,7 @@
 	def event_stateChange(self):
 		if self.event_objectID>=1 and self.event_objectID<=9:
 			self._handleNewCandidate()
+	
+	def event_objectSelection(self):
+		print "IMECandidate: event_objectSelection"
+		self._handleNewCandidate() # nvdajp
Index: NVDAObjects/IAccessible/__init__.py
===================================================================
--- NVDAObjects/IAccessible/__init__.py	(revision 65)
+++ NVDAObjects/IAccessible/__init__.py	(working copy)
@@ -366,6 +366,9 @@
 		elif windowClassName.startswith('bosa_sdm'):
 			sdmCls=__import__("msOffice",globals(),locals(),[]).SDM
 			clsList.append(sdmCls)
+		elif windowClassName.startswith('MSCandUIWindow'): # nvdajp
+			sdmCls=__import__("IME",globals(),locals(),[]).IMECandidate
+			clsList.append(sdmCls)                           
 		if windowClassName.startswith('RichEdit') and winUser.getClassName(winUser.getAncestor(windowHandle,winUser.GA_PARENT)).startswith('bosa_sdm'):
 			sdmCls=__import__("msOffice",globals(),locals(),[]).RichEditSDMChild
 			clsList.append(sdmCls)
@@ -1391,6 +1394,7 @@
 	("AVL_AVView",oleacc.ROLE_SYSTEM_TEXT):"adobe.AcrobatTextNode",
 	("AcrobatSDIWindow",oleacc.ROLE_SYSTEM_CLIENT):"adobe.AcrobatSDIWindowClient",
 	("mscandui21.candidate",oleacc.ROLE_SYSTEM_PUSHBUTTON):"IME.IMECandidate",
+	("MSCandUIWindow_Candidate",oleacc.ROLE_SYSTEM_LISTITEM):"IME.IMECandidate", # nvdajp
 	("SysMonthCal32",oleacc.ROLE_SYSTEM_CLIENT):"SysMonthCal32.SysMonthCal32",
 	("hh_kwd_vlist",oleacc.ROLE_SYSTEM_LIST):"hh.KeywordList",
 	("Scintilla",oleacc.ROLE_SYSTEM_CLIENT):"scintilla.Scintilla",

2010-03-08 ミーティング

  • NVDAの詳細読みを中村さんが実装した話。田町読みをpythonのdictionaryで実装。VistaとIME2007でスペースを2回押したら読んでくれる感じの状況 #nvdajp posted at 19:21:27
  • 本家NVDAがbzrに移行した話。我々もbzrで作業した方が本家とのマージが楽になるはず。sfjpのbzrホスティングを使うか?Windowsのbzrエクスプローラは良くできてるが読み上げ非対応。。 #nvdajp posted at 19:26:21
  • bzrのレポジトリを作るときnvda本家のブランチはそのまま取り込んでjpブランチを別途作って行くのが将来マージしやすいのでは #nvdajp posted at 19:31:31
  • 中村さんの実装:文字コードのエラーは本家で解決。IME2002では候補文字列をget_valueしていたがget_nameにすれば2007で動く。上下カーソルとスペースで挙動が違うなど #nvdajp posted at 19:39:39
  • speech.speakText() で喋らせれば読み上げ中のキー操作でちゃんと音切れする。Vistaの標準IMEだとget_nameはうまくいかない。ウィンドウクラスでIMECandidateを場合分けするか #nvdajp posted at 19:49:13
  • 田町読みがGPL互換ではなさそうなのでどうしようという話 #nvdajp posted at 20:09:11
  • python の unicodedata.normalize が記号の読み上げに使えるかも、という話 http://bit.ly/b1w3aV #nvdajp posted at 20:21:07
  • #nvdajp 参考 Unicode::Normalize で遊ぶ - daily dayflower http://bit.ly/c4NYfv posted at 20:24:57
  • GPL互換の詳細読み辞書が手に入るまでダミー辞書で開発をしようという話 #nvdajp posted at 20:29:35
  • IAccessibleを継承したクラスを毎回 __init__ してていいのか。TSFの検討は並行して進める。オープンソースカンファレンス再参加の検討 #nvdajp posted at 20:50:49

TSF 対応を NVDA に組み込む

text_services_framework ReadComp の処理を取り込む。

どうやら共有メモリの処理が必要。

成果はこちら:

http://files.nishimotz.com/ReadCompPython-100321.zip

コマンドプロンプトで一番上のディレクトリにある readcomp.py を実行すると 30秒、数字が表示されつづけます。 その間にメモ帳を開いてかな漢字変換をすると、そのたびにイベントが呼ばれた回数が インクリメントされて数字が増えます。

ポイントは rcomplib.dll で共有メモリを使って、メモ帳・IME・TSFのプロセスが 書き換えた情報を、Python 側のプロセスで読めるようにしたところです。

C++のプロジェクトは rcomplib のデバッグビルドしか使っていません。

2010-04-12 コードレビュー

  • bzrレポジトリの状況報告。リビジョン3403までが本家。3404以上が日本語関連。sf.jpのbzrでは(root)/nvdajpの下の階層作成には認証が必要? #nvdajp posted at 19:28:43
  • mainは本家+安定した日本語版。projectは開発版。なんかしっくり来ないな。ブランチ使うんだろうが、bzr branch は svn checkout のような機能? #nvdajp posted at 19:36:35
  • 田町読みのライセンスをGPL互換にしてもらうお願いをする。当面はBEPの詳細読み辞書を開発用に使う。 #nvdajp posted at 20:32:14
  • TSFの未確定文字を抜き出すDLLの試作。処理をどこに突っ込むか。keyboardHandler.pyを読む #nvdajp posted at 20:46:52
  • winInputHook.pyでキーイベントのフック処理。WINFUNCTYPEでコールバック関数もPythonで書けるのか。core.pyに初期化処理。 #nvdajp posted at 21:09:51
  • appModulesの中身のベースクラスはappModuleHandler.pyにある。ここではプロセスの名前をチェックしてフックをかけるなど #nvdajp posted at 21:22:49

2010-06-19 ミーティング

技術的なメモ

  • IEのテキストボックスでキーイベントが起こらない。別スレッドでループを回して監視することも必要
  • 他の処理が重いときに音がでないことがあるかも。TTSの選び方、CPU性能による?
  • APIとしては IMM 系と TSF 系を両方使わざるを得ない。
  • 閲覧時の1文字読み上げ?本家には数字キー2を2回押すとアスキーコード読み上げという機能がある。これを流用?
  • 共有メモリを使う方法はやめて、RegisterGlobal 系を使っている。
  • とうとう音声合成エンジンが次のマイルストーンになりそう

Twitterでの発言

  • ぼちぼち #nvdajp の話が始まる。IMEの入力中のキーエコーも変換候補の読み上げも技術的にはできてきた。いま渡辺先生が ITRC の説明中 posted at 16:05:02
  • 「JAWS or nothing の状況をなんとかしたい」(笑) #nvdajp posted at 16:11:53
  • 改正JIS「アクセシビリティ・サポーテッド」が日本だけガラパゴス化しないためにNVDAのようなスクリーンリーダの存在が必要 #nvdajp posted at 16:13:17
  • フォネティック読みが未実装であることについて。まだ本家にも実装されていないという話 #nvdajp posted at 16:37:33
  • アスキーコードを読み上げるキーバインドがある。これを乗っ取って日本語の詳細読みをしてはどうか、という話 #nvdajp posted at 16:38:37
  • 8月末までに gtalk の DLL 化と naist-jdic (ipadic) への移行をしようと思っている私 #nvdajp posted at 16:43:49
  • 記号の読み方。本家はTTSエンジンまかせ。日本語では独自に辞書を持つべきという話。ローマ字文字列の読み下し? #nvdajp posted at 16:48:24
  • 本家の中国語対応のチケットの話 #nvdajp http://www.nvda-project.org/ticket/635 posted at 16:50:34
  • 女子大生が帰る前にデモをしてもらう #nvdajp posted at 16:51:35
  • 日本語IME対応のアルファ版を6月末に出そうという話 #nvdajp posted at 17:09:20
  • Flashにも対応してWAI-ARIAにも対応しているオープンソースのスクリーンリーダの日本語対応。正式版のリリースのときには積極的に宣伝するべきという話 #nvdajp posted at 17:11:22

2010-06-30 日本語アルファ版

2010-07-04 開発ミーティング

Togetter によるまとめ: http://togetter.com/li/33404

ブログ記事 http://d.nishimotz.com/archives/576

2010-08-20 日本語ベータ版

2010-10-29 最初のコミット

~nvdajp/nvdajp/2010.2 ブランチの 3875

http://bazaar.launchpad.net/~nvdajp/nvdajp/2010.2/revision/3875

2010-12-30 2010.2j からの変更?

MS-IME 2002 の未確定文字の読み上げが、私がいじっているバージョンで
いつのまにか動かなくなっていることに気づきました。

少なくとも 2010.2j ポータブルでは上手く動いているので、
対応するブランチを探してみました。

http://bazaar.launchpad.net/~nvdajp/nvdajp/2010.2/changes
3876までが10月29日。3877が11月5日。
リリースされた 2010.2j は 3876 ベースだと思うのですが。

bzr branch lp:nvdajp/2010.2 nvdajp_2010_2_r3876 -r 3876
bzr branch lp:nvdajp/2010.2 nvdajp_2010_2_r3877 -r 3877

Windows XP SP3 +メモ帳+ MS-IME 2002 の環境で
この2つを比べたところ、3876 では問題がなく、
3877 では未確定文字の読み上げができない、という状況。
ちなみに、どちらもメニューが日本語ではなく英語になります。。

リリースされた 2010.2j は 3876 ベース

以下、nvdajp-dev ML でフォローしていただいた情報:

●2010.2j の履歴については次のリンクを参照してみて下さい。
https://code.launchpad.net/~nvdajp/nvdajp/2010.2

●MiscellaneousDependenciesの履歴については次のリンクを参照してみて下さい。
https://code.launchpad.net/~nvdajp/nvdajp/MiscellaneousDependencies

●リリース後の最新更新版は以下の組み合わせです。
~nvdajp/nvdajp/2010.2 : 3879
~nvdajp/nvdajp/MiscellaneousDependencies : 21

メモ

※本家NVDAのソースにIMEの最新版を反映するには。。。
1.core.py のIMEの一部修正
2.source/nvdajpime.dll はMiscellaneousDependencies : 21 のものを使用
3.source/nvdajp_ime.py は2010.2 : 3879 のものを使用
4.source/nvdajp_keyEvents.py は2010.2 : 3879 のものを使用

nvdajpime.dll について。

ファイルサイズ 54784 バイトのバージョンが過去に存在した。

http://bazaar.launchpad.net/~nvdajp/nvdajp/MiscellaneousDependencies/files/head:/source/

にあるものはファイルサイズ 20480 バイト

lp:~k-tsuzi/nvdajp/main k_tsuzi

上記の 20480 バイトの nvdajpime.dll と組み合わせたらちゃんとIME読み上げできた。

リリースされている 2010.2j は 20480 バイトの nvdajpime.dll

2010-12 課題

1.64ビットOS対応
選択肢としては、以下のいずれか?
●64ビットベースでの対応
●32ビットベースでの対応

2.日本語ON、OFFのタイミング修正
●取得タイミングの問題、イベントトリガーの見直。

3.TSF、IMM32の切り替えスイッチの検討
●WinXPで動作させる場合の検討課題。

4.他スクリーンリーダーとの連携
●入力読み上げON、OFFスイッチの検討
※サブスクリーンリーダーとしての使用を想定

nvdajp_ime.txt · 最終更新: 2013/03/12 17:19 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