latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

Use SpeechSynthesis and SpeechRecognition on Browser

Web Speech API を使えば、ブラウザ上で音声合成音声認識が出来る時代らしいです。

SafariChrome音声合成が利用できます。Chrome ならさらに音声認識も利用できます。

手軽に利用できるように、WebModule ベースの Speech.js Module を作ってみました。

iOS Safari Chrome for Android PC Chrome Electron NW.js
音声合成 OK OK OK OK OK
音声認識 OK OK OK OK

こんな感じで使います (ボイスコマンド部分は3分で実装した感じのアレなコードです)

var speech = new Speech().load({ name: /Kyoko/i, lang: /ja/i }); // ボイスのロード
var recognizer = new Speech().createRecognizer(); // 音声認識

// この辺は適当に
var voiceCommandMap = {
    "clear":    _clearBuffer,
    "stop":     _stopRecognition,
    "クリア":   _clearBuffer,
    "ストップ": _stopRecognition,
    "終了":     _stopRecognition,
    "しゅうりょう": _stopRecognition,
};

function _startRecognition() {
    console.info("start");
    if (speech.ready) { speech.say("お話しください"); }

    recognizer.start(function(event) {
        switch (event.type) {
        case "result":
            if (this.ended) {
                console.log("ok: ", this.result.join(","));
                _processVoiceCommand(this.result[this.result.length - 1].trim(), voiceCommandMap);
                alert(this.result.join(","));
            } else {
                console.log("...", this.buffer.join(","));
            }
            break;
        }
    });
}

function _processVoiceCommand(command, voiceCommandMap) {
    for (var keyword in voiceCommandMap) {
        if (keyword === command) {
            var fn = voiceCommandMap[keyword];
            if (fn) {
                fn();
            }
        }
    }
}

function _stopRecognition() {
    if (speech.ready) { speech.say("音声認識を終了しました"); }
    recognizer.stop();
    console.info("stopped");
}

function _clearBuffer() {
    if (speech.ready) { speech.say("バッファをクリアしました"); }
    recognizer.clear();
    console.info("buffer cleared");
}

夢が広がりますね。

MarkDownKit 的な物が欲しかった OF THE DEAD

前々から書きたかった MarkDownKit 的な md ⇔ AST(JSON) ⇔ 他のフォーマット 変換ツールを書き始めました(本当はお正月中に仕上げる予定でしたが、風邪で6日ほど倒れてました)

作業から20時間ほどで、やっとそれっぽいJSONを生成するようになってきた感じです。

MarkDown は使う側から見れば、これ以上ないぐらいに単純なのですが、熱と鼻水に侵されたダメダメ脳でパーサーをサクッと実装できるほど単純ではありませんでした。

(ა✘﹏✘)ა なんかね… なかなか綺麗に書けないのよ…

MarkDown parser の実装そのものは車輪の再開発の類なのですが、脳をストレッチするためのプログラミングやリハビリのテーマとして見ると、ちょうどいい規模感がありますね。

Task.js@1.1.0 released

Task.js の概要

ChangeLog

var map = {
    data: [111, 222],
    a: function(task) { console.log(this.data[0]); task.pass(); }, // 111
    b: function(task) { console.log(this.data[0]); task.pass(); }, // 222
};
TaskMap("example", "a > b", map);

哲学と共にあらんことを(君は九龍城を見ることになるだろう)