@uhpa (村瀬 陽一)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

ラズベリーパイと音声で最後のLチカができない。ご教示をお願いいたします。

image.png
https://qiita.com/mooriii/items/6a16663ce9a80b2e2b92
の記事を見ながら、実行しています。

途中までは、imagou様やhon_no_mushi様のお力を頂き、実行できましたが、最後のLチカが実現でいません。ご知見のある方、対応方法をご教示頂けませんでしょうか。

■実行内容
記事の
image.png

の3行を自身の環境に合わせて、
$ sudo modprobe snd-pcm-oss
$ julius -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip -gram ~/julius/dict/denki -module
$ python /home/pi/prog/juliustest.py
と実行すると、
image.png

image.png
となります。

記事では、
image.png
となっていて、わたしの実行した表示と違います。(末尾に[/s]が入っている)

■プログラム(juliustest.py)の情報
image.png
image.png

*21行目は、hon_no_mushi様のご教示で変更
*23行目は、https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11199585811
 のuso8mega様のご教示で変更

■juliustest.pyのテキスト

import socket
import string
import led_h as on
import led_l as off
import flash

host = '192.168.2.101' # 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:
########## "/RECOGOUT"を受信するまで、一回分の音声データを全部読み込む。
########## while (string.find(data, "\n.") == -1):
while (data.find("\n.") == -1):
########## data = data + sock.recv(1024)
data = data + sock.recv(1024).decode('utf8')

########## 音声XMLデータから、を抽出して音声テキスト文に連結する。
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 == "つけて":
on.main()
if strTemp == "けして":
off.main()
if strTemp == "てんめつ":
flash.main()
data = ""

■その他プログラム
以下のように同一フォルダにあります。
image.png
また、例えば、led_h.pyは
image.png
であり、led_h.py単独で実行させた場合、GPIO21に接続したLEDは点灯します。

以上です。

0 likes

1Answer

(クローズ済み・・・?なのでしょうか?)

文終了記号[/s]に関しては、Juliusのドキュメントに記述があります。

SRILM への対応について

バージョン 4.1.2 以降では SRILM に対する対処が入っているため,
必要な手順は4.1.1 以前と 4.1.2 以降で異なる.
以下,4.1.2 以降の場合の構築手順を示す. 特にステップ2に注意せよ.

Step 1) 学習コーパスを一行一文で用意する.
Step 2) 各文の先頭・末尾に文開始記号 "<s>" あるいは文終了記号 "</s>" があれば,それらを取り除く.
Step 3) SRILM で前向き2-gramを学習する.オプションは必要に応じて適宜指定すること.

元々のコードでは、文開始記号の対応はあっても、文終了記号の対応はなかったようです。

pythonでの判定分の書き方わかってない+実際のデータが無いので、間違っているかもですが、こんな感じでしょうか?

- if line != "[s]":
+ if line != "[s]" and line != "[/s]":
    strTemp = strTemp + line

あるいは、判定時に完全一致する代わりに、キーワードが含まれているかだけを条件とする、という手もあります、この場合、後ろ側に文字があろうがなかろうが動くのではないかな、と思います。

  if strTemp != "":
    print("結果:" + strTemp)
- if strTemp == "つけて":
+ if "つけて" in strTemp:
    on.main()
- if strTemp == "けして":
+ if "けして" in strTemp:
    off.main()
- if strTemp == "てんめつ":
+ if "てんめつ" in strTemp:
    flash.main()

備考

raspberryPi + Juliusで、Lチカされている方もいらっしゃいますので、そちらも参考ください。

0Like

Comments

  1. @uhpa

    Questioner

    hon_no_mushi様

    いったん、私自身でできましたので、お問い合わせをクローズさせて頂きました。
    ただ、詳しい、ご回答大変ありがとうございます。
    これから頂きましたご知見を試してみます。

Your answer might help someone💌