Use SpeechSynthesis and SpeechRecognition on Browser
Web Speech API を使えば、ブラウザ上で音声合成と音声認識が出来る時代らしいです。
Safari と Chrome で音声合成が利用できます。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
- TaskMap から呼ばれる関数の this を map に変更しました
- TaskMap(taskName, flow, map, callback, arg) の arg を 削除 しました
- arg を使用するとコンソールにエラーを出力します
- map に必要なデータを関連付け、this 経由で参照してください
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);
哲学と共にあらんことを(君は九龍城を見ることになるだろう)
あー、このツールも、アレもこれもと取り込みすぎていつの間にか九龍城になってきてるのか、ワンストップを目指すにはそれが近道なんだけど、それじゃダメなんだよ。身が持たない。
— コラーゲンたっぷりさん (@uupaa) 2015, 12月 22
機能単体で成立するようにミニマムに標準的に設計して、色々な都合は別立てで特殊化したり皮でくるんだりしないとダメなんだよ。そこの設計思想を間違うとゴールには辿りつけないんだよ。
“設計に哲学が必要” と言われている部分はつまり↑の辺りの事だよ
— コラーゲンたっぷりさん (@uupaa) 2015, 12月 22
モジュール化できない物は、
十分にテストもできないし、説明もうまくできないのが通例なので、
疎結合についてもう一回考えなおす良い機会ですね
— コラーゲンたっぷりさん (@uupaa) 2015, 12月 22