LoginSignup
a_s_0901
@a_s_0901

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Raspberry Piで音声認識

解決したいこと

Raspberry Pi4を用いて、pythonからjuliusをモジュールモードで起動し、音声認識により指示を与えようとしています。
その前段階として、"女性"または"男性"とjuliusが認識するとそれぞれの音声合成LSIが"こんにちは"と喋るプログラムを作りたいのですが、どちらの音声合成LSIが喋りません。またエラーも特に表示されていません。
解決方法を教えて下さい。

発生している問題・エラー

エラーは出ていないのに、音声合成LSIが喋りません。

該当するソースコード

import socket
import time
import pykakasi
import RPi.GPIO as GPIO
import smbus

HOST = '000.00.000.000'   # juliusサーバーのIPアドレス
PORT = 10500         # juliusサーバーの待ち受けポート
DATESIZE = 1024     # 受信データバイト数

kks = pykakasi.kakasi()

GPIO.setmode(GPIO.BCM)
bus = smbus.SMBus(1)

class Julius:

    def ATP3011_send_cmd5(cmd):
        cmd0 = ord(cmd[0])
        cmd1 = []
        for c in cmd[1:]:
            cmd1.append(ord(c))
            bus.write_i2c_block_data(0x2f,cmd0,cmd1)

    def ATP3011_send_cmd6(cmd):
        cmd0 = ord(cmd[0])
        cmd1 = []
        for c in cmd[1:]:
            cmd1.append(ord(c))
            bus.write_i2c_block_data(0x2e,cmd0,cmd1)

    def __init__(self):

        self.sock = None

    def run(self):

        # socket通信でjuliusサーバーに接続
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.sock:
            self.sock.connect((HOST, PORT))

            strTemp = "" # 話した言葉を格納する変数
            fin_flag = False # 話終わりフラグ

            while True:

                def ATP3011_send_cmd5(cmd):
                    cmd0 = ord(cmd[0])
                    cmd1 = []
                    for c in cmd[1:]:
                        cmd1.append(ord(c))
                        bus.write_i2c_block_data(0x2f,cmd0,cmd1)

                def ATP3011_send_cmd6(cmd):
                    cmd0 = ord(cmd[0])
                    cmd1 = []
                    for c in cmd[1:]:
                        cmd1.append(ord(c))
                        bus.write_i2c_block_data(0x2e,cmd0,cmd1)


                # juliusサーバからデータ受信
                data = self.sock.recv(DATESIZE).decode('utf-8')

                for line in data.split('\n'):
                    # 受信データから、<WORD>の後に書かれている言葉を抽出して変数に格納する。
                    # <WORD>の後に、話した言葉が記載されている。
                    index = line.find('WORD="')
                    if index != -1:
                        # strTempに話した言葉を格納
                        strTemp = strTemp + line[index+6:line.find('"',index+6)]

                    # 受信データに</RECOGOUT>'があれば、話終わり ⇒ フラグをTrue
                    if '</RECOGOUT>' in line:
                        fin_flag = True

                # 話した言葉毎に、print文を実行
                if fin_flag == True:
                    if '女性' in strTemp:
                        print("mode:女性")
                        cmd = "konnnichiwa\r"                 
                        ATP3011_send_cmd5(cmd)

                    if '男性' in strTemp:
                        print("mode:男性")
                        cmd = "konnnitchiwa\r"
                        ATP3011_send_cmd6(cmd)

                    else: #認識した言葉をローマ字になおす
                        print("話した言葉:" + strTemp)
                        text = strTemp
                        result = kks.convert(text)
                        for item in result:
                            X = "{}".format(item['hepburn'].capitalize())
                            print(X)

                    fin_flag = False
                    strTemp = ""



if __name__ == "__main__":

    julius = Julius()
    julius.run()

自分で試したこと

cmdにローマ字を格納する方法をユーザー関数に変えてやってみましたがうまくいきませんでした。

0

No Answers yet.

Your answer might help someone💌