ラズパイを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等を使って電源入れたとき自動起動するようにすればいいでしょう。
以下は実際に会話させた会話ログです。


コメント