Raspberry Piで音声認識する人工知能をつくってみる

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る
Raspberry Pi

IoT技術部の5回目は「音声認識」で命令を聞く「人工知能」に挑戦です。みなさんは、話題の人工知能って手軽にやろうとするとどれくらいできるのだろうって思ったことありませんか?

今回は、Amazon Echoのように、Raspberry Piにつけられたマイクに向かって命令すると、命令を聞くというモノをつくってみようと思います。

今回作った人工知能は、名付けて「トメキチ(留吉)」。名前を考えていてパッと頭に湧いたのが「トメキチ」だった、という単純な理由でこの名前にしましたので深い意味はありません。。。

目標とする動きは、こんな感じです。

1)マイクからの音声を認識する
2)認識した音声に応じてコマンドを実行する

今回は、
「トメキチ 歌ってください」
と話しかけると、トメキチが歌い出すようにしてみます。

あとは、ちょっと会話っぽくするために、話しかけると
「へい!親方!」
と答えてくれるようにします。

原理としては、「トメキチ」が命令開始を意味し、「トメキチ」と呼ばれたことを認識した後、数秒間、コマンドメッセージの音声を受け付ける。という形です。

また、周囲の会話を聞き取って、誤作動しないようにしましょう。最初に「トメキチ」と話しかけずにいきなり「歌ってください」と話しかけても何も認識しないように工夫もしました。

実装の手順は、

Ⅰ.デバイス準備
Ⅱ.OSの設定、ソフトウェアのインストール、設定

  1. 音声の入出力デバイスの設定
  2. Juliusのインストール
  3. Open JTalkインストール

Ⅲ.”トメキチ”プログラムの作成

  1. Gemfileの作成
  2. “トメキチ” プログラム
  3. 歌ってもらう音声ファイルを設定する
  4. Open JTalk実行用シェルスクリプトの準備
  5. Julius起動用スクリプトの作成

Ⅳ.”トメキチ”を実行!

  1. Juliusの起動
  2. Rubyプログラムの起動
  3. 話しかけてみよう!

という流れになります。

Ⅰ.デバイス準備

今回使用する構成は、こんな感じです。

▼ハードウェアの構成

Raspberry Pi 2
・USBマイク
・スピーカー(Raspberry Pi組み込みのもの)
・ブレッドボード
・LED

▼ソフトウェアの構成

・Ruby 2.1.3
Julius (汎用大語彙連続音声認識エンジン。ユーザーからの音声の認識に使用。)
Open JTalk (日本語テキストから音声を生成する音声合成システム。トメキチからの音声に使用。)
・aplay (wavファイルの再生に使用。)

Julius、Open JTalkの仕組み等の詳細については、それぞれのリンクでご確認ください。

なお、本記事で利用するRuby 2.1.3はrbenv を利用して事前にインストールしてあるものとします。

また、aplayはRaspbianに同梱のものを利用しました。

 

Raspberry Piのデバイス作成

用意したもの

  • Raspberry Pi 2(インストール済み)
  • BUFFALO WIFI(設定済み)
  • ブレッドボード
  • LEDライト(赤)
  • LEDライト(緑)
  • ジャンパーワイヤー(オス-メス) × 3

電子工作の手順

  • ジャンパーワイヤー赤はRaspberry:GPIO21/ブレッドボード:h列の23
  • ジャンパーワイヤー黄はRaspberry:GPIO25/ブレッドボード:i列の2
  • ジャンパーワイヤー青はRaspberry:Ground/ブレッドボード:- (マイナス)
  • LED(赤)はカソード(足が短い)をブレッドボード:の– (マイナス)とアノード(足が長い)をj列の2
  • LED(緑)はカソード(足が短い)をブレッドボード:の– (マイナス)とアノード(足が長い)をj列の23

Rsspberry Pi
 

Ⅱ. OSの設定、ソフトウェアのインストール、設定

1.音声の入出力デバイスの設定

・/etc/modules に以下を記載します。

・/etc/modprobe.d/alsa-base.conf に以下に変更します。
※indexが重要です。

2.juliusのインストール

・http://julius.sourceforge.jp/ からJulius本体のソースコード、ディクテーションキット、文法認識キットをダウンロードします。
今回は、以下のものを使用しました。
・julius-4.2.3.tar.gz
・dictation-kit-v4.2.3.tar.gz
・grammar-kit-v4.1.tar.gz

juliusのコンパイル

・ディクテーションキット、文法認識キットを展開します。今回は~/julius-kits というディレクトリを作成し、その中に展開することとします。

julius 設定

認識する単語の登録をおこないます。(単語辞書ファイル)
juliusに認識させたい単語のリストを作成し、juliusで認識可能な辞書形式にします。

まず、”表示用の単語 ひらがなよみ”のペアを単語毎に1行ずつ記述します。
今回は、ファイル名を ~/tomekichi.yomi として作成しました。(文字コードはUTF-8)

以下が設定内容になります。

次に、これを辞書形式(.dic)に変換します。
Juliusが認識する文字コードはEUC-JPであるため、以下では、
iconvコマンドでUTF-8からEUC-JPに変換した後yomi2voca.plで辞書形式に変換しています。

julius用設定ファイルの作成

上記で作成した単語辞書ファイルなどを指定する設定ファイルを作成します。

/root/julius-kits/dictation-kit-v4.2.3/tomekichi.jconf

3.Open JTalkインストール

Open JTalkは、”留吉”に話をさせるために導入します。
※引数で渡された文字をwavに変換してくれます。

Open JTalk関連のパッケージをインストール

Ⅲ. “トメキチ”プログラムの作成

さて、環境が整ったところで、”トメキチ”を作成していきます。今回使用するプログラミング言語はRubyです。

1. Gemfileの作成

トメキチで使用するRuby用のライブラリをインストールするために、Gemfileを作成します。
Gemfileの中身は以下のとおりです。

~/src/tomekichi/src/Gemfile

Gemfile作成後、以下のコマンドを実行し、Ruby用のライブラリをインストールします。

実行後、Gemfile.lockというファイルができます。このファイルは消さないでください。

2.”トメキチ” プログラム

以下の3つのファイルを作成します。

* ~/src/tomekichi/src/tomekichi.rb (本体)

* ~/src/tomekichi/src/l_chika.rb (LED点灯用ライブラリ)

* ~/src/tomekichi/src/command.rb (コマンド処理用ライブラリ)

3.歌ってもらう音声ファイルを設定する

「トメキチ 歌ってください」と呼びかけた時に、トメキチ に歌ってもらうファイルが必要になるので
お気に入りのwavファイルを以下のように設置します。

/root/src/tomekichi/src/sample/test.wav

4.Open JTalk実行用シェルスクリプトの準備

プログラム内から留吉に話をさせるために Open JTalkを使用します。
Open JTalkには”open_jtalk”コマンドが用意されていますが、これには多数のオプションがあり、実行する都度、オプションを指定するのは大変なため、デフォルトのオプションを予め指定したシェルスクリプトを作成します。

・ ~/src/tomekichi/src/extensions/jtalk.sh

・作成したファイルに実行許可を与えます。

 

5.Julius起動用スクリプトの作成

Julius起動時のオプション等を毎回指定するのが面倒なので、以下の様なスクリプトを作成します。

  • ~/julius_server.sh (julius起動用スクリプト)

作成後、実行許可を与えます。

 

Ⅳ.”トメキチ”を実行!

準備完了です! それでは早速トメキチを動かしてみましょう!

1.Juliusの起動

Raspberry Pi にssh経由でログイン後、julius_server.shを実行します。

2.Rubyプログラムの起動

・もう一つ、別のssh接続を行い、先ほど作成したrubyプログラムを実行します。(bundleコマンドは、Rubyをインストール後、’gem install bundler’を実行するとインストールできます。)

3.話しかけてみよう!

では、マイクに向かって話しかけてみましょう。
すべてうまく行っていれば、次のように動作します。

「トメキチ」を話しかけると
“トメキチ”が「へい!親方」と答えます。
と、同時にLEDが光り、5秒放置するとLEDが消えます。

では、歌わせてみましょう。
1)ユーザ :「トメキチ」
2)トメキチ:「へい!親方」(LEDが光る)
3)ユーザー:「歌ってください」(LEDが光っている間に呼びかける)
4)トメキチ: 「はい、歌ってくださいですね」
5)samples/test.wavが再生されます

さらにLEDを光らせる命令をしてみましょう。
1)ユーザ :「トメキチ」
2)トメキチ:「へい!親方」(LEDが光る)
3)ユーザー:「光ってください」(LEDが光っている間に呼びかける)
4)トメキチ: 「はい、光ってくださいですね」
5)緑のLEDが点滅します。

トメキチのコアコンポーネントは音声認識を司るJuliusですが、これには多数のオプションや設定があり、音声認識の精度や動作を変更できるようです。いろいろな設定を試して自分好みのトメキチを作るのも楽しいのではないでしょうか。

この構成で実現できるのは、すでに設定されている言葉のパターンのみの認識で、かつその言葉に応じた処理を実行するということでした。つまり、決まった言葉にのみ反応するということなので、方言やいろんなイントネーションに対応しようと思うと、まずは音声入力部分のプログラムを作りこむ必要があることがわかりました。

人工知能としても、決まったコマンドだけを実行するというものなのでかなりシンプルです。(人工知能と呼べるのだろうか・・・)でも、少しずつ処理を増やしていくことでどんどんできることも増えて行くことも体験できました。

皆さんなりのトメキチを作って、是非、IoT技術部にも紹介してくださいね!

それにしても、何度も”トメキチ”を会話していると自然と愛着が湧いてくる不思議な感じでした☆

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

IoT技術部員募集

IoT技術部では、IoTに興味があって、技術的なことを試していきたい方や、実際に作ったものを公開したい方、大募集しております。

下の応募ボタンから必要事項を登録してください。IoT技術部より追って、ご連絡いたします。

IoT技術部

SNSでシェアできます

コメントを残す



*