音声認識ミュージックプレイヤー  R&D

ひょんなことから手に入れた小型パソコン『Raspberry Pi』。
そのRaspberry Piを使ってR&Dでこんなものを作りました。


作成したきっかけ


2016年1月、クラヴィス設立10周年記念パーティーで各部署毎に出し物を発表することになりました。
その際にR&Dチームで発表した出し物がコレ。

Raspberry Piで作成した『音声認識ミュージックプレイヤー』です。


他の部署がパーティーの出し物に迷う中、R&Dチームは

10周年の出し物は何にしようか?
  ↓
せっかくだからRaspberry Piで何か作る?
  ↓
でもパーティー会場にはモニタもキーボードもないよね
  ↓
じゃあインプットは音声認識にするか
  ↓
アウトプットも音なら何とかなるね
  ↓
じゃあ音声認識ミュージックプレイヤーでも作るか

と、こんな感じで即決でした。
それでは、大まかな作り方を簡単にご紹介!



用意するもの


ハードウェア

  • Raspberry Pi
  • MicroSDカード(16GBもあれば十分)
  • USBマイク
  • USBスピーカー(USB⇔オーディオジャック変換でもOK)
  • USBケーブル(ミニ⇔ノーマル)(電源用)
  • HDMIケーブル(無くても可能だけど、最初はあった方が便利)

ソフトウェア

  • Rasbian(OS)
  • Julius(音声認識モジュール)
  • MPD、MPC(音楽再生モジュール)

データ

  • 音楽ファイル(mp3)


作り方


  • Raspberry PiにOS、Julius、音楽再生モジュールをインストールします。
  • 適当に音楽ファイルを入れます。
  • I/Oそれぞれの単体テストを行います。
    • マイクの声がJuliusで音声認識されることを確認
    • 音楽再生モジュールを用いてスピーカーから音を出力出来ることを確認
  • Juliusと音声再生モジュールを連携させる為のプログラムを作成します。
    大きくは以下の機能が必要です。
    • ソケット通信でJuliusから音声認識化されたXML電文を受信
    • 受信したXML電文をパースして解析
    • 解析結果に応じて音声再生モジュールに命令を発行
    ちなみにこの時はRubyで作成しています。
  • 音声認識用の辞書ファイルを作成します。
    辞書ファイルは標準のままだと音声の解析に時間がかかる上、認識精度も良くないので目的に特化した辞書ファイルを作成します。
    今回の目的で言えば
    • プレイ
    • ストップ
    • 次へ
    • 戻る
    • ボリュームアップ
    • ボリュームダウン
    等の単語を登録します。
  • 音声再生用のリストファイルを作成します。
  • Julius、連携プログラム、音楽再生モジュールを連携させた結合テストを行います。
  • これらのモジュールを自動起動サービスとしてOSに登録します。
  • システムテストとして以下の一連の流れの確認を行います。
    • Raspberry Piに通電
    • OS起動
    • 各モジュール起動
    • 準備OK
    • 音声認識
    • 音楽再生
    • シャットダウン


大変だったこと


マイクとスピーカーが別々のオーディオデバイスとして認識されてしまう為、デバイス0からマイクの音を取得し、デバイス1のスピーカーに音を出力させるという所が地味に苦労しました。
1つのUSBでマイクジャックとスピーカージャックがあるタイプならこの手の問題は発生しないと思います。
それと、Raspberry Piを通電させた後、モニタがない状態でどうやって準備OKになったことを把握するか。
結局、準備OKのサインの音を鳴らすことで対応しました。



その他


これはパーティー用のお遊びで作成しただけでしたが、ちゃんと作り込めばミュージックサーバとしても十分成り立ちます。
しかし、その場合に問題になるのが雑音。
音声認識で問題になるのが誤認識です。
なので、連携プログラム側で認識精度が低かったら無視するなどの仕組みは作り込んだ方が良いと思います。


次にスピーカーの電源
USBスピーカーを使ってRaspberry Piからの電源供給だけに頼ると音量を上げた際に電力不足になります。
ちゃんと使うなら別途電源を確保出来る様、電源プラグを持ったスピーカーの使用をオススメします。