【Zenbo】和Zenbo說說話吧

機器人最棒的一個功能就是可以跟我們使用我們熟悉的自然語言對話。這個功能其實現在因為ChatGPT API的推出,使用Python程式已可輕易地在自己的電腦中實現了,然而,對話的過程如果能夠透過Zenbo說出來的話,就更有和機器人互動的感覺。我們這篇文章就來教同學們如何完成這個有趣的功能。

在這個例子中,我們想要讓電腦來收聽並辨識使用者講話的內容,在虛擬環境中要先安裝3個模組,分別是pyaudio、pydub、以及SpeechRecognition。安裝完畢之後,即可利用以下這個例子,來測試一下你的電腦是否可以順利地完成語音辨識的功能:

import speech_recognition as sr

r = sr.Recognizer()

text = ""
while "結束" not in text:
    with sr.Microphone() as source:
        print("Listening...")
        try:
            audio_data = r.listen(source=source, timeout=5)
            text = r.recognize_google(audio_data, language='zh-TW')
            print(text)
        except:
            text = ""
print("Bye!")

上面的這個程式會不斷地聆聽我們講話的內容並把這些內容翻譯成文字並顯示出來,以下是程式執行的過程:

有了這個功能之後,我們就可以把語音辨識的功能變成一個函式,把它叫做get_prompt,取代原本的input函式,然後,我們就完成了用自然語言和Zenbo對話的功能了。程式如下,有興趣的同學們趕快試試看吧:

import speech_recognition as sr
import pyzenbo
import openai
from pyzenbo.modules.dialog_system import RobotFace

host = open('ip.txt', "r", encoding="utf-8").read()
sdk = pyzenbo.connect(host)
key = open("key.txt", "r", encoding="utf-8").read()
openai.api_key= key
r = sr.Recognizer()

def get_prompt():
    with sr.Microphone() as source:
        print("Listening...")
        try:
            audio_data = r.listen(source=source, timeout=5)
            text = r.recognize_google(audio_data, language='zh-TW')
            print(text)
        except:
            text = ""
        return text
sdk.robot.speak("你好,我是珍寶萬事通,有什麼事都可以問我喔!")
prompt = get_prompt()
while "結束" not in prompt:
    if prompt !="":
        sdk.robot.set_expression(RobotFace.PLEASED, "你剛剛說,"+prompt)
        response = openai.Completion.create(
            engine='text-davinci-003',
            prompt=prompt,
            temperature=0.7,
            max_tokens=100,
            n=1,
            stop=None,
        )
        reply = response.choices[0].text.strip()
        sdk.robot.speak("我覺得:"+reply)
        sdk.robot.speak("你還有什麼想問的嗎?")
    prompt = get_prompt()
sdk.robot.speak("那就下次再聊吧!")
sdk.robot.set_expression(RobotFace.HIDEFACE) 
sdk.release()

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *