見出し画像

ラズパイをAIおしゃべりbotにする

【2/15追記】
DeppL翻訳を挟んだ方がよいと聞いたのでその工程を挟むことにしました。

タイトル通りです。
やることとしては
①Azureで音声認識する
②DeppLで日本語を英語にする
③OpenAIでAIと対話する
④DeppLでOpenAIの出力結果を日本語にする
⑤jtalkで会話の内容を発声する
です。以下の動画はssh越しに操作していますが実行環境はラズパイです。

では早速作っていきましょう。

①Azureで音声認識する

前回の記事を読んで「azure_speech.py」を導入してください。

②deepLのAPIのPythonクライアントインストール

pip install --upgrade deepl

/home/pi/DeepL_Ja_En.py

import deepl

def DeepL_ja_en(inputtext):
	API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # DeepLのAPIキーを指定
	text = inputtext
	source_lang = 'JA'
	target_lang = 'EN-US'

	# イニシャライズ
	translator = deepl.Translator(API_KEY)

	# 翻訳を実行
	result = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)
	return result

if __name__ == "__main__": 
	print(DeepL_ja_en("こんにちは"))

/home/pi/DeepL_En_Ja.py

import deepl

def DeepL_en_ja(inputtext):
	API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # DeepLのAPIキーを指定
	text = inputtext
	source_lang = 'EN'
	target_lang = 'JA'

	# イニシャライズ
	translator = deepl.Translator(API_KEY)

	# 翻訳を実行
	result = translator.translate_text(text, source_lang=source_lang, target_lang=target_lang)
	return result

if __name__ == "__main__": 
	print(DeepL_en_ja("Hello"))

で動作を確認(あとで使うの残しておく)

③OpenAIのAPIのPythonクライアントインストール

python -m pip install -U pip setuptools
pip install openai

各位、APIキーも取得しておいてください。

④合成音声をインストール

sudo apt-get install open-jtalk
sudo apt-get install open-jtalk-mecab-naist-jdic
sudo apt-get install hts-voice-nitech-jp-atr503-m001 -y

女性の声をDL

wget https://sourceforge.net/projects/mmdagent/files/MMDAgent_Example/MMDAgent_Example-1.6/MMDAgent_Example-1.6.zip/download -O MMDAgent_Example-1.6.zip
unzip MMDAgent_Example-1.6.zip MMDAgent_Example-1.6/Voice/*
sudo cp -r MMDAgent_Example-1.6/Voice/mei/ /usr/share/hts-voice

これだけだとPythonから動かないので下記を参考にpyopenjtalkをインストールしてください。
https://self-development.info/python%E3%81%8B%E3%82%89open-jtalk%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%80%90%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E9%9F%B3%E5%A3%B0%E5%90%88%E6%88%90/

以下自分用メモ。

sudo apt install -y cmake
pip install Cython
python -m pip install --upgrade pip setuptools
pip install pyopenjtalk

⑤「OK、Google。ラズパイとお喋り」で起動できるようにする。

以下の2サイトを参考に設定。

Scene name:「ラズパイとおしゃべり」
       「ラズパイおしゃべり終了」

画像

URL: https://api.beebotte.com/v1/data/publish/チャンネル名/トピック名?token=[Beebotteのトークン]
Method:Post
Content Type:application
/json
Body:{"data":[{"comand":"Talk_ON"}]}
     {"data":[{"comand":"Talk_OFF"}]}

https://beebotte.com/certs/mqtt.beebotte.com.pem(BeeBotteの証明書)をDLして『/home/pi/mqtt.beebotte.com.pem』に置いておくこと

⑥スクリプトや会話ログファイルを作成

・/home/pi/azure_speech.py
前回の記事を参照

・/home/pi/DeepL_Ja_En.py
・/home/pi/DeepL_En_Ja.py
今回の記事の『②deepLのAPIのPythonクライアントインストール』
を参照

・/home/pi/OpenAI.py(APIキーは各自設定)

import openai
import jtalk
import azure_speech
import DeepL_Ja_En
import DeepL_En_Ja
  
def openai_Talk():
	inputtext = azure_speech.recognize_from_microphone()
	print("私:" + inputtext)
	API_KEY = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" # OpenAIのAPIキーを指定
	openai.api_key = API_KEY
	f  = open('talk.log', 'r')
	Log = f.read()
	f.close()
	prompt ='''
私:{}
AI:'''.format(inputtext)
	Intext_ja = Log + prompt
	Intext_en =  DeepL_Ja_En.DeepL_ja_en(Intext_ja).text
	response = openai.Completion.create(
		engine='text-davinci-003',
		prompt=Intext_en,
		max_tokens=200,
		temperature=0.5,
		stop="\n")
	Restext_en = response['choices'][0]['text']
	Restext_ja = DeepL_En_Ja.DeepL_en_ja(Restext_en).text
	print("AI:" + Restext_ja)
	newLog = Intext_ja + Restext_ja
	f = open('talk.log', 'w')
	f.write(newLog)
	f.close()
	jtalk.jtalk(Restext_ja)

if __name__ == "__main__":
	openai_Talk()

・/home/pi/jtalk.py

import subprocess

def jtalk(t):
    open_jtalk=['open_jtalk']
    mech=['-x','/var/lib/mecab/dic/open-jtalk/naist-jdic']
    htsvoice=['-m','/usr/share/hts-voice/mei/mei_normal.htsvoice']
    speed=['-r','1.0']
    outwav=['-ow','open_jtalk.wav']
    cmd=open_jtalk+mech+htsvoice+speed+outwav
    c = subprocess.Popen(cmd,stdin=subprocess.PIPE)
    c.stdin.write(t.encode())
    c.stdin.close()
    c.wait()
    aplay = ['aplay','-q','open_jtalk.wav']
    wr = subprocess.Popen(aplay)
    wr.wait()

・/home/pi/homeauto.py

# conding: utf-8
import paho.mqtt.client as mqtt
import json
import time
import multiprocessing
import sys
import OpenAI

TOKEN = "token_XXXXXXXXXXXXXXXX" # beebotteのChannelTokenを指定
HOSTNAME = "mqtt.beebotte.com"
PORT = 8883
TOPIC = "RaspberryPi/SmartRemocon"
CACERT = "mqtt.beebotte.com.pem"  # DLしたmqtt.beebotte.com.pemのパス指定

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(TOPIC)

play_thread = None

def on_message(client, userdata, msg):
	data = json.loads(msg.payload.decode("utf-8"))["data"][0]
	cmd = data["comand"]
	if cmd == "Talk_ON":
		time.sleep(3)
		if play_thread is not None:
			play_thread.terminate()
		Loop()

	elif cmd == "Talk_OFF":
		play_thread.terminate()

def Loop():
	global play_thread
	play_thread = multiprocessing.Process(target = AITalk)
	play_thread.start()

def AITalk():
	while True:
		OpenAI.openai_Talk()

client = mqtt.Client()
client.username_pw_set("token:%s"%TOKEN)
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(CACERT)
client.connect(HOSTNAME, port=PORT, keepalive=60)
client.loop_forever()

・/home/pi/talk.log

以下は、AIアシスタントとの会話です。このアシスタントは、日本語が堪能で、親切で、クリエイティブで、クレバーで、とてもフレンドリーです。

私:はじめまして。私は人間です。
AI:はい、私はAIアシスタントです。
私:私はいくつかあなたに質問します。あなたはそれに答えてください
AI:はい、私はあなたの質問に答えます。
画像
こんな感じの構成になります。

④スクリプトを実行

python /home/pi/homeauto.py

問題なく動けばSystemd等を使って電源入れたとき自動起動するようにすればいいでしょう。

以下は実際に会話させた会話ログです。

画像

いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
ラズパイをAIおしゃべりbotにする|とりにく
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1