基於python第三方庫,圖靈機器人,百度語音識別API的聊天機器人


1.python庫准備

[復制代碼](javascript:void(0)😉

import wave
import pyaudio  錄制音頻
import requests  獲取百度API的token用
import os
import base64
import json
import win32com.client  用於讀文字
import urllib.request
import string
import random

注意win32com安裝我pip安裝了好多次,使用python -m pip install pypiwin32,其余模塊直接pip安裝,使用清華源https://pypi.tuna.tsinghua.edu.cn/simple比較快!

2.需要申請圖靈賬號以及創建機器人獲取他的apikey以及userId
3.生成音頻文件名,(也可以不用這個,可以寫死文件名直接覆蓋)這樣可以保存音頻文件。
def file_name():
    code_str = string.ascii_letters + string.digits
    ran_num = ''.join(random.sample(code_str, 6))
    r_path = ran_num + '.wav'
    return r_path
4.朗讀讀圖靈返回的內容
def read(content):
    speaker = win32com.client.Dispatch("SAPI.SpVoice")
    speaker.Speak(content)

content為文本內容

也可以使用pyttsx3也可以

5.pyaudio錄音
def audio_record(out_file, rec_time):
    CHUNK = 1024
    FORMAT = pyaudio.paInt16  # 16bit編碼格式
    CHANNELS = 1  # 單聲道
    RATE = 16000  # 16000采樣頻率

    p = pyaudio.PyAudio()
    # 創建音頻流
    stream = p.open(format=FORMAT,  # 音頻流wav格式
                    channels=CHANNELS,  # 單聲道
                    rate=RATE,  # 采樣率16000
                    input=True,
                    frames_per_buffer=CHUNK)

    print("Start Recording...")

    frames = []  # 錄制的音頻流
    # 錄制音頻數據
    for i in range(0, int(RATE / CHUNK * rec_time)):
        data = stream.read(CHUNK)
        frames.append(data)

    # 錄制完成
    stream.stop_stream()
    stream.close()
    p.terminate()

    print("Recording Done...")

    # 保存音頻文件
    wf = wave.open(out_file, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

注意采樣率一定在16000,否則識別結果很低,甚至識別失敗

out_file為文件名,rec_time為錄制時間,單位為秒。

6.將音頻給百度API,百度返回結果

def discern(name):
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=GbIYm9OLyueeQjoRPP5aD74N&client_secret=wwtWT4Y7e5Vu57bKtBHTKIYM8CVibm7I'
    response = requests.get(host)
    if response:
        taken = response.json()
        print(taken)
        apiUrl = 'http://vop.baidu.com/server_api'
        filename = name  # 這是我下載到本地的音頻樣例文件名
        size = os.path.getsize(filename)  # 獲取本地語音文件尺寸
        # filename.seek(0, 0)
        file = open(f'{filename}', "rb")  # 讀取本地語音文件
        file1 = file.read()
        text = base64.b64encode(file1).decode("utf-8")  # 對讀取的文件進行base64編碼
        data = {
            "format": "pcm",  # 音頻格式
            "rate": 16000,  # 采樣率,固定值16000
            "dev_pid": 1536,  # 普通話
            "channel": 1,  # 頻道,固定值1
            "token": taken['access_token'],
            "cuid": "00-E0-4C-36-63-94",  # 隨便一個值就好了,官網推薦是個人電腦的MAC地址
            "len": size,  # 語音文件的尺寸
            "speech": text,  # base64編碼的語音文件
        }
        try:
            r = requests.post(apiUrl, data=json.dumps(data)).json()
            print(r)
            print(r.get("result")[0])
            tuling(r.get("result")[0])
        except Exception as e:
            print(e)

百度返回的結果是一個json數組,根據需要自行取舍。

dev_pid可以根據場景不同來改變,參考,

6.將百度返回識別的結果發送給圖靈,他返回你對話的結果
def tuling(text_input):
    api_url = "http://openapi.tuling123.com/openapi/api/v2"
    # text_input = input('我:')
    # read(text_input)
    req = {
        "perception":
            {
                "inputText":
                    {
                        "text": text_input
                    },

                "selfInfo":
                    {
                        "location":
                            {
                                "city": "保定", #隨便寫
                                "province": "蓮池區",  #隨便
                                "street": "東風路"  #隨便
                            }
                    }
            },

        "userInfo":
            {
                "apiKey": "你自己申請",
                "userId": "自己"
            }
    }
    # print(req)
    # 將字典格式的req編碼為utf8
    req = json.dumps(req).encode('utf8')
    # print(req)

    http_post = urllib.request.Request(api_url, data=req, headers={'content-type': 'application/json'})
    response = urllib.request.urlopen(http_post)
    response_str = response.read().decode('utf8')
    # print(response_str)
    response_dic = json.loads(response_str)
    # print(response_dic)

    intent_code = response_dic['intent']['code']
    results_text = response_dic['results'][0]['values']['text']
    # print('Turing的回答:')
    # print('code:' + str(intent_code))
    print('機器人:' + results_text)
    read(results_text)

text_input為你說話的文本內容

location里的地址自己可以隨便寫,

如果你問與地名有關的內容時時,它會根據這個地址進行回答,例如問天氣。

運行結果:

相關連接:

百度API注冊地址
圖靈API注冊地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM