🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Raspberry Pi

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

Python

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

Q&A

解決済

1回答

955閲覧

pythonで音声認識&合成

退会済みユーザー

退会済みユーザー

総合スコア0

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2021/01/07 02:52

編集2021/01/08 03:50

python をつかって、Juliusで音声認識→pykakasiでローマ字変換→音声合成ICが発話というシステムです。
エラーがないのにうまく行きませんでした。

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

HOST = '172.26.102.216' # 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 Romaji(): print("話した言葉:" + strTemp) text = strTemp result = kks.convert(text) for item in result: romaji = "{}".format(item['hepburn'].capitalize()) print(romaji) return romaji 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 = "konnnichiwa\r" ATP3011_send_cmd6(cmd) else: cmd = Romaji() +"\r" ATP3011_send_cmd5(cmd) #ICniローマ字をwatasu fin_flag = False strTemp = ""

if name == "main":

julius = Julius() julius.run()

追記:
一旦このプログラムは無かったことにし、1から作り直している最中です。

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

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

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

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

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

shiracamus

2021/01/07 03:38

classの使い方が無理矢理すぎます。 まずは、全部単純な関数にすることをお勧めします。
退会済みユーザー

退会済みユーザー

2021/01/07 03:54

アドバイスありがとうございます。 Julius,pykakasi,音声合成ICはそれぞれ単体で動かすプログラムはあるのですが、それを合体した結果こうなってしまいました。 もっと単純になるよう考え直してみたいと思います。
guest

回答1

0

ベストアンサー

女性の処理だけ抜き出して実行してみたところ、以下のように関数を呼び出そうとしています。
意図した引数になっていますか?

python

1def ATP3011_send_cmd5(cmd): 2 cmd0 = ord(cmd[0]) 3 cmd1 = [] 4 for c in cmd[1:]: 5 cmd1.append(ord(c)) 6 print(f'bus.write_i2c_block_data(0x2f,{cmd0},{cmd1})') 7 8print("mode:女性") 9cmd = "konnnichiwa\r" 10ATP3011_send_cmd5(cmd)

実行結果

mode:女性 bus.write_i2c_block_data(0x2f,107,[111]) bus.write_i2c_block_data(0x2f,107,[111, 110]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104, 105]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104, 105, 119]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104, 105, 119, 97]) bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104, 105, 119, 97, 13])

投稿2021/01/07 04:01

shiracamus

総合スコア5406

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

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

退会済みユーザー

退会済みユーザー

2021/01/07 04:48

試していただきありがとうございます。 そちらのパートは、"konnnichiwa"をUnicodeに変換し、ATP3011_send_cmdの関数に渡して1文字分ずつicに送っているものと自分では理解しております。そのため、意図した関数が送られてると思うのですが…。 自信がないため何か変なところがあればご指摘いただきたいです。
shiracamus

2021/01/07 05:08 編集

先頭文字だけ単独引数で、2文字目以降を1文字ずつ増やしたリストにして引数にしていますが、正しいですか? bus.write_i2c_block_data(0x2f,107,[111, 110]) や bus.write_i2c_block_data(0x2f,107,[111, 110, 110, 110, 105, 99, 104, 105, 119, 97, 13]) を実行して、発声されますか?
退会済みユーザー

退会済みユーザー

2021/01/07 05:31

import RPi.GPIO as GPIO import smbus GPIO.setmode(GPIO.BCM) bus = smbus.SMBus(1) bus.write_i2c_block_data(0x2e,107,[111,110,110,110,105,99,104,105,119,97,13]) 上記を実行しましたが、「こんにちは」と発声しました。 また、先頭をリストに入れてしまうと発声しないため単独にしています。
shiracamus

2021/01/07 05:55 編集

回答欄に書いたように "konnnichiwa\r" だけで 11回も bus.write_i2c_block_data を呼び出していますが、正しいですか?
退会済みユーザー

退会済みユーザー

2021/01/07 06:03

理解が遅くすみません。正しくないです。 for文ではICに入れる配列を作るだけで、bus.write〜dataを呼び出すのは一度だけです。 for文から抜き出してちゃんと書いたところ、女性のICが発話しました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問