Gaucheでも日本語を喋らせる

どうやら、夏休み特別企画として Nictの施設が、公開されるようだ。 以前一度行った記憶がある。あれから何年経ったのだろう? もう一度行ってみたい気がする。

日本標準時製造現場も見学出来るようだけど、Web上でもずばり 日本標準時なんてのが公開されてる。あれれ、このページ、ぱある で出来てるっぽい、そうですか、標準Perlですか。ここは、あの方に頑張って頂いて、JST.rb を是非。

そう言えば、背広本で一章を割いて、時間は難しいって matzさんが嘆いておられましたが、UTCが有ったり 国際原子時(TAI )が有ったりで、大変ですな。地球の回転数までも考慮してあげなければならないんだもの。

ついでに、電波時計の信号源についても見たぞ。長波だから、 電界強度は余り変動は無いと思っていたけど、強度の予測マップを見たら、見事に予想を裏切られましたよ。 とほと。

熱い4日間(RubyKaigi2009 & RWH読書会)

途中でRuby(とBeer)で、おなか一杯になりDownしたけど、楽しさが連続しましたよ。 GCのあの人は、みんなにかわいがられているなあと、ひしひしと思ったり、MAC率の 異常さに唖然としたり。

matzさんが、MACにCHANGEするのは何時ですかと聞き忘れたり、RoRに対抗してLoLや そそる本がいっぱい並んでいたり。著者のサイン会が列を成していたり。

学術センターの斜め向かいにある、学士会館で美味しい食事をゆったり取れたり。朝は オープンテラスで、コーヒー&サンドだったり。

締めのRWHでは、和田先生の近くにいる方にUnicodeの先生の考え方をお聞き出来たり、 Haskellかわゆいよ、Haskell使うべしと勧められたり、λなHaskell本の話があったり。

LoL

LET OVER LAMBDA を、出張書店でGetしてきた。この本もλマーク入りだ。著者は、 Doug Hoyte さん。

付録を読んだら、% が使えれば viで十分じゃんと言うOpenBSDの人らしい。Nmapの開発者 の一人って書いてあったよ。本当かどうかnmapのサイトへ行って みた。そしたら、changeLogに

o The --top-ports option lets you specify the number of ports you wish
  to scan in each protocol, and will pick the most popular ports for
  you based on the new frequency data.  For both TCP and UDP, the top
  10 ports gets you roughly half of the open ports.  The top 1,000
  (out of 65,536 possible) finds roughly 93% of the open TCP ports and
  more than 95% of the open UDP ports. [Fyodor, Doug Hoyte]

しっかりと、開発リーダーと名を連ねていた。LoL記念っつ事で、NmapをVer 5 に 上げましたよ。ありがとう。

Gaucheで日本語を喋らせる(部品の構築、心臓編)

RubyもHaskellもお腹いっぱいなので、schemeで行きます。

何はなくとも、心臓部になる、喋る所から。今回は、数字は棒読みを脱却して、 ネイティブに喋る事を目標にします。つまり、前回のjsayみたいな制限を撤廃 させます。

そうは言っても、Cで書く部分は、最低限にしたいと言う希望があるんです。データの 渡しは、環境変数経由としましょう。Windowsの場合だって使えるよね。なんか長さの 制限とかレジストリィーに書かれてしまうんでないかいと言う、一抹の不安は ありますが、楽を優先します。

#include <stdio.h>
#include <stdlib.h>
#include "AquesTalkDa.h"

int   rc;     // rerult code (1: env not found, others: see AauesTalk doc.)
char  *sd;    // speak data

main(){
    sd = getenv("AquesTalk");
    rc = sd ? AquesTalkDa_PlaySync(sd) : 1;
    printf("%d", rc);
    return 0;
}

環境変数ですから、キーを決めなければなりません。何でも良いのですが、開発者の 方に敬意を表して、AquesTalkに決めました。こうしておけば、binaryになっても 刻印がしっかり残ります。Windwosにstrigsなんて言うコマンドが存在するかどうかは 知りませんが。

なにせ、Windows is Not Unix(by artonさん)ですから。

返値は、終了コードです。環境変数が未定義の場合は、"1"を返す事にしました。 それ以外のエラーは、AquesTalkで定義されているまんまです。

このbibaryにも、名前を付けてあげます。jsayは既に取られてますので、gsay としました。 頭の 'g' は、gaucheから頂いたのか、グレートの g かは、秘密です。

そんじゃ、ちょっと試運転します。(by ruby)

ENV['AquesTalk'] = ""
puts `gsay`
ENV['AquesTalk'] = "いま,<NUMK VAL=10 COUNTER=じ>,デスね。"
puts `gsay`
c:\sakae\gsay>ruby testGsay.rb
100
0
c:\sakae\gsay>

プログラミングガイドによると、100と言うのは、"その他のエラー"と定義されてます。 0 は、成功ですね。

gaucheと結合する。

心臓は出来たので、いよいよgaucheで実験してみる。

;; -*- coding:  utf-8 -*-

(use gauche.charconv)

(define dat (ces-convert "ルビーかいぎ、おもしろかったよ。" 'utf-8 'sjis))
(sys-putenv "AquesTalk" dat)
(sys-system "gsay")

最終的には、こうなったけど、最初小さなトラブルが。(自分が悪いのですが!)

何も考えずに、コードを書いて実行したら、喋りを拒否されて、105と言うエラーが 上がってきました。105って、「音声記号列に未定義の読み記号が指定された」なんで すね。そう、文字化けしてたんです。エラーを返値にして、いやでも目に付くように したのは大正解でしたよ。

c:\sakae\piki>gosh -V
Gauche scheme interpreter, version 0.8.14 [utf-8]

して、気づくお粗末でした。

それはそうと、着々とUnicode包囲網が浸透してきています。ここらあたりで、文字コード をどうするか、ちょっと考えておきます。

AquesTalkは、伝統的なSJISで、これはいかんともしがたく変更出来ません。また、原稿は SJISでしょう。従って、受け取った原稿をutf-8に変換してから、内部処理し、gsayには SJISに戻してあげる事にします。

ラウンド・トリップ問題は、心配しなくてもいいのかな? それにしても面倒だ。和田先生に は、怒られそうだけど、ユニコードへの統一を。

(to be continue)