先日、この日記書きのフォーマットを変えてから、今まで使っていたひとつの記事を括る div 要素周りのあれこれ(何)を自動で書いてくれる xyzzy の lisp が使えなくなっていて、手で書くというやたら面倒なことをしていたら日記が書けなくなっていたので、これではいかんということでなんとかこれまで使っていたものを改造して、今使っているものに合うようにしてみた。
実行すると、以下のような文字列を自動で吐き出してくれます。
<div class="section" id="diary_040426b">
<h3 class=""></h3>
<p class="topic-info">この記事の永続的URI : <a href="0404.html#diary_040426b">http://diary.noasobi.net/0404.html#diary_040426b</a></p>
</div><!-- [topic end] -->
Lisp は以下のとおり。
;;; -*- Mode: Lisp; Package: User -*-
(defvar *mydiary-id-format-pattern* " <div class=\"section\" id=\"diary_%y%m%d\\(.\\)"
"id のフォーマット")
(defvar *mydiary-change-of-day-hour* 0
"日付の変わる時間")
(defvar *mydiary-cursor-pattern* "${cursor}"
"テンプレート挿入後のカーソル位置")
(defvar *mydiary-sequence-pattern* "${seq}"
"テンプレートで連番に置換される")
(defvar *mydiary-section-start-pattern* " <div class=\"section\""
"テンプレートでの section の開始パターン")
(defvar *mydiary-template*
" <div class=\"section\" id=\"diary_%y%m%d${seq}\">
<h3 class=\"${cursor}\"></h3>
<p class=\"topic-info\">この記事の永続的URI : <a href=\"%y%m.html#diary_%y%m%d${seq}\">http://diary.noasobi.net/%y%m.html#diary_%y%m%d${seq}</a></p>
</div><!-- [topic end] -->
")
(defun mydiary-succ (c)
"mydiary: 連番生成関数(超簡易版)"
(cond ((characterp c)
(string (code-char (1+ (char-code c)))))
((stringp c)
(mydiary-succ (char c 0)))
(t
"a")))
(defun h3 ()
"mydiary: 日記テンプレート挿入関数"
(interactive "*")
(let* ((now (- (get-universal-time) (* *mydiary-change-of-day-hour* 60 60)))
(id (format-date-string *mydiary-id-format-pattern* now))
(opoint (point))
(seq))
(save-excursion
(when (scan-buffer *mydiary-section-start-pattern* :regexp t :reverse t)
(scan-buffer id :regexp t :limit opoint)
(setf seq (match-string 1))))
(save-excursion
(insert (substitute-string (format-date-string *mydiary-template* now)
*mydiary-sequence-pattern*
(mydiary-succ seq))))
(replace-buffer *mydiary-cursor-pattern* "" :reverse t)))
オリジナルは、xyzzyでタグ打ってる人の数 →の566さん作です。改めてありがとうございます。>556さん
なんか、適当な xml でもでっち上げて日記を書いて、それを xslt で html に仕立てたほうが、いいかなという気もしましたが、こっちの方が早いし、せっかく xhtml で書いているんだから、それを使わないのももったいない気がしたり。:p)
サーバを移転しました。この日記が見えれば DNS が浸透したということです。なんか忘れていることがあるかもしれないので、どっか不都合があるかもしれません。
昨日、久々に山へスキーしに行ってきました。行ったのは、小日向のコルというところです。白馬岳登山の基地、猿倉のすぐ上の山です。
通常は猿倉まで車が入るのですが、今はまだ道が通行止めになっていてずっと下の二股というところから歩いて入りました。道の除雪はすでにほぼ完了しているのですが、まだ雪崩などの危険があるということでしょうか。道の所々に落ちてきたばかりの雪のブロックが散乱しているところもありました。開通は5月1日とのこと。
8時に歩き出して、途中一度休憩を入れて9時半頃猿倉に到着。スキーとスキー靴を背負っているのでいやなアプローチでした。:p) 帰りもまた同様に歩かないといけないのでげっそり。雪があればスキーで降りて来れるのですが…。
猿倉より、スキーにシールを貼って登行開始。1時間程度で、猿倉台地に到着。下は結構いい天気だったのですが、上がるに連れて曇ってきました。高い山はガスの中で、白馬岳も上は見えません。時折、激しい風も吹き出し、ゴォーと唸りをあげています。風の吹く向きと上空の雲の流れは無関係のようで、風が回っているようです。
猿倉台地までは、シール登行だったのですが、ここからはやや斜面が急になるのと、雪は結構しまっているので、ツボ足にアイゼンの方がはかどるだろうと判断してまたスキーを担ぎます。
コルについて、コルの向こう側へ回れば、風はないのではないかと期待していたのですが、そんなことはなく、やはり時折強い風が吹いていました。ダケカンバの木の根元に穴を掘って風を避けるようにして、宴会タイム。何しろ寒い。グローブをしてオニギリ食べました。:p)
帰りは滑走の楽しみがあるのですが、どうも前夜に雨が降っていたらしく、ベチョベチョの雪質でスキーはあまり滑りませんでした。ま、それでも途中、コーヒーを入れて飲んだり、楽しい山行でした。
帰りは、またアスファルト道を1時間歩いてぐったりしました。:p)
IBM の ProTALKER 97 エンジン もしくは、マイクロソフトの Text to Speech と SAPI 4.0 runtime support があれば、あれこれ読み上げることが出来るので、もしかして、音声ブラウザも出来るのではないかと思ってあれこれ探していたら、とりあえず、ブラウザで表示中のページを割に簡単に読み上げる方法がありました。
Speech Pad 2 というフリーのアプリを使います。これは何をするものかというと、任意のテキストを読み上げるものです。クリップボードを監視して、クリップボードの中身を自動的に読み上げるということもできます。まず、マイクロソフトの Text to Speech の日本語版(Lernout & HauspieR TTS3000 TTS engine - Japanese)を導入します。違う国のものを導入すると、日本語がしゃべれません。次に、SAPI 4.0 runtime support も導入します。これで、音声エンジンへの受け渡しのインターフェースが導入されたことになります。Speech Pad 2 を導入して、画面に何か入力してみます。書いた文字列が読み上げられるはずです。さて、これで準備完了。Speech Pad 2 のクリップボード監視にチェックを入れておいて、ブラウザで任意のページを開きます。ページを全部選択してコピーします。Ctrl+A して、Ctrl+C すればいいでしょう。すると、あら不思議、ちゃんと音声で読み上げてくれるではないですか。って、当たり前なんですが。:p)
もちろん、この方法では、リンクを辿ったりすることはできないし、そもそも、リンクとそうでないテキストの判別すらつかないわけですが。それでも、音声読み上げがどんな感じで行われるのかを体験してみる程度には、使えると思います。
きっとブラウザのレンダリング済み画面をコピーするのではなくて、ソースをコピーして、リンクとそれ以外の部分くらいの解析を行い、SAPI に渡す際に、ピッチとか、読み上げ音声の種類を変更するようにすれば、もっと本物の音声読み上げブラウザぽく出来るのかもしれません。あるいは、さらに media="aural" な css までをも読んで、細かく制御できれば、音声スタイルに対応したものに出来るのかも、と夢想してみたり。Mozilla Firefox の拡張とかで、そういうのできんものかなぁ。
IBM製無料音声エンジンとActiveXで音声読み上げ(inu-memo 2004-04-08) を読んで、なるほどホームページビルダー(以下、HPB と略)を使うと、音声読み上げなページが作れるのかということで、早速試してみました。といっても、私は HPB は持っていないので、つか、持ってるけど v2.0(!) なんでお話しにならないので、作るほうではなくて聞くほうを試してみました。
音声読み上げエンジンなどは何にも入っていない会社のマシンで試したので、まずは IBM より ProTALKER 97 エンジン と ProTALKER ActiveX コントロール をいただいてきてインストール。さて、これでそのようなページに会えば音声で読み上げてくれるはずです。が、一体それはどこ?(w ってことで inu-memo をよく読むと、この機能を導入しているサイトは、「このページは、音声読み上げ機能付きです」をフレーズ検索するとみつかるかもです
とありました。なるほどと、ググってみると出てきました。が、ページを表示しても何事も起こりません。おかしいなぁ、と思ったら、IE ではなくて、Mozilla Firefox で見ていました。:p)
気を取り直して、IE を起動。アクセスしてみます。なるほど、ページによってはいきなり、あるいは、再生ボタンがあってそれを操作することで、ページのテキストや、任意の(ページ製作者の指定した)テキストを音声で読み上げてくれました。
ただ、行読みモードとか、リンクを別の声で読み上げてくれるとかの機能はないようで、これは、視覚に障害がある人がページを閲覧するためのものというよりは、ページの付加機能として、音声読み上げでページを彩るという意味合いが強い機能だなと感じました。私が閲覧した中で面白い使い方をしていたページをいくつかあげておきましょう。
-
発音機能付き単語集1
- 発音がかなりおかしい部分がありますが、外国製の読み上げエンジンならもう少しいい感じかも。
-
源氏物語
- ラジオ感覚で、コンテンツを聞くことが出来る。以外と難しい漢字も上手に読み上げるので驚いた。
-
今日の特別お勧め料理のページ(このページは音声読み上げ機能付です。)
- 冷蔵庫にインターネット(何)がつくようになると、こういうのもありかも。:p)
その後、読み上げといえば、2ch to Speech! という2ちゃんねる専用の読み上げソフトがあったなぁと思い、久々に聞きたくなってまた試してみました。今度は別のマシンです。こっちには、Jaws の体験版が入っているので、読み上げエンジンは入れなくともそれが使えるのだろうけれども、件のサイトにはSAPI (ver.4.0)対応音声エンジンが別途必要(※無料版のインストールはこちら)
と書いてあったのが目に付いて、ん?無料の音声エンジン? そんなのあったけ? という展開から、MicrosoftAgent と Text to Speech に行き着きました。そういえば、以前、Bilingual Emacspeak Project(BEP)を試してみたときに、なんかマイクロソフト製の音声エンジンを入れてみたことがあったなぁと思い出しました。そのときは英語版を入れたんで、英語しかしゃべってくれなかったんですが、日本語版もあったんですね。
てなことを考えつつ、あれこれ手繰っていくと、自己満足に Microsoft Agent というページに行き着きました。なるほど、windows にも変な(?)キャラクター付きでしゃべるページを作る仕組みが用意されていたんですね。:p)
話しは飛びますが、こないだ行われた 第1回 ACRI研究会 をネット中継で見ていました。その中で、ACRI 代表の持田さんは、いずれ無料もしくはそれに近い安価な音声読み上げブラウザの開発もしてみたい、みたいなことを言っておられたんですが、もしかすると、こういうのを使えば音声エンジンの問題はクリアできるのかなぁとか思ってみたり。もっとも、Text-to-speech engines を使用するにあたってのライセンス関係とかはまだ読んでいないので、そこらあたりがナニ(何)ですが。
と、今日はまったく何がいいたいのかわからない更新になってしまいました。:p)