Raspberry Pi上のJuliusに設定した単語を認識させた上でPythonのプログラムと連携を行い、スマートスピーカーのように声で撮影ができるカメラを制作してみます。

クリエイター最終更新日: 20190531

Raspberry Pi×JuliusとPythonでスマートスピーカー風にカメラを操作

  • このエントリーをはてなブックマークに追加

Raspberry Piと音声認識エンジン「Julius(ジュリアス)」を組み合わせると、Juliusのキットを用いた音声認識や特定の言葉を認識させるための辞書データの作成および作成した辞書データを用いた特定の単語認識を行うことができます。
今回は設定した単語をJuliusに認識させた上でPythonのプログラムと連携を行い、スマートスピーカーのように声で撮影ができるカメラを制作してみたいと思います。

Juliusモジュールモードについて

音声認識エンジンJuliusを「モジュールモード」と呼ばれるモードで起動すると、音声認識サーバーとして機能し、認識結果を元にした他のプログラムとの連携が可能になります。

今回は、「かめら」という言葉で辞書データを作成して、「かめら」という言葉をJuliusが認識したらRaspberry Piに接続されたカメラモジュールが写真を撮影するという流れになるよう設定を行います。

なお、Raspberry PiとJuliusの基本的な設定については下記記事を参考にしてください。
“Raspberry PiとJuliusで特定の単語を認識させる”
https://www.pc-koubou.jp/magazine/19743

※今回の記事は上記記事の設定をもとに説明を進めますので、下図の赤枠で囲んだディレクトリにいることを確認して作業を進めてください。

「julius」ディレクトリにいることを確認「julius」ディレクトリにいることを確認

独自辞書データの作成

まず「かめら」という単語を認識させる部分から設定を行うため、「camera」というディレクトリを作成してその中に独自辞書データを作成します。

ターミナル上で下記コマンドを入力してください。

mkdir camera

「camera」ディレクトリを作成「camera」ディレクトリを作成

作成した「camera」ディレクトリに移動します。
ターミナル上で下記のコマンドを入力してください。

C:/~~~/models-master/research;C:/~~~/models-master/research/slim

「~~~」の部分には、TensorFlowのモデルのフォルダmodels-masterを保存した場所のパスを入力してください。

最後に、コマンドプロント上でmodels-master内にあるフォルダresearchまで移動し、Protocol Buffersを使用してProtobufをコンパイルします。

cd camera

「camera」ディレクトリに移動「camera」ディレクトリに移動

ここから独自辞書データを作成するため、「読み」「音素」「構文」「語彙」という4つの要素に対応する下記のファイルを作成します。ファイル名は認識させる「かめら」という言葉に合わせてカッコ内のようにしておきます。

「読み」ファイル —(camera.yomi)
「音素」ファイル —(camera.phone)
「構文」ファイル —(camera.grammar)
「語彙」ファイル —(camera.voca)

まず「読み」ファイル(camera.yomi)から作成します。
ターミナル上で下記のコマンドを入力してください。

sudo vim camera.yomi

「読み」ファイル(camera.yomi)を作成「読み」ファイル(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をモジュールモードで起動Juliusをモジュールモードで起動

しばらく待つとターミナルに下図の表示が現れます。これでJuliusがサーバーとして動作し、Pythonで書かれたプログラムとの通信を待っている状態になります。

Juliusがサーバーとして動作している状態Juliusがサーバーとして動作している状態

このターミナルの画面は一旦そのままにしておき、新しいターミナルのウインドウを開いて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プログラムを作成カメラモジュールを操作して写真を撮影するPythonプログラムを作成

コードの流れを説明すると、Python側でJuliusと通信する準備が出来たあとに、Juliusから送られてくる音声認識の結果から認識文字列の行を探して、「かめら」という文字列を認識したら写真を撮影するという流れになっています。

JuliusとPythonプログラムの連携

Python側のプログラムの準備ができたら、実際に動かしてみます。
まずRaspberry PiにカメラモジュールとUSBマイクを接続します。

実際に動かす前に、先ほど一旦そのままにしておいた上側のターミナルのウインドウを移動し、下図のようにPythonプログラムのウィンドウと上下に並べ、連携を確認します。

下側のPythonプログラムのターミナルで下記のコマンドを入力、実行してください。

sudo python speechcam.py

JuliusとPythonの連携を確認JuliusとPythonの連携を確認

下側のターミナルで先のコマンドを実行すると、同時に上側のJuliusサーバーの方のウィンドウ内が変化します。
連携していることがこれで確認できました。

表示が変化し連携していることが確認できた表示が変化し連携していることが確認できた

連携していることが確認できたところで実際に動かしてみます。
「かめら」とマイクに向かって話してみてください。

成功すると、下側のウィンドウ内に「かめら」と表示が出て、カメラが起動します。

下側のウィンドウに「かめら」と表示が出てカメラが起動下側のウィンドウに「かめら」と表示が出てカメラが起動

実際に写真が撮影されたかどうかは「/home/pi」を確認してください。
正しく動作していれば、下図のように「my_pic.img」という画像ファイルが作成されています。

「my_pic.jpg」が撮影されたファイル「my_pic.jpg」が撮影されたファイル

プログラムを止めたい場合は、「ctr」+「c」押してプログラムを止めます。

Raspberry Pi×Julius×Pythonで拡がる可能性

今回はRaspberry Pi上のJuliusをモジュールモードで起動して音声認識サーバーとして動かし、言葉を認識させた上でPythonプログラムに結果を渡し、PythonプログラムからRaspberry Piに接続したカメラモジュールを操作して写真を撮影しました。

今回はカメラでの写真撮影でしたが、この仕組を応用してRaspberry Piに別のモジュールをつけたりすることで、特定の言葉を認識して様々な動作をするスマートスピーカー的なものを自分で作ることができます。この記事を参考に、ぜひ挑戦してみてください。

ライタープロフィール 合同会社 4D Pocket
石郷祐介

大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。

記事を
シェア