2009/10/24(土)SofTalk

ゆっくりさん こと SofTalk。
「カスタムUIでゆっくりさんにしゃべらせよう」計画で、毎回プログラムを起動するのが気持ち悪い気がして、でもゆっくりさんは標準入力から読み込んでくれたりはしないようなので自前でライブラリとして使えるものを作ってみようと思った。
読み上げライブラリはフリーで使用可能なものが使われているので、与えられた文字列をひらがなに直す部分だけつくればいい。漢字の逆変換は Win32 の imm* 関数を使い、英数字は固定で読み方を振ってしまえば出来るんじゃないか、と。

が、SofTalk に付属の yomi.html を読んであきらめた。
読みの判定の際に形態素解析までつかってる?
まぁ、そうしないとかなりでたらめな読みになっちゃうわなぁ。
...と思ったけどプログラムのサイズ的にそこまではしてないのか?

参考:
商業利用もされている形態素解析エンジン: MeCab
BSD ライセンスでも利用できる。

2009/10/23(金)BOD管理CGI

UOA のベンダーエージェントデータによる一括入力を、本日 10/23 のパッチでローカライズされた分に対応しました。
以前からそうですが、ローカライズされていないデータも受け入れ可能です。

ページ自体の表記もローカライズに対応したほうがいい気がしてますが、女性用皮鎧のローカライズが入ってバルクオーダーに使われるアイテムの全てがローカライズされたらやります。
この変更を実装する際にはちょっとめんどくさい作業を行う予定なので、今のように気づいたら 10分足らずで作業完了というわけにはいかないはずです。
うまい方法を考え付くか、ローカライズデータを外部ファイルにしてデータ構造を自動生成するというめんどくさい方法でやるか、単純に 日本語->英語 と 英語->日本語 の2つの辞書をハードコードで持つようにするかを本気度 0% で悩み中です。

2009/10/22(木)UOSA のチャットログ

UOSA ではカスタムUI というユーザーがインタフェースをカスタマイズできる枠組みがある。
で、あれやこれや出来ないかと考えてました。
UO のチャットの内容をゆっくりさんが読み上げたら面白いんじゃないか、と。

いろいろ調べて、出来るんじゃないかなーと思ったのですが、(まだ?)カスタムUI について充分な文書が公開されてないようでよくわからん。XML エレメントの親子関係からしてよくわからん。

が、どうも UOSA はチャットログがまともに動くようで、書き出しのタイミングもかなり緻密に逐次書き出している。相変わらず UTF-16-LE ではあるが、ざっと見たところ正しい UTF-16-LE であるようだ。
であれば、FindFirstChangeNotification() でログファイルを見張って更新があったらゆっくりさんに渡す、という外部プログラムでやるのが簡単なんじゃないかと気づいてしまった。
で、その手の「ファイルを見張ってゆっくりさんが読む」という類のものはすでに誰かが作っているだろう、とも。

UOSA のカスタムUI でやるとしたら:
Interface.lua で
hYukkurisan = io.popen("SofTalk.exe", "w") 
しておいて、
UO_ChatWindow/Source/ChatWidows.lua の ChatWindow.UpdateNewTextAlert() を改造して、
numLogEntry = TextLogGetNumEntries("Chat")
LogEntry = TextLogGetEntry("Chat", numLogEntry)
LogText = WStringToString(LogEntry.text)
hYukkurisan:write(LogText)
hYukkurisan:flush()
追記: SofTalk.exe は標準入力を食べないのでこれじゃダメ。

みたいな?と思ったけどさすがに io や os モジュールは使えないようだ。package とかも無理だった。
外部プログラムを呼び出せるようなものは禁止されてるようなので、「カスタムUI でゆっくりさんにしゃべらせよう」計画はこれでおしまい。


ちなみに UO のカスタム UI は、
  • 見た目は XML
  • 動作は Lua
でいじれる。Lua インタープリタのバージョンは 5.1 でした。

カスタムUI をいじる場合は、
<Include file="Source/DebugWindow.xml" />
<Script file="Source/Debug.lua" />
WindowSetShowing("DebugWindow", true)
DebugWindow.logging = true
しておくと便利だと思います。

2009/10/21(水)ミス

ロザリオのトレハン引退のために、今まで掘った分をさっさと古地図の壁掛にしてしまおう、ということで足りない Lv3 地図を集めていたけどなかなか集まらず、残り一枚のところで放置してた。
と、新・トレハンテイマ たるぼのバンクボックスを見ると、かつて武士盾だった頃に拾っておいた大量の地図を発見。ほとんどが Lv5, Lv4 だったけど一枚だけ Lv3 を見つけた。
これで壁掛の必要枚数がそろった!

ということで掘り掘り。Lv3 なので事もなく掘り終わり、壁掛作成。
「あなたが解読した Lv1 の地図が足りません」。
むむむ、使えないものはよけておいたはずが混ぜてしまったか。しょうがないので Lv1 を追加しながら作成。1枚ずつ追加しながら試していけば、作成成功したときに残ったやつが壁掛に使えない地図だとわかるって寸法です。手持ちの分を 3枚追加したけどまだ足りないようなので掘りつつ追加。

と、2枚掘ったところでおかしい、と気づく。確か前に作ったときは、使えない地図は 3枚くらいだったはずだ。5枚追加しても足りないというのはおかしい。
ふむむ...。

あ、俺たるぼだった。ロザリオで掘らなきゃダメじゃん。
ハイ、Lv3 4枚集めなおしー。

adeptedly な地図大募集中です。