質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Julius

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです。数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1167閲覧

ラズパイとpythonを使い、juliusの音声認識の結果からopencvの目の検知を開始し、更に音声で目の検知を再開・一時停止したいです。

susss

総合スコア1

Julius

Julius は,音声認識システムの開発・研究のためのオープンソースの高性能な汎用大語彙連続音声認識エンジンです。数万語彙の連続音声認識を一般のPCやスマートフォン上でほぼ実時間で実行できる軽量さとコンパクトさを持っています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/01/11 17:52

前提

ここに質問の内容を詳しく書いてください。

juliusを使って音声認識を行い、'start'と音声認識をするとopencvを使いリアルタイムで目の検知を行い、'stop'と認識すると目の検知を一時停止し、再び'start'と認識すると一時停止を再開するプログラムを作っています。エラーは出ずに動き、'start'と喋るとframeが開き目の検知が始まるのですが、マイクが音を拾う瞬間だけカメラが動きます。最初は、カメラが重たいのかなと思いfpsを変更したのですが変わりません。

実現したいこと

音声認識で、'start'という言葉を認識すると目の検知を開始する。
音声認識で、'stop'という言葉を認識すると目の検知を一時停止する。
以降は、'start' 'stop'で再開・一時停止をできるようにしたい。
ここに実現したいことを箇条書きで書いてください。

  • ▲▲機能を動作するようにする

発生している問題・エラーメッセージ

該当のソースコード

python

1import cv2 2import time 3import socket 4import xml.etree.ElementTree as ET 5 6cap = cv2.VideoCapture(0) 7cap.set(cv2.CAP_PROP_FPS, 10) 8cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) 9cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) 10eye_cascade = cv2.CascadeClassifier('haarcascade_eye_tree_eyeglasses.xml') 11 12detect_eyes = False 13last_detection = time.time() 14 15client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16client.connect(('localhost', 10500)) 17 18try: 19 data = '' 20 while True: 21 if '</RECOGOUT>' in data: 22 start_tag = data.find('<RECOGOUT>') 23 end_tag = data.find('</RECOGOUT>')+len('</RECOGOUT>') 24 data = data[start_tag:end_tag] 25 root = ET.fromstring(data) 26 for whypo in root.findall('./SHYPO/WHYPO'): 27 command = whypo.get('WORD') 28 score = float(whypo.get('CM')) 29 print(command + ':' + str(score)) 30 31 if score >= 0.9: 32 if command == 'start': 33 detect_eyes = True 34 print('Start Eye detection') 35 elif command == 'stop': 36 detect_eyes = False 37 print('Stop Eye detection') 38 39 print('\n') # new line 40 41 data = '' 42 43 else: 44 data += client.recv(1024).decode('utf-8') 45 46 if detect_eyes: 47 ret, rgb = cap.read() 48 gray = cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY) 49 eyes = eye_cascade.detectMultiScale(gray, scaleFactor=1.11, minNeighbors=3, minSize=(8, 8)) 50 current_time = time.time() 51 if len(eyes)>0: 52 last_detection = current_time 53 elif current_time - last_detection > 1.5: 54 cv2.putText(rgb,"Sleepy eyes! Wake up!",(10,100), cv2.FONT_HERSHEY_PLAIN, 3, (0,0,255), 2, cv2.LINE_AA) 55 56 for ex, ey, ew, eh in eyes: 57 cv2.rectangle(rgb, (ex, ey), (ex + ew, ey + eh), (255, 255, 0), 1) 58 59 cv2.imshow('frame', rgb) 60 if cv2.waitKey(1) == 27: 61 break 62 63except KeyboardInterrupt: 64 client.close() 65 cap.release() 66 cv2.destroyAllWindows()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

こちらのサイトのコードを参考に、組み合わせて書いています。
音声認識
https://monomonotech.jp/kurage/raspberrypi/julius.html
画像処理
https://qiita.com/mogamin/items/a65e2eaa4b27aa0a1c23

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2023/01/11 22:31

質問のポイントではありませんが、TCP(stream)の通信単位は「バイト」なので、juiliusから貰ったデータが一回のrecvで一塊として受信できる保証はない、というのは考慮されていますか? 「大抵動くからヨシ」とするのですか?
jbpb0

2023/01/12 05:57

> コードを修正したところ無事解決しました。 質問を「解決済」にしてください
guest

回答1

0

自己解決

hoshi-takanoriさん返信ありがとうございます。hoshi-takanoriさんのおっしゃる通りで、client.recv(1024)でブロッキングモードになっており、音声認識のデータが到着するまではプログラムがブロックされていました...コードを修正したところ無事解決しました。以下に修正したコードを記述します。

python

1import errno 2client.setblocking(False) 3try: 4 data = '' 5 while True: 6 try: 7 recv_data = client.recv(1024) 8 except socket.error as e: 9 if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK: 10 raise 11 continue 12 13 data += recv_data.decode('utf-8')

投稿2023/01/11 20:35

susss

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問