Raspberry Piと音声認識エンジン「Julius(ジュリアス)」を組み合わせると、Juliusのキットを用いた音声認識や特定の言葉を認識させるための辞書データの作成および作成した辞書データを用いた特定の単語認識を行うことができます。
今回は設定した単語をJuliusに認識させた上でPythonのプログラムと連携を行い、スマートスピーカーのように声で撮影ができるカメラを制作してみたいと思います。
Juliusモジュールモードについて
音声認識エンジンJuliusを「モジュールモード」と呼ばれるモードで起動すると、音声認識サーバーとして機能し、認識結果を元にした他のプログラムとの連携が可能になります。
今回は、「かめら」という言葉で辞書データを作成して、「かめら」という言葉をJuliusが認識したらRaspberry Piに接続されたカメラモジュールが写真を撮影するという流れになるよう設定を行います。
なお、Raspberry PiとJuliusの基本的な設定については下記記事を参考にしてください。
“Raspberry PiとJuliusで特定の単語を認識させる”
https://www.pc-koubou.jp/magazine/19743
※今回の記事は上記記事の設定をもとに説明を進めますので、下図の赤枠で囲んだディレクトリにいることを確認して作業を進めてください。
独自辞書データの作成
まず「かめら」という単語を認識させる部分から設定を行うため、「camera」というディレクトリを作成してその中に独自辞書データを作成します。
ターミナル上で下記コマンドを入力してください。
mkdir camera
作成した「camera」ディレクトリに移動します。
ターミナル上で下記のコマンドを入力してください。
C:/~~~/models-master/research;C:/~~~/models-master/research/slim
「~~~」の部分には、TensorFlowのモデルのフォルダmodels-masterを保存した場所のパスを入力してください。
最後に、コマンドプロント上でmodels-master内にあるフォルダresearchまで移動し、Protocol Buffersを使用してProtobufをコンパイルします。
cd camera
ここから独自辞書データを作成するため、「読み」「音素」「構文」「語彙」という4つの要素に対応する下記のファイルを作成します。ファイル名は認識させる「かめら」という言葉に合わせてカッコ内のようにしておきます。
「読み」ファイル —(camera.yomi)
「音素」ファイル —(camera.phone)
「構文」ファイル —(camera.grammar)
「語彙」ファイル —(camera.voca)
まず「読み」ファイル(camera.yomi)から作成します。
ターミナル上で下記のコマンドを入力してください。
sudo vim camera.yomi
Vimエディタが開くので下記の内容を記載します。
かめら かめら
※Vimエディタの基本的な使い方については下記記事後半部分を参考にしてください。
“Raspberry Piとカメラモジュールを接続する”
https://www.pc-koubou.jp/magazine/17276
「Raspberry PiとJuliusで特定の単語を認識させる」記事でも取り上げましたが、左側に認識させたい言葉を書き、その右側に読み方をひらがなで記載してください。左側の言葉は、漢字で定義しても構いません。今回はシンブルに「かめら」と定義しました。
続いて、「音素」ファイル(camera.phone)を作成します。
ターミナル上で以下のコマンドを入力してください。
iconv -f utf8 -t eucjp ~/julius/camera/camera.yomi | ~/julius/julius-4.4.2.1/gramtools/yomi2voca/yomi2voca.pl | iconv -f eucjp -t utf8 > ~/julius/camera/camera.phone
実行をしても一見変化はありませんが、このコマンドでファイルを生成しています。ファイルが生成されたかどうか確認します。
ターミナル上で以下のコマンドを入力してください。
ls
続いて以下のコマンドを実行して生成されたファイルの中身を確認します。
sudo nano camera.phone
実行すると、ファイルが開くので下図のようになっているかどうか確認してください。
続いて、下記コマンドでVimエディタを起動し、「構文」(camera.grammar)ファイルを作成します。
sudo vim camera.grammar
ファイルが開くので下記の内容を記述してください。
S : NS_B CAMERA NS_E CAMERA KAMERA
同様に「語彙」ファイル(camera.voca)も作成します。
ターミナル上で下記のコマンドを入力してください。
sudo vim camera.voca
ファイルが開いたら以下の内容を記述します。
% KAMERA かめら k a m e r a % NS_B [s] silB % NS_E [/s] silE
必要なファイルの作成ができたら、これらのファイルを辞書ファイルに変換します。
ターミナル上で下記のコマンドを入力してください。
cd ~/julius/julius-4.4.2.1/gramtools/mkdfa
「/julius/julius-4.4.2.1/gramtools/mkdfa」ディレクトリに移動できたことを確認して、下記のコマンドを実行します。
mkdfa.pl ~/julius/camera/camera
成功すると、~/julius/cameraディレクトリ内に「.dfa」「.term」「.dict」ファイルが生成されます。
これで独自辞書を作成することができました。
モジュールモードでJuliusを起動する
独自辞書データが作成できたところで、早速Juliusをモジュールモードで起動してみます。
モジュールモードへはコマンド入力で移行することができます。
コマンド末尾に「-module」がついた下記のコマンドをターミナル上で実行してください。
julius -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip -gram ~/julius/camera/camera -input mic -module
しばらく待つとターミナルに下図の表示が現れます。これでJuliusがサーバーとして動作し、Pythonで書かれたプログラムとの通信を待っている状態になります。
このターミナルの画面は一旦そのままにしておき、新しいターミナルのウインドウを開いてPythonプログラムの作成に入ります。
「Shift」 + 「ctr」 + Nキーを押すと新しいウインドウが開きます。
Python側のプログラム作成
ここからは、PythonでRaspberry Piに接続したカメラモジュールを操作するプログラムを作成します。
まず階層を移動します。ターミナル上で下記のコマンドを入力してください。
cd ~/
ディレクトリを移動したら、VimエディタでPythonプログラムを作成します。
ターミナル上で下記のコマンドを入力してください。
sudo vim speechcam.py
ファイルが開いたら、以下のソースコードを記述してください。
# -*- coding: utf-8 -*- import socket import time import picamera host = 'localhost' port = 10500 def shoot(fn): # カメラ初期化 with picamera.PiCamera() as camera: # 解像度の設定 camera.resolution = (1024, 768) # 撮影の準備 camera.start_preview() # 準備している間、少し待機する time.sleep(2) # 撮影して指定したファイル名で保存する camera.capture(fn) print('complete') # Juliusに接続する準備 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) res = '' while True: # 音声認識の区切りである「改行+.」がくるまで待つ while (res.find('\n.') == -1): # Juliusから取得した値を格納していく res += sock.recv(1024) word = '' for line in res.split('\n'): # Juliusから取得した値から認識文字列の行を探す index = line.find('WORD=') print('OK') # 認識文字列があったら... if index != -1: # 認識文字列部分だけを抜き取る line = line[index + 6 : line.find('"', index + 6)] # 文字列の開始記号以外を格納していく if line != '[s]': word = word + line # 「かめら」という文字列を認識したら... if word == 'かめら': shoot('my_pic.jpg') print(word) res = ''
コードの流れを説明すると、Python側でJuliusと通信する準備が出来たあとに、Juliusから送られてくる音声認識の結果から認識文字列の行を探して、「かめら」という文字列を認識したら写真を撮影するという流れになっています。
JuliusとPythonプログラムの連携
Python側のプログラムの準備ができたら、実際に動かしてみます。
まずRaspberry PiにカメラモジュールとUSBマイクを接続します。
実際に動かす前に、先ほど一旦そのままにしておいた上側のターミナルのウインドウを移動し、下図のようにPythonプログラムのウィンドウと上下に並べ、連携を確認します。
下側のPythonプログラムのターミナルで下記のコマンドを入力、実行してください。
sudo python speechcam.py
下側のターミナルで先のコマンドを実行すると、同時に上側のJuliusサーバーの方のウィンドウ内が変化します。
連携していることがこれで確認できました。
連携していることが確認できたところで実際に動かしてみます。
「かめら」とマイクに向かって話してみてください。
成功すると、下側のウィンドウ内に「かめら」と表示が出て、カメラが起動します。
実際に写真が撮影されたかどうかは「/home/pi」を確認してください。
正しく動作していれば、下図のように「my_pic.img」という画像ファイルが作成されています。
プログラムを止めたい場合は、「ctr」+「c」押してプログラムを止めます。
Raspberry Pi×Julius×Pythonで拡がる可能性
今回はRaspberry Pi上のJuliusをモジュールモードで起動して音声認識サーバーとして動かし、言葉を認識させた上でPythonプログラムに結果を渡し、PythonプログラムからRaspberry Piに接続したカメラモジュールを操作して写真を撮影しました。
今回はカメラでの写真撮影でしたが、この仕組を応用してRaspberry Piに別のモジュールをつけたりすることで、特定の言葉を認識して様々な動作をするスマートスピーカー的なものを自分で作ることができます。この記事を参考に、ぜひ挑戦してみてください。
石郷祐介
大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。