2024年4月1日月曜日

Raspberry Pi ロボットカー Julius(音声認識)

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 件のコメント:

コメントを投稿

Raspberry Pi Donkey Car スマートカー

  2020年に製作したDonkey Car スマートカー について記事にしました。 Donkey CarはRaspberry Pi のカメラからコースを ディープラーニングさせ自動走行を行います。(動画は白線上を自動走行)   動画