作業中のメモ

よく「計算機」を使って作業をする.知らなかったことを中心にまとめるつもり.

音声認識による赤外線機器の操作 その 1【準備編】

どうも,筆者です.

先日,新たに Raspberry Pi を購入した.今回から,この Raspberry Pi を用いて音声認識を用いた赤外線操作の実行方法について述べる.

まずは,音声認識ツールの導入方法と簡単な動作確認方法について解説する.導入方法は,こちらのサイトを参考にさせていただいた.

Julius の使い方(version 4.4.2 対応版) | Feijoa.jp

準備

環境構築と構築状況の確認のために必要なものを以下に示す.

  • Raspberry Pi 3 Model B
  • Micro SD
  • 5V/2.5A の電源
  • 赤外線が送受信可能なモジュール
  • マイク

今回,上の 3 つは以下のセットを利用した.

ABOX Raspberry Pi3 Model B ボード&専用ケースセット ラズベリーパイ 3 モデル B 32GB(class 10) 豊富な付属品 日本語説明書 ブラックケース【本体+コンプリートスターターキット】

https://www.amazon.co.jp/gp/product/B076X2H479/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1

4 つ目の赤外線モジュールに関して,多くのサイトでは赤外線受信モジュールと赤外線 LED を利用している.筆者も以前作成したときに同様のものを利用したが,赤外線 LED の指向性が強くうまく動作しなかった. 今回は,音声認識専用の Raspberry Pi にする予定であり,赤外線周りで不具合を出したくないため,以下のものを購入した.

ADRSIR ラズベリー・パイ専用 学習リモコン基板

Amazon CAPTCHA

ネットだと 5,000 円程度するが,大須では 4,000 円程度で購入できた.

また,マイクは,以前購入した以下のものを利用した.

iBUFFALO マイクロフォン USB音源 ブラック BSHSM05BK

https://www.amazon.co.jp/gp/product/B001GNZROE/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1

以上をまとめると,

  • Raspberry Pi 3 Model B,Micro SD → スターターキット
  • 赤外線モジュール → ADRSIR
  • マイク → BSHSM05BK

となる.ここまでで,準備は終了です.次からセットアップを行っていく.

セットアップ

Raspberry Pi の初期設定

まずは,Raspberry Pi のセットアップからはじめる.ただ,これは過去の記事を参考にすれば問題なく進められるはずであるため割愛する.

参考

workspacememory.hatenablog.com

workspacememory.hatenablog.com

ただ,この時と比較し,OS のバージョンが変わっている.そのため,今回の OS のバージョンを以下に示す.

$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:    9.4
Codename:   stretch

音声認識ツールのセットアップ

次に,音声認識ツールの導入方法について説明する.音声認識ツールは様々なものがあるが,今回はフリーで利用できる「Julius」という音声認識ツールを利用する.

julius.osdn.jp

まずは,本体をダウンロードする.筆者は git の使い方を覚えてきたので,以下のコマンドで GitHub から本体をダウンロードする.

# Julius 本体のダウンロード
~ $ git clone https://github.com/julius-speech/julius.git

この後コンパイルをかけることになるが,筆者の環境では,動作後,マイクデバイスをうまく認識してくれなかったので,コンパイル時に alsa という指定をする.その際に必要になるライブラリをインストール後,コンパイルを行う.

Raspberry Piで音声認識

# sudo コマンドを利用して,ライブラリをインストール
~ $ sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev
# julius 本体のディレクトリに移動しコンパイル
pushd julius
~/julius $ ./configure --with-mictype=alsa # ここでライブラリが不足しているとエラーメッセージが表示される
~/julius $ make # コンパイル
~/julius $ sudo make install
popd

追加モジュールのインストール

上記の設定で Julius 本体のインストールが完了した.次に,Julius の実行キット(ディクテーションキットと記述文法音声認識実行キット)をインストールする.これは,既にコンパイル済みのものが配布されているため,それをダウンロードすることになる.これの追加モジュールをひとつのディレクトリ以下に格納する.

~ $ wget "https://ja.osdn.net/frs/redir.php?m=ymu&f=julius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz" # かなりサイズがあるはず(うろ覚え)
~ $ tar zxvf dictation-kit-v4.3.1-linux.tgz
~ $ git clone https://github.com/julius-speech/grammar-kit.git
~ $ mkdir juliusKit
~ $ mv dictation-kit-v4.3.1-linux juliusKit/dictationKit_v4.3.1
~ $ mv grammar-kit juliusKit/grammarKit

この時のディレクトリ構造は以下のようになる.

~/juliusKit
   |--dictationKit_v4.3.1
   |--grammarKit

これで,必要な準備はできた.マイクのセットアップ後,音声認識が実行できるかを確認する.

マイクのセットアップ

実は,先程の設定後,実際に以下のコマンドで動作をさせたが,エラーが出力されうまく動作しなかった.

~/juliusKit $ cd dictationKit_v4.3.1
~/juliusKit/dictationKit_v4.3.1 $ julius -C main.jconf -C am-gmm.jconf -demo 
# === 以下のエラーが表示される ===
# ### read waveform input
# Stat: adin_oss: device name = /dev/dsp (application default)
# Error: adin_oss: failed to open /dev/dsp # もしかすると,「--with-mictype=alsa」を指定する前の実行ファイルを用いた結果かもしれない
# failed to begin input stream
# ==============================

そのため,マイクデバイスの設定を行う.以下のコマンドで優先度を確認する.

~ $ cat /proc/asound/modules ### 優先順調査
# 出力結果
 0 snd_bcm2835
 1 snd_usb_audio ### こっちを優先したい

優先度が低いことが分かる.設定ファイルを修正し,各種設定後再起動する.

# 【1】  /etc/modprobe.d/alsa-base.conf を修正する.ない場合は,新規作成する.
~ $ sudo vim /etc/modprobe.d/alsa-base.conf # エディタは自分が使いやすいものを使う
# 【2】 以下のように変更し,保存する
# === ここから ===
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
# === ここまで ===
# 【3】 必要なコマンド,ライブラリをインストールする.その後再起動する.
~ $ sudo apt-get install alsa-utils sox libsox-fmt-all
~ $ sudo sh -c "echo snd-pcm >> /etc/modules"
~ $ sudo reboot

再起動後,デバイスのカード番号とデバイス番号を調べる.

~ $ arecord -l # カード番号とデバイス番号を調べる
### 出力例
### カード 0: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
###   サブデバイス: 1/1
###   サブデバイス #0: subdevice #0

~ $ amixer sset Mic 70 -c 0 # マイクの音量調節 (-c [カード番号])
~ $ arecord -D plughw:0,0 -d 10 -f cd test.wav # 録音してみる(plughw:[カード番号],[デバイス番号]、-d 10秒)
~ $ aplay -D plughw:1,0 test.wav # 再生してただしく録音できていることを確認する

ここまで実行できていれば,音声認識はできるはずである.次の節で動作確認を行う.

動作確認

以下のディレクトリに移動後,コマンドを実行し動作確認する.

~ $ cd juliusKit/dictationKit_v4.3.1
# 再掲:plughw:[カード番号],[デバイス番号]
~/juliusKit/dictationKit_v4.3.1 $ ALSADEV="plughw:0,0" julius -C main.jconf -C am-gmm.jconf -demo

実行後,しばらくしたら「<<< please speak >>>」という文字列が表示されていれば成功である.後は,マイクから音声を入力し認識出来ていれば良い.

ただ,大量の語彙の中から認識結果を出力するので,はっきり言って精度は悪い.次回は,認識用の辞書を作成し,これをもとにした認識結果を出力する方法を解説する.