2019年に製作したRaspberry Pi ロボットカー Julius(音声認識)について記事にしました。
ウェブカメラ C270内臓マイクからJulius音声認識にてロボットカーを制御しました。
同ブログ関連記事:【Raspberry Pi ロボットカー回路図】
動画
プログラム実行は音声認識・カー制御それぞれ実行
■sudo modprobe snd-pcm-oss
julius -C ~/julius/julius-kits/grammar-kit-v4.1/hmm_mono.jconf -nostrip -input mic -gram ~/julius/julius-kits/car -module &
■cd car
python jcar4.py
juliusインストール
juliusインストールについて参考サイト:
mkdir julius
cd julius
wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz
tar xvzf v4.4.2.1.tar.gz
cd julius-4.4.2.1
sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev
./configure --with-mictype=alsa
make
sudo make install
cd ../
mkdir julius-kit
cd julius-kit
wget https://osdn.net/dl/julius/dictation-kit-v4.4.zip
unzip dictation-kit-v4.4.zip
USBオーディオアダプタ設定
■sudo nano /etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio,snd_bcm2835
options snd_usb_audio index=0
options snd_bcm2835 index=1
■sudo nano ~/.asoundrc
defaluts.pcm.card 1
defaults.ctl.card 0
pcm.!default {
type hw
card 1
}
ctl.!default {
type hw
card 1
}
■sudo nano /etc/modules
#「snd-pcm-oss」を追加する
snd-pcm-oss
音声合成
aquestalkpi
音声認識設定
■.yomi
みぎ みぎ
ひだり ひだり
まえ まえ
うしろ うしろ
■.voca
% MIGI
みぎ m i g i
% HIDARI
ひだり h i d a r i
% MAE
まえ m a e
% USHIRO
うしろ u sh i r o
% NS_B
[s] silB
% NS_E
[s] silE
■.grammar
S : NS_B CAR NS_E
CAR : MIGI
CAR : HIDARI
CAR : MAE
CAR : USHIRO
プログラム(python jcar4.py)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import string
import subprocess
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(5, GPIO.OUT) #AIN1
GPIO.setup(6, GPIO.OUT) #BIN1
GPIO.setup(12, GPIO.OUT) #AIN2
GPIO.setup(13, GPIO.OUT) #BIN2
AIN1= GPIO.PWM(5,100) #GPIO05 as PWM output, with 100Hz frequency
BIN1= GPIO.PWM(6,100) #GPIO06 as PWM output, with 100Hz frequency
AIN2 = GPIO.PWM(12,100) #GPIO12 as PWM output, with 100Hz frequency
BIN2= GPIO.PWM(13,100) #GPIO13 as PWM output, with 100Hz frequency
AIN1.start(0)
BIN1.start(0)
AIN2.start(0)
BIN2.start(0)
def car_s():
AIN1.ChangeDutyCycle(0)
BIN1.ChangeDutyCycle(0)
AIN2.ChangeDutyCycle(0)
BIN2.ChangeDutyCycle(0)
time.sleep(0.1)
def car_f():
AIN1.ChangeDutyCycle(50)
BIN1.ChangeDutyCycle(50)
AIN2.ChangeDutyCycle(0)
BIN2.ChangeDutyCycle(0)
time.sleep(0.2)
def car_r():
AIN1.ChangeDutyCycle(50)
BIN1.ChangeDutyCycle(0)
AIN2.ChangeDutyCycle(0)
BIN2.ChangeDutyCycle(50)
time.sleep(0.2)
def car_l():
AIN1.ChangeDutyCycle(0)
BIN1.ChangeDutyCycle(50)
AIN2.ChangeDutyCycle(50)
BIN2.ChangeDutyCycle(0)
time.sleep(0.2)
def car_b():
AIN1.ChangeDutyCycle(0)
BIN1.ChangeDutyCycle(0)
AIN2.ChangeDutyCycle(50)
BIN2.ChangeDutyCycle(50)
time.sleep(0.2)
def jtalk_f():
subprocess.call("./jtalk.sh 前に進みます", shell=True)
#subprocess.call('./AquesTalkPi "前" | aplay ', shell=True)
def jtalk_r():
subprocess.call("./jtalk.sh 右に曲がります", shell=True)
#subprocess.call('./AquesTalkPi "右" | aplay ', shell=True)
def jtalk_l():
subprocess.call("./jtalk.sh 左に曲がります", shell=True)
#subprocess.call('./AquesTalkPi "左" | aplay ', shell=True)
def jtalk_b():
subprocess.call("./jtalk.sh 後ろに下がります", shell=True)
#subprocess.call('./AquesTalkPi "うしろ" | aplay ', shell=True)
subprocess.call("./jtalk.sh こんにちは、メイです。音声認識でロボットカーを走行します。前 右 左 うしろ で指示願います。", shell=True)
host = '192.168.1.11' # Raspberry PiのIPアドレス
port = 10500 # juliusの待ち受けポート
# パソコンからTCP/IPで、自分PCのjuliusサーバに接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
data = ""
while True:
car_s()
# "/RECOGOUT"を受信するまで、一回分の音声データを全部読み込む。
while (string.find(data, "\n.") == -1):
data = data + sock.recv(1024)
# 音声XMLデータから、<WORD>を抽出して音声テキスト文に連結する。
strTemp = ""
for line in data.split('\n'):
index = line.find('WORD="')
if index != -1:
line = line[index +6:line.find('"', index + 6)]
if line != "[s]":
strTemp = strTemp + line
if strTemp != "":
print("結果:" + strTemp)
if strTemp == "うしろ":
jtalk_b()
car_b()
if strTemp == "まえ":
jtalk_f()
car_f()
if strTemp == "みぎ":
jtalk_r()
car_r()
if strTemp == "ひだり":
jtalk_l()
car_l()
data = ""
0 件のコメント:
コメントを投稿