2009/10/26(月)ゆっくりしっぽ

UOSA のカスタムUI からはゆっくりさんにしゃべらせることはできなかったが、あきらめ切れなかったのでなんとなく作った。
Softail-0-1.png

サイドメニューの「ツール」からダウンロードしてください。

指定したファイルを見張り、追加された内容をゆっくりさんに渡す。
ゆっくりさんに [freebsd:jman:tail] -f させるから SofTail。

使い方:
ゆっくりさん は自分で用意してください。
  1. SofTalk の設定で、「引数をファイル名/オプションとして処理する」にチェックを入れておく
  2. 上の段の「入力ファイル」にゆっくりさんに読ませたいテキストファイルを指定します
  3. 下の段の 「SofTalk」に SofTalk.exe の場所を指定します
  4. Play ボタンを押すとファイルを見張ってゆっくりさんにしゃべらせ始めます
  5. Stop ボタンを押すと止まります
一番下の欄はデバッグメッセージです。気にしないでください。

要するに、UOSA のチャットログを指定するとゆっくりさんがそれをしゃべる。

他の用途に使えるかどうかは知らない。UOSA のログが UTF-16 で、SofTalk が UTF-16 を受け入れてくれるのでそのまま食わせてるだけ。漢字コードの変換や特殊な操作は何もしてない。

大事な注意:
β版どころかパイロット版です、エラー処理もバグ出しもしてません。たとえばテキストファイル、SofTalk.exe を指定しないで Play ボタンを押すと不正終了したりするかもしれません。
Play 状態のままファイルを切り替えるとよくないことが起きる気がしてます。
64bit 版 Windows7 で作りました。一応 32bit プログラムとしてコンパイルしていますが、他の環境で動くかどうか知りません。
SofTalk のオプションの変更はしないほうが実は簡単だけど、使い方をよくわからないまま作り始めたのでこうなってるだけ。
UTF-16 のファイルしか試してません。ていうか UTF-16 と他の文字コードを共存させるのって関数ごとちがうから超めんどくさそうで俺には無理っぽいんだけどなんかいい方法あるの?
たった今動くものができてろくに確認もせずに公開してます。

そんなモノですが試して笑っていただけると幸いです。



使ってみた。

UOSA のログは頭に日付、時間が付いているのでそれを読み上げられて邪魔。
-> なんとかしたいけど、PCRE と Boost の regex とどっちが便利なん?
ゆっくりさんのしゃべるスピードよりログが流れるスピードの方がものすごく速い。ヘイブンにいたらあっという間に5分くらい置いてかれた。
-> どうにもならんね
UO のキャラ名は英語だけど、ゆっくりさんは英語の人名の読み方なんて知らない。魔法のスペルなんて知る由もない。俺だって読めない。
-> 地道に辞書を編集するか、どこかで辞書を拾ってきてゆくりさんが読めるようにしてつっこむか。
そもそも SA クライアントはダメだ。
-> 多分ずっとそう。

ということがわかった。

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 な地図大募集中です。