私的AI研究会 > WebIOPi応用
$ sudo service webiopi start
$ sudo service webiopi stop
$ ps ax |grep webiopi
1612 ? Ssl 0:00 /usr/bin/python3 -m webiopi -l /var/log/webiopi -c /etc/webiopi/config 1619 pts/0 S+ 0:00 grep --color=auto webiopi
1619 pts/0 S+ 0:00 grep --color=auto webiopi
$ sudo systemctl enable webiopi
$ sudo systemctl disable webiopi
http://192.168.xxx.xxx:8000(パスワード要求がある場合) ユーザー名とパスワードの入力
ユーザー名:webiopi パスワード:raspberry
webiopi.setDebug()
$ sudo webiopi -c /etc/webiopi/config -d※ 終了は「CTRL+C」の後、「CTRL+Z」
$ sudo rm -f WebIOPi-0.7.1.tar.gz $ sudo rm -rf WebIOPi-0.7.1
$ sudo vi /etc/webiopi/config
[HTTP] : passwd-file = /etc/webiopi/passwdパスワードを不要にする。
#passwd-file = /etc/webiopi/passwd
[SCRIPT] : #myscript = /home/pi/webiopi/examples/scripts/macros/script.py : [HTTP] : passwd-file = /etc/webiopi/passwd : #doc-root = /home/pi/webiopi/examples/scripts/macros : #welcome-file = index.html※ 両セクションの設定をコメントアウトする。
[SCRIPT] : myscript = /home/pi/webiopi/my06/script.py : [HTTP] : #passwd-file = /etc/webiopi/passwd : doc-root = /home/pi/webiopi/my06 : welcome-file = index.html※ /home/pi/webiopi/bb/06を /home/pi/webiopi/my06 にコピーしている。
$ cd ~/webiopi/my06 $ vi script.py #!/usr/bin/env python # -*- coding: utf-8 -*- import webiopi import time # デバッグ出力を有効に webiopi.setDebug() # GPIOライブラリの取得 GPIO = webiopi.GPIO PWM1 = 25 # R AIN1 PWM2 = 24 # AIN2 PWM3 = 23 # L BIN1 PWM4 = 22 # BIN2 LED1 = 21 # SW LED2 = 12 # R LED LED3 = 13 # L LED led2_mode = 0 led3_mode = 0 # WebIOPiの起動時に呼ばれる関数 def setup(): webiopi.debug("Script with macros - Setup") # GPIOのセットアップ GPIO.setFunction(PWM1, GPIO.PWM) GPIO.setFunction(PWM2, GPIO.PWM) GPIO.setFunction(PWM3, GPIO.PWM) GPIO.setFunction(PWM4, GPIO.PWM) # 初期のデューティー比を0%に(静止状態) GPIO.pwmWrite(PWM1, 0) GPIO.pwmWrite(PWM2, 0) GPIO.pwmWrite(PWM3, 0) GPIO.pwmWrite(PWM4, 0) # LED GPIO.setFunction(LED1, GPIO.OUT) GPIO.setFunction(LED2, GPIO.OUT) GPIO.setFunction(LED3, GPIO.OUT) # LED 初期設定 GPIO.digitalWrite(LED1, 1) GPIO.digitalWrite(LED2, 0) GPIO.digitalWrite(LED3, 0) # WebIOPiにより繰り返される関数 def loop(): for num in range(10): if led2_mode >= 0 and led3_mode >= 0: if led2_mode == 0: GPIO.digitalWrite(LED2, 0) else: GPIO.digitalWrite(LED2, 1) if led3_mode == 0: GPIO.digitalWrite(LED3, 0) else: GPIO.digitalWrite(LED3, 1) webiopi.sleep(0.25) if led2_mode >= 0 and led3_mode >= 0: if led2_mode == 1: GPIO.digitalWrite(LED2, 1) else: GPIO.digitalWrite(LED2, 0) if led3_mode == 1: GPIO.digitalWrite(LED3, 1) else: GPIO.digitalWrite(LED3, 0) webiopi.sleep(0.25) # WebIOPi終了時に呼ばれる関数 def destroy(): global led2_mode, led3_mode webiopi.debug("Script with macros - Destroy") # GPIO関数のリセット(入力にセットすることで行う) GPIO.setFunction(PWM1, GPIO.IN) GPIO.setFunction(PWM2, GPIO.IN) GPIO.setFunction(PWM3, GPIO.IN) GPIO.setFunction(PWM4, GPIO.IN) led2_mode = -1 led3_mode = -1 GPIO.setFunction(LED1, GPIO.IN) GPIO.setFunction(LED2, GPIO.IN) GPIO.setFunction(LED3, GPIO.IN) # 4つのPWMにデューティー比をまとめてセットするためのマクロ # commandIDは、iOSのSafariでPOSTがキャッシュされることへの対策 @webiopi.macro def pwm4Write(duty1, duty2, duty3, duty4, commandID): global led2_mode, led3_mode GPIO.pwmWrite(PWM1, float(duty1)) GPIO.pwmWrite(PWM2, float(duty2)) GPIO.pwmWrite(PWM3, float(duty3)) GPIO.pwmWrite(PWM4, float(duty4)) d1 = int(float(duty1) * 100.0) d2 = int(float(duty2) * 100.0) d3 = int(float(duty3) * 100.0) d4 = int(float(duty4) * 100.0) if d1 == 0 and d2 == 0: led2_mode = 0 led3_mode = 0 GPIO.digitalWrite(LED2, 0) GPIO.digitalWrite(LED3, 0) else: if d1 > 0 and d2 == 0: # R 前進 led2_mode = 1 GPIO.digitalWrite(LED2, 1) elif d1 == 0 and d2 > 0: # R 後退 led2_mode = 2 if d3 > 0 and d4 == 0: # L 前進 led3_mode = 1 GPIO.digitalWrite(LED3, 1) elif d3 == 0 and d4 > 0: # L 後退 led3_mode = 2 webiopi.debug("led2_mode = " + str(led2_mode)) webiopi.debug("led3_mode = " + str(led3_mode))
usage: open_jtalk [ options ] [ infile ] options: [ def][ min-- max] -x dir : 辞書ファイルのあるディレクトリ [ N/A] -m htsvoice : HTS voice ファイル [ N/A] -ow s : 出力音声ファイル名(wavファイル) [ N/A] -ot s : トレース情報出力ファイル名 [ N/A] -s i : サンプリング周波数 [ auto][ 1-- ] -p i : fフレーム周期 [ auto][ 1-- ] -a f : オールパス値 [ auto][ 0.0-- 1.0] -b f : ポストフィルター係数 [ 0.0][ 0.0-- 1.0] -r f : スピーチ速度係数 [ 1.0][ 0.0-- ] -fm f : 追加ハーフトーン [ 0.0][ -- ] -u f : 有声/無声境界値 [ 0.5][ 0.0-- 1.0] -jm f : スペクトラム系列内変動の重み [ 1.0][ 0.0-- ] -jf f : F0系列内変動の重み [ 1.0][ 0.0-- ] -g f : ボリューム (dB) [ 0.0][ -- ] -z i : オーディオバッファサイズ (if i==0, turn off) [ 0][ 0-- ] infile: text file : 入力テキストファイル名 [stdin]
$ sudo cp /usr/local/bin/speech.sh ~/Voice $ cd ~/Voice $ mv speech.sh makewav.sh $ vi makewav.sh #!/bin/bash #HTSVOICE=/usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice #HTSVOICE=/usr/share/hts-voice/mei/mei_happy.htsvoice #HTSVOICE=/usr/share/hts-voice/mei/mei_angry.htsvoice #HTSVOICE=/usr/share/hts-voice/mei/mei_bashful.htsvoice HTSVOICE=/usr/share/hts-voice/mei/mei_normal.htsvoice #HTSVOICE=/usr/share/hts-voice/mei/mei_sad.htsvoice DICDIR=/var/lib/mecab/dic/open-jtalk/naist-jdic/ #TMPVOICE=/home/pi/Voice/vioce.wav #echo "$1" | open_jtalk -x $DICDIR -m $HTSVOICE -ow $TMPVOICE echo "$1" | open_jtalk -x $DICDIR -m $HTSVOICE -ow $2 # for the device on Raspberry Pi #aplay -q $TMPVOICE aplay -q $TMPVOICE $2 # for USB sound card (old Raspbian) # or earphone jack on Raspberrry Pi (Raspberry Pi OS 2020-05-27 or later) #aplay -D plughw:1,0 -q $TMPVOICE #aplay -D plughw:1,0 -q $2 # for USB sound card (Raspberry Pi OS 2020-05-27 or later) #aplay -D plughw:2,0 -q $TMPVOICE #rm -f $TMPVOICE・音声ファイル名(TEMPVOICE)はコマンドラインから指定するので、コメントアウト。
$ ls makewav.sh $ ./makewav.sh "前進します" foward.wav $ ./makewav.sh "バックします" back.wav $ ./makewav.sh "右に曲がります" right.wav $ ./makewav.sh "左に曲がります" left.wav $ ./makewav.sh "停止します" stop.wav $ ./makewav.sh "ラズベリーパイを起動しました" boot.wav $ ./makewav.sh "ラズベリーパイを終了します" shutdown.wav $ ./makewav.sh "ウエブアイオーピーアイをスタートします" webiopi-start.wav $ ./makewav.sh "ウエブアイオーピーアイをストップします" webiopi-stop.wav $ ls -l 合計 1092 -rw-r--r-- 1 pi pi 118604 8月 24 09:45 back.wav -rw-r--r-- 1 pi pi 221324 8月 24 09:47 boot.wav -rw-r--r-- 1 pi pi 128204 8月 24 09:44 foward.wav -rw-r--r-- 1 pi pi 150764 8月 24 09:46 left.wav -rwxr-xr-x 1 pi pi 908 8月 24 09:36 makewav.sh -rw-r--r-- 1 pi pi 139724 8月 24 09:45 right.wav -rw-r--r-- 1 pi pi 218924 8月 24 09:48 shutdown.wav -rw-r--r-- 1 pi pi 120524 8月 24 09:56 stop.wav
$ cd ~/webiopi/my06 $ vi script.py #!/usr/bin/env python # -*- coding: utf-8 -*- import webiopi import time import subprocess : : # WebIOPiの起動時に呼ばれる関数 def setup(): webiopi.debug("Script with macros - Setup") subprocess.call("aplay -q /home/pi/Voice/boot.wav", shell=True) # GPIOのセットアップ : : # WebIOPi終了時に呼ばれる関数 def destroy(): global led2_mode, led3_mode webiopi.debug("Script with macros - Destroy") subprocess.call("aplay -q /home/pi/Voice/shutdown.wav", shell=True) # GPIO関数のリセット(入力にセットすることで行う) : : # 4つのPWMにデューティー比をまとめてセットするためのマクロ # commandIDは、iOSのSafariでPOSTがキャッシュされることへの対策 @webiopi.macro def pwm4Write(duty1, duty2, duty3, duty4, commandID): global led2_mode, led3_mode GPIO.pwmWrite(PWM1, float(duty1)) GPIO.pwmWrite(PWM2, float(duty2)) GPIO.pwmWrite(PWM3, float(duty3)) GPIO.pwmWrite(PWM4, float(duty4)) d1 = int(float(duty1) * 100.0) d2 = int(float(duty2) * 100.0) d3 = int(float(duty3) * 100.0) d4 = int(float(duty4) * 100.0) if d1 == 0 and d2 == 0: led2_mode = 0 led3_mode = 0 GPIO.digitalWrite(LED2, 0) GPIO.digitalWrite(LED3, 0) else: if d1 > 0 and d2 == 0: # R 前進 led2_mode = 1 GPIO.digitalWrite(LED2, 1) elif d1 == 0 and d2 > 0: # R 後退 led2_mode = 2 if d3 > 0 and d4 == 0: # L 前進 led3_mode = 1 GPIO.digitalWrite(LED3, 1) elif d3 == 0 and d4 > 0: # L 後退 led3_mode = 2 wav_file = "aplay -q /home/pi/Voice/" wav_mode = 0 if led2_mode == 0 and led3_mode == 0: wav_file += "stop.wav" wav_mode = 1 elif led2_mode == 1 and led3_mode == 1: wav_file += "foward.wav" wav_mode = 1 elif led2_mode == 2 and led3_mode == 2: wav_file += "back.wav" wav_mode = 1 elif led2_mode == 1 and led3_mode == 2: wav_file += "right.wav" wav_mode = 1 elif led2_mode == 2 and led3_mode == 1: wav_file += "left.wav" wav_mode = 1 if wav_mode == 1: subprocess.call(wav_file, shell=True) webiopi.debug("led2_mode = " + str(led2_mode)) webiopi.debug("led3_mode = " + str(led3_mode))
$ aplay -l
$ cat /proc/asound/modules 0 snd_bcm2835
$ sudo raspi-config・「7 Advanced Option」を選択