« [N810]sqlite3 for OS2008 (NOKIA N810) | Main | [Windows Mobile]QuicTodayからTwitterに投稿する試み »

2008.05.25

[Chumby]Chumbyで日本語読み上げ音声時計(Japanese voice clock for Chumby)

Zaurus用にコンパイルしたCMU FliteChumbyで動いたので、時刻を読み上げる音声時計スクリプトを書いてみました。

CMU Fliteは英語しか読み上げできませんが、カビパン男と私さんの素晴らしい発音テーブルのおかげで、日本語読み上げもできるようになりました。

Chumbyではcronが最初から動いてますので、それに登録して動かします。

とりあえず、僕は壁掛け時計よろしく30分間隔で動かしています。

ダウンロード

「jvoiceclock-0.1.tar.gz」をダウンロード

「flite-1.3_arm-linux.tar.gz」をダウンロード

「sox-12.17.3_arm-linux.tar.gz」をダウンロード

インストール

前出の三つのファイルを解凍し、USBメモリのルートディレクトリにコピーします。

コピー先をいじる場合は、jvoiceclock.plの冒頭にあるConstantsを適宜いじってください。

USBメモリはVFATでしょうから実行権は関係無い(デフォルト777)と思いますが、特殊な環境の方はパーミッションに注意してください。

ChumbyにSSHでログインし、以下のようにcrontabを実行します。

# crontab -e

起動したviで、以下のようなエントリを加え、保存終了します。

*/30 * * * * /mnt/usb/jvoiceclock.pl

以降、30分ごとに時刻を読み上げてくれると思います。 最初はテストで以下のように登録して1分毎に読み上げさせてみるといいかもしれないですね。

*/1 * * * * /mnt/usb/jvoiceclock.pl

ソース

一応ソースを貼っておきます。

#!/usr/bin/env perl

# Title: Japanese voice clock for Chumby
# Version: 0.1
# Author: moyashi 
# License: Free

##### INSTALL

# Copy flite, sox, jvoiceclock.pl to USB Flash memory, like this:
#
# $ scp flite sox jvoiceclock.pl root@192.168.0.10:/mnt/usb
#
# Then, register to crontab (On Chumby):
#
# # crontab -e
#
# */30 * * * * /mnt/usb/jvoiceclock.pl
#

# You can get flite, sox (run on Chumby) from my site:
# http://moyashi.air-nifty.com/hitori/2008/05/chumbychumby_e1da.html

##### Constants

*FLITE_PROG = \"/mnt/usb/flite";
*SOX_PROG = \"/mnt/usb/sox";
*TMP_FILE = \"/tmp/speak$$.wav";

#####

&speak(&time_pho((localtime(time))[1, 2]));

sub speak {
    my($arg) = @_;
    $cmd1 = $FLITE_PROG." -t \"".$arg."\" -o ".$TMP_FILE;
    $cmd2 = $SOX_PROG." -r 4000 ".$TMP_FILE." -t ossdsp /dev/dsp";
    system($cmd1.";".$cmd2.";rm ".$TMP_FILE);
}

sub ampm_pho {
    my($hour) = (localtime(time))[2];
    if ((localtime(time))[2] > 12) {
        return "go go";
    } else {
        return "go zeh unn";
    }
}

sub time_pho {
    my($min, $hour) = @_;
    if ($hour > 12) { $hour = $hour - 12; };

    @min = split(/ */, sprintf("%02d", $min));

    $ampm_pho = &m_pho();

    @hour_arr = ("re ee", "ee chee", "ni", "sa unn",
        "yo", "go", "ro koo", "shi chee",
        "ha chee", "koo", "joo oo",
        "joo oo ee chee", "joo oo ni");

    @tenth_arr = ("", "joo oo", "ni joo oo", "sa unn joo oo",
        "yo unn joo oo", "go joo oo");

    @one_arr = ("", "ee chee", "ni", "sa unn",
        "yo unn", "go", "ro koo", "na na",
        "ha chee", "kyoo oo");

    $hour_pho = $hour_arr[sprintf("%d", $hour)]." ji";

    $fun_pho = $min ? " foo unn" : "";

    $min_pho = $tenth_arr[sprintf("%d", $min[0])]." ";
    $min_pho = $min_pho.$one_arr[sprintf("%d", $min[1])];
    $min_pho = $min_pho.$fun_pho;
    return $ampm_pho." ".$hour_pho." ".$min_pho." deh soo";
}

|

« [N810]sqlite3 for OS2008 (NOKIA N810) | Main | [Windows Mobile]QuicTodayからTwitterに投稿する試み »