PCの場合、入力デバイスは限られていました。キーボード、マウス、タブレットなどがそうです。しかしごく小さなIoTデバイスの場合、わざわざ外付けキーボードをつけて操作するのは面倒ですし、そもそもディスプレイがないこともあります。

そこで新しい入力機能が求められています。一つにはセンサーデータで、温度/湿度/照度といった環境データがあります。そして今回は音声入力を使ってみたいと思います。

必要なもの

  • Raspberry Pi(Raspbian Wheezy)
  • マイク(USB接続のもの)

音声入力ライブラリについて

日本語を認識できる音声入力システムは限られています。今回はオープンソースのJuliusを使います。Juliusは古くに作られて今は積極的にはメンテナンスされていませんが、現在でも十分使えるソフトウェアになっています。

インストールは基本的にファイルをダウンロードしてコンパイルするだけです。

[/crayon]

後、解析のベースになる設定ファイルをダウンロードします。

[/crayon]

これでJuliusの準備は完了です。

マイクの認識

マイクですが、USB接続のマイクがお勧めです。USB接続したら、以下のコマンドを実行します。

[/crayon]

ここでマイクが認識されていれば大丈夫です。今回はDevice 004がマイクですが、名前は出ていないようです。

次にサウンドの優先順位を設定します。まず次のコマンドを実行します。

[/crayon]

このように0番のが優先度が高くなりますので、それを変更します。

[/crayon]

この設定が終わったら一旦リブートします。

[/crayon]

リブートが終わるとサウンドの優先順位が変わっているはずです。

[/crayon]

そしてサウンドカードの設定を行います。まず次のコマンドを実行してカード番号を調べます。

[/crayon]

今回は0番なので、それを環境変数ALSADEVに指定します。

[/crayon]

では音声入力を試してみます。

[/crayon]

このように音声が文字化されるのが確認できました。

Juliusの起動

音声入力できることを確認できたら、Juliusをサーバモードで立ち上げます。この時、音声認識のベースになる辞書ファイルを指定します。

[/crayon]

これで10500番ポートを使ってJuliusが立ち上がった状態になります。このサーバは認識した音声をXMLとして返却するサーバになります。

Node.jsのインストール

Node.jsですが、Raspbianで提供されているバージョンは古い物になります。そこでNode ARMからパッケージをダウンロードします。まず環境周りです。

[/crayon]

次にバイナリをダウンロードしてインストールします。

[/crayon]

これで完了です。

Node.jsでスクリプトを書く

では Node.js を使ってスクリプトを書いてみます。まずベースのフォルダを作成します。

[/crayon]

次にスクリプトですが、require部は次のようになります。

[/crayon]

netはJuliusサーバへの接続、parseStringはXMLのパースに使います。ここで外部ライブラリがありますので読み込むようにします。

[/crayon]

次にスクリプトに戻って、変数の初期化とJuliusサーバへの接続を行います。

[/crayon]

接続できれば、後はclientにdataイベントを使ってJuliusサーバからデータが流れてきます。例えばこんな感じのXMLになります(via 第10章 モジュールモード)。

[/crayon]

これが一部分ずつ送られてくるようなイメージです。dataイベントはデータが随時流れてきますので、それらの文字を連結して、XMLとしてパースできる状態まで処理を繰り返します。

[/crayon]

また、空文字であれば無視します。

[/crayon]

さらに RECOGOUT というデータがない場合も無視します。

[/crayon]

ここまででXMLのパースが終わっていますので、単語の部分を順番に連結していきます。

[/crayon]

これで speak 変数に対して喋った言葉が入ってきます。

全体としては以下のようなスクリプトになります。

[/crayon]

実行する

では実行してみます。Juliusサーバ→スクリプトの順番で実行してください。

このように喋った言葉が認識されればOKです。後はこのspeakの内容に合わせて処理を書くことでライトを光らせたり、サーバモーターを動かしたりすることで音声による操作可能なデバイスが作れるでしょう。

注意点

Juliusを起動した際に、

[/crayon]

というエラーが出る場合は、

[/crayon]

というコマンドを実行すると解消するようです(via Juliusの起動 – めざせ ??)。


Juliusは辞書次第で認識率が高まりますが、あまり大きな辞書では解析に時間がかかる可能性があります。そのため音声コマンドとして使いたい文字に限定して辞書を作成することで高速さと高い認識率を実現できるでしょう。

USB接続で使えるので半田付けのような難しいことはしなくても楽しめます。ぜひお試しください。