2013年1月24日木曜日

Web Speech APIで音声認識

Google Chromeのベータ版にのっているWeb Speech APIをつかってみたよ。最近はブラウザでなんでもできるけどここまでやるとはね。

Web Speech APIでできること

Web Speech API Specificationによると、音声認識と音声合成が簡単に扱えるAPIのようす。Chrome 25のベータ版では、音声認識のみ実装しているようです。

認識精度がけっこういいのだ

まずはGoogleのデモアプリで遊んでみる。はっきりとしゃべる分には、けっこう正確に認識してくれる感覚。例によって宇多丸と歌丸を使い分けるぞ!

Web Speech API recognizes UTAMARU correctly.

この音声認識も、Siriよろしくどっかのサーバで解析して結果を返してもらっている様子。ネットワークを切った状態で認識ボタンを押すと、マイクを起動しにいった直後に切ってしまい、音すら拾ってくれません。また、ローカルでもきちんとWebサーバを立てて、HTTPで開いていないとダメみたい。file://ではマイクすら立ち上げません。なかみはXHRをつかっているのだろうか。

イベントのトリガが豊富

仕様の5.1.3節にイベントいちらんが列挙されています。基本的にはonresultで、認識した結果を使うのだろうけど。onspeechendとかを使うと、解析結果はどうでもいいから声があったことだけ使いたいってときに使えそうです。2コンに向かってなんでもいいから叫ぶアレのエミュレートとか。

さいごに

Web Audio APIとかみたいに、内部でがっつりコードが動いているわけではなく、認識も生成も外部サーバのクライアントとしての立ち位置みたい。外部サーバも任意に指定できるっぽいので、SiriProxyがわりに使っちゃうこともできるんじゃないだろうか。iPhoneのWebKitに載るのは当分先だろうけど、楽しみ。

2013年1月3日木曜日

Node.jsとMongoDBで回路のテスト

昨年末に基板を自作しまして。まとめにも書いているように、理屈のうえでは電池のもちがよくなっているはずです。でもどのくらいよくなっているのかがわかりにくいので、実際に測定してみることに。

どうやって測るか

基板から制御する8個のLEDを全開にした(ほぼ)最大負荷の状態で何時間もつかを測ります。通常使用では全開にし続けることはないので、「最低でもこれだけもちます」という時間がわかります。

最初はiPhoneのストップウォッチでいいんじゃねえかと思いましたが、如何せん時間が長い。目を離したすきに電池が切れられても困ります。せっかくXBeeで電圧をモニタしているので、これを利用することに。Node.jsでシリアルポートを監視し、XBeeのパケットを受信したらMongoDBに放り込みます。XBeeからのパケットが途絶えた(=電池が切れた)ところでMongoDBの中身をグラフ化し、何時間動き続けたかを読み返します。

動かしてみた

コードはこんな感じに。

var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/batterytest');

var Packet = new mongoose.Schema({
    vol1:   Number,
    vol2:   Number,
    time:   { type: Date, default: Date.now },
});

exports.Packet = db.model('Packet', Packet);
var model = require('./model_voltage');
var Packet = model.Packet;

serial_xbee.on('data', function(data){
    // 受信したパケットが'Data Sample'である
    if( (typeof data.bytes !== "undefined") && (data.bytes[0] == 0x92)){
        // パケット中のA/D変換した読み値でオブジェクトをつくる
        var newPacket = new Packet({vol1: data.samples.A0, vol2: data.samples.A1});
        newPacket.save(function(err){
            if(err){
                console.log(err);
            }
        });
    }
});

で、とったログをグラフ化。ここはMongoDBからCSVとしてはきだして、Numbersでグラフにしました。Numbersでグラフをつくるのは意外とめんどうでした。Excelほしいです。

名称未設定 2

5V昇圧をナシにしたFusion PCB試作のほうが、圧倒的に長いあいだ動作できることがわかります。適当なパターンで点滅させるとなれば、もっと動作時間は延びると考えられます。加えて、電池や昇圧ICの特性もみえそうという副産物も。もとの電源が十分に電圧を確保できてる場合、5V電源のほうは出力電圧がビチッと5Vで安定してますね。

おわりに

そういう用途ならばfluentdを使えばとなるのだけれど。シリアルポートがうまく読めなくて苦労しているので、なんとかなったらそこはまた。