首頁 > 軟體

Python 實現簡單智慧聊天機器人

2022-05-30 14:01:48

簡要說明:

最近兩天需要做一個python的小程式, 就是實現人與智慧機器人(智慧對話介面)的對話功能,目前剛剛測試了一下可以實現, 就是能夠實現個人與機器的智慧對話(語音交流)。

總體的思路:

大家可以設想一下, 如果要實現人與機器的智慧對話, 肯定要有以下幾個步驟:

  • 計算機接收使用者的語音輸入
  • 將使用者輸入的語音輸入轉化為文字資訊
  • 呼叫智慧對話介面, 傳送請求文字資訊, 獲取介面返回的智慧回答文字資訊
  • 將回答文字資訊轉化為語音格式輸出

這裡可以安裝很多現成的庫函數, 輔助我們系統的實現。

需要準備的環境

以下是需要安裝的一些python依賴包

  • pip install pyaudio 安裝pyaudio依賴包, 用於錄音、生成wav檔案
  • pip install baidu-aip 安裝百度AI的sdk, 呼叫語音技術介面將音訊識別為文字資料返回
  • pip install pyttsx3 安裝pyttsx3依賴包, 將文字資訊以音訊的格式播放出來

接下來我會逐步實現以上每個功能,最後再組合起來。

接收使用者的語音輸入,並將其存為音訊檔

import time
import wave
from pyaudio import PyAudio, paInt16
framerate = 16000  # 取樣率
num_samples = 2000  # 取樣點
channels = 1  # 聲道
sampwidth = 2  # 取樣寬度2bytes
FILEPATH = '../voices/myvoices.wav'      #該檔案目錄要存在
#用於接收使用者的語音輸入, 並生成wav音訊檔(wav、pcm、mp3的區別可詳情百度)
class Speak():
    #將音訊資料儲存到wav檔案之中
    def save_wave_file(self, filepath, data):
        wf = wave.open(filepath, 'wb')
        wf.setnchannels(channels)
        wf.setsampwidth(sampwidth)
        wf.setframerate(framerate)
        wf.writeframes(b''.join(data))
        wf.close()
    # 進行語音錄製工作
    def my_record(self):
        pa = PyAudio()
        # 開啟一個新的音訊stream
        stream = pa.open(format=paInt16, channels=channels,
                         rate=framerate, input=True, frames_per_buffer=num_samples)
        my_buf = []  # 存放錄音資料
        t = time.time()
        print('正在講話...')
       while time.time() < t + 5:  # 設定錄音時間(秒)
            # 迴圈read,每次read 2000frames
            string_audio_data = stream.read(num_samples)
            my_buf.append(string_audio_data)
        print('講話結束')
        self.save_wave_file(FILEPATH, my_buf)    #儲存下錄音資料
        stream.close()

呼叫百度AI介面, 識別音訊檔並以文字資訊返回

之前使用過好幾次百度AI的介面,我的畢業設計<線上課堂學生異常行為與分析>也是使用到了百度的智慧平臺,個人偵錯的話有很多免費產品,總體來說百度在人工智慧領域做得還是相當不錯的。

在呼叫百度AI介面之前,需要首先進入百度AI開放平臺,搜尋語音識別

 點選立即使用,沒有賬號的話可以先建立一個賬號,然後領取免費的資源使用

我之前已經建立1個了, 假設再次點選建立

系統會自動勾選上語音識別介面,直接建立應用即可,之後會有 AppID、 API Key、Secret Key, 之後呼叫百度介面直接呼叫即可。

可以檢視介面檔案,進行具體的介面操作

 前奏準備好, 便可以直接呼叫介面進行語音識別

from aip import AipSpeech
""" 你的 APPID AK SK """
APP_ID = '25990397'
API_KEY = 'iS91n0uEOujkMIlsOTLxiVOc'
SECRET_KEY = ''              #此處填寫自己的金鑰
"""呼叫介面, 呼叫BaiDu AI 介面進行錄音、語音識別"""
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
class ReadWav():
    # 讀取檔案
    def get_file_content(self, filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()
    def predict(self):
        # 呼叫百度AI的介面, 識別本地檔案
         return client.asr(self.get_file_content('../voices/myvoices.wav'), 'wav', 16000, {
            'dev_pid': 1537,
        })
readWav = ReadWav()          #範例化方法
print(readWav.predict())      #呼叫識別方法, 並輸出

執行結果 ( 音訊檔存的錄音是: 你叫什麼名字呀?)

{'corpus_no': '7087884083428433929', 'err_msg': 'success.', 'err_no': 0, 'result': ['你叫什麼名字呀?'], 'sn': '255158586831650276613'}

 請求智慧機器人, 傳送文字資訊, 返回智慧聊天內容

之前我們老師推薦我使用圖靈機器人的智慧聊天,後來發現認證一直無法通過,且需要付費。

後來發現了一個免費、無需註冊、只需要傳送get請求就可實現聊天的青雲客智慧機器人,直接呼叫介面即可。

程式碼如下:

def talkWithRobot(msg):
    url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(msg))
    html = requests.get(url)
    return html.json()["content"]
print(talkWithRobot("你好呀!"))

 輸出:

喲~ 都好都好

 將回答資訊轉化為語音檔案並輸出

此處需要匯入pyttsx3包,具體程式碼如下:​​​​

import pyttsx3
class RobotSay():
    def __init__(self):
        # 初始化語音
        self.engine = pyttsx3.init()  # 初始化語音庫

        # 設定語速
        self.rate = self.engine.getProperty('rate')
        self.engine.setProperty('rate', self.rate - 50)
    def say(self, msg):
        # 輸出語音
        self.engine.say(msg)  # 合成語音
        self.engine.runAndWait()
robotSay = RobotSay()
robotSay.say("你好呀")          #會講出    ~你好呀(女聲)
複製程式碼

 組合成為自動聊天機器人(它很硬氣)

程式碼如下:

def talkWithRobot(msg):
    url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg={}'.format(urllib.parse.quote(msg))
    html = requests.get(url)
    return html.json()["content"]
robotSay = RobotSay()
speak = Speak()
readTalk = ReadWav()
while True:
    speak.my_record()                               #錄音
    text = readTalk.predict()['result'][0]          #呼叫百度AI介面, 將錄音轉化為文字資訊
    print("本人說:", text)                           #輸出文字資訊
    response_dialogue = talkWithRobot(text)         #呼叫青雲客機器人回答文字資訊並返回
    print("青雲客說:", response_dialogue)             #輸出回答文字資訊
    robotSay.say(response_dialogue)                 #播放回答資訊

 執行結果(發現它很硬氣)

"""
正在講話...
講話結束...
本人說: 你好呀。
青雲客說: 喲~ 都好都好
正在講話...
講話結束...
本人說: 你叫什麼名字呀?
青雲客說: 我是小美人菲菲呀~
正在講話...
講話結束...
本人說: 哇,那你多美呀。
青雲客說: 你似有問題多啲囉!
正在講話...
講話結束...
本人說: 我好看嗎?
青雲客說: 你真是個地道的美人啊。就是說你只有在地道里才算美人,因為地道里沒燈
正在講話...
講話結束...
本人說: 你可真是個小可愛呀。
青雲客說: 呀,你怎麼知道。。。我就是啊。。
正在講話...
講話結束...
本人說: 不和你說了。
青雲客說: 不說拉倒
"""

到此這篇關於Python 實現簡單智慧聊天機器人的文章就介紹到這了,更多相關Python 實現聊天機器人內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com