# 智能聊天机器人系统
# 1.系统简介
# 随着社会的各个公司以及大学对人工智能技术的深入研究和快速发展,人工智能技术将逐步应用到
# 方方面面。智能聊天机器人系统是基于各类传感器收集人类语音数据(智能电视、智能空调,
# 智能冰箱、智能音箱等电器的使用情况)并进行控制,通过算法模型的设计、优化和应用,
# 来达到真正的人机交互,开启人类的智能生活。
# 2.技术要求和限制条件
# 1)根据项目小组讨论情况,确定系统实现的方向,第三方接口的选择等;
# 2)根据数据业务模型,构建信息交互转换平台,提供项目优化方案;
# 3)按照智能助手系统为人类提供的功能,给出各模块的设计,提供语音识别、语音合成等功能。
# 系统开始,按1对话开始,你说话,机器人和你说话
import pyaudio, wave
from aip import AipSpeech
import json
import urllib.request
import os


# 采取录音
def record(second,filename):
    # 采样率
    RATE = 8000
    # 采样通道
    CHANNELS = 2
    # 采样精度
    FORMAT = pyaudio.paInt16
    # 采样时间
    SECONDS = second
    # 创建一个pyaudio对象
    p = pyaudio.PyAudio()
    frames = list()
    # 创建流对象
    stream = p.open(rate=RATE,channels=CHANNELS,format=FORMAT,input=True)
    print("录音开始了!!!")
    data = stream.read(RATE*SECONDS)
    frames.append(data)
    stream.stop_stream()
    stream.close()
    print("录音结束!!!")
    p.terminate()

    wf = wave.open(filename,'wb')
    wf.setnchannels(CHANNELS)
    wf.setframerate(RATE)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.writeframes(b''.join(frames))
    wf.close()
    return filename


""" 你的 APPID AK SK """
APP_ID = '16720832'
API_KEY = 'Dwur5NHIhoezGptZUGVpe7CN'
SECRET_KEY = 'GNw7Mn6ogcxFScxvwQiMtQMH57riw0NT'

# 获取文件内容
def get_file_content(filename):
    with open(filename,'rb') as fp:
        return fp.read()

# 获取输入的语言
def get_content():
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    text_dict = client.asr(get_file_content('test.wav'),'wav',16000,{
        'dev_pid':1536,
    })
    return text_dict["result"]


TU_LING = 'dc601668fced41f0bd67a83be3d6999d'
USER_ID = '475665'
API_URL = 'http://openapi.tuling123.com/openapi/api/v2'

# 把内容传给图灵机器人获取聊天内容
def get_message(message):
    req = {
	"reqType":0,
    "perception": {
        "inputText": {
            "text": message
        },
        # "inputImage": {
        #     "url": "imageUrl"
        # },
        "selfInfo": {
            "location": {
                "city": "北京",
                "province": "北京",
                "street": "信息路"
            }
        }
    },
    "userInfo": {
        "apiKey": TU_LING,
        "userId": USER_ID
    }
}
    # 将req编码为json格式utf8
    req = json.dumps(req).encode('utf8')
    # 生成请求对象
    http_post = urllib.request.Request(API_URL, data=req, headers={'content-type':'application/json'})
    response = urllib.request.urlopen(http_post)
    # 以utf8解码response
    response_str = response.read().decode('utf8')
    # 解码response_str 返回python字符串
    response_dic = json.loads(response_str)
    response_text = response_dic['results'][0]['values']['text']
    return response_text

# response_dic = json.loads(response_str)
# intent_code = response_dic['intent']['code']

# 把图灵机器人返回的答复传给百度AI合成语音
def get_yuyin(response_text):
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    result = client.synthesis(response_text, 'zh', 1, {
        'vol': 5,
    })

    # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
    if not isinstance(result, dict):
        with open('auido.mp3', 'wb') as f:
            f.write(result)

    os.system('auido.mp3')

# 菜单
def menu():
    print("欢迎来到fxm树鹿的私人聊天")
    print("1.与智能机器人聊天")
    print("0.退出")

# 聊天菜单
def menu_chat():
    print("1.语音聊天")
    print("2.文字输入")

# 语音聊天
def yuyin_chat():
    while 1:
        # 把语音存到 test.wav 中,录入时间为5秒
        record(5, "test.wav")
        # 获取输入的语言
        content = get_content()
        content =content[0]
        print("[无名氏]:", end=' ')
        print(content)

        n = get_text(content)
        if n:
            break

# 文字聊天
def wenzi_chat():
    print("请输入文字:")
    while 1:
        # 获取输入的文字
        print("[无名氏]:",end=' ')
        content = input("")

        n = get_text(content)
        if n:
            break


# 获取机器人的回复
def get_text(content):
    # 把内容传给图灵机器人获取聊天内容
    message = get_message(content)
    # 语音输出
    get_yuyin(message)

    print("[小冰]:", end=' ')
    print(message, end='    ')
    print("————fxm树鹿的私人聊天")

    # 输入 bye / 拜 退出
    if content == "bye" or content == "拜" or content == "再见":
        return 1

if __name__ == '__main__':
    menu()
    n = input("请选择:")
    if n == '1':
        menu_chat()
        n = input("请选择:")
        if n == '1' :
            print("提示:说出 bye/拜/再见 退出")
            yuyin_chat()

        elif n== '2':
            print("提示:输入 bye/拜/再见 退出")
            wenzi_chat()

    print("期待你的下次聊天!!!")

智能聊天机器人平台的架构与应用 智能聊天机器人系统_json


智能聊天机器人平台的架构与应用 智能聊天机器人系统_智能聊天机器人平台的架构与应用_02