基于python第三方库,图灵机器人,百度语音识别API的聊天机器人

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-31 21:39:41

1.python库准备
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里的地址自己可以随便写,

如果你问与地名有关的内容时时,它会根据这个地址进行回答,例如问天气。

运行结果:

只是在控制台显示结果,使用djaogo展示前端聊天窗口就完美了。~~~~~

相关连接:

百度API注册地址
图灵API注册地址

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!