一. 准备工作:

首先应该了解一下百度开放平台的语音识别及语音合成的调用方法,详见我之前的这篇文章;语音输入及输出准备好之后就需要考虑中间的机器人对话环节,我使用的是图灵机器人来实现这个环节的图灵机器人官网,这个需要实名认证后才能白嫖,这个认证说实话挺慢的(我大概等了差不多一个礼拜才认证好,应该不是我的问题😳😳),准备好图灵机器人后就可以实现(憨批)聊天机器人了。

二. 具体实现:

1-语音输入:

先使用pyaudio录制适合百度语音识别的音频

import wave
from pyaudio import PyAudio, paInt16

CHUNK = 1024 # wav文件是由若干个CHUNK组成的,CHUNK我们就理解成数据包或者数据片段。
FORMAT = paInt16 # 表示我们使用量化位数 16位来进行录音
CHANNELS = 1 #代表的是声道,1是单声道,2是双声道。
RATE = 16000 # 采样率 一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz
RECORD_SECONDS = 10 # 录制时间可以随便改,这里设定了10秒
  
def save_wave_file(pa, filename, data):
    wf = wave.open(filename, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(pa.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b"".join(data))
    wf.close()
 
def get_audio(filepath):
    isstart = str(input("是否开始录音? (是/否)"))
    if isstart == str("是"):
        pa = PyAudio()
        stream = pa.open(format=FORMAT,
                         channels=CHANNELS,
                         rate=RATE,
                         input=True,
                         frames_per_buffer=CHUNK)
        print("*" * 10, "开始录音:请在10秒内输入语音")
        frames = []  # 定义一个列表
        for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  # 循环,采样率 44100 / 1024 * 5
            data = stream.read(CHUNK)  # 读取chunk个字节 保存到data中
            frames.append(data)  # 向列表frames中添加数据data
        print("*" * 10, "录音结束\n")
        stream.stop_stream()
        stream.close()  # 关闭
        pa.terminate()  # 终结
        save_wave_file(pa, filepath, frames)
    elif isstart == str("否"):
        exit()
    else:
        print("无效输入,请重新选择")
        get_audio(filepath)

再调用百度的API进行语音转文字:

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '******'
API_KEY = '******'
SECRET_KEY = '******'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        voices = fp.read()
	result = client.asr(voices, 'pcm', 16000, {'dev_pid': 1537})
	result_content = result["result"][0]
    print("you said: " + result_content)
    return result_content

2-使用图灵机器人进行对话:

# 与机器人对话:调用的是图灵机器人
import requests
import json
 
# 图灵机器人的API_KEY、API_URL
turing_api_key = "your turing_api_key"
api_url = "http://openapi.tuling123.com/openapi/api/v2"  # 图灵机器人api网址
headers = {'Content-Type': 'application/json;charset=UTF-8'}
 
# 图灵机器人回复
def Turing(text_words=""):
    req = {
        "reqType": 0,
        "perception": {
            "inputText": {
                "text": text_words
            },
 
            "selfInfo": {
                "location": {
                    "city": "长治",
                    "province": "山西",
                    "street": "康庄大道"
                }
            }
        },
        "userInfo": {
            "apiKey": turing_api_key,  # 你的图灵机器人apiKey
            "userId": "Nieson"  # 用户唯一标识(随便填, 非密钥)
        }
    }
 
    req["perception"]["inputText"]["text"] = text_words
    response = requests.request("post", api_url, json=req, headers=headers)
    response_dict = json.loads(response.text)
 
    result = response_dict["results"][0]["values"]["text"]
    print("AI Robot said: " + result)
    return result

3-语音输出:

如果觉得声音不好听或是太单调的话也可以通过调用百度语音合成进行语音输出。

import win32com.client
 
speaker = win32com.client.Dispatch("SAPI.SpVoice")
speaker.Speak("我是语音助手,小灵!")

4-代码总结:

import wave
from pyaudio import PyAudio, paInt16
from aip import AipSpeech
import requests
import json
import win32com.client

# 百度的APP_ID AK SK
APP_ID = '******'
API_KEY = '******'
SECRET_KEY = '******'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 录音的参数
CHUNK = 1024  # wav文件是由若干个CHUNK组成的,CHUNK我们就理解成数据包或者数据片段。
FORMAT = paInt16  # 表示我们使用量化位数 16位来进行录音
CHANNELS = 1  # 代表的是声道,1是单声道,2是双声道。
RATE = 16000  # 采样率 一秒内对声音信号的采集次数,常用的有8kHz, 16kHz, 32kHz, 48kHz
RECORD_SECONDS = 10  # 录制时间可以随便改,这里设定了10秒

# 图灵机器人的API_KEY、API_URL
turing_api_key = "your turing_api_key"
api_url = "http://openapi.tuling123.com/openapi/api/v2"
headers = {'Content-Type': 'application/json;charset=UTF-8'}

# 初始化输出语音
speaker = win32com.client.Dispatch("SAPI.SpVoice")


def get_audio(filepath):
    """得到输入的声音文件"""
    start = str(input("是否开始输入? (是/否)"))
    if start == str("是"):
        pa = PyAudio()
        stream = pa.open(format=FORMAT,
                         channels=CHANNELS,
                         rate=RATE,
                         input=True,
                         frames_per_buffer=CHUNK)
        print("*" * 10, "开始输入:请在10秒内输入语音")
        frames = []
        for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):  # 循环,采样率 44100 / 1024 * 5
            data = stream.read(CHUNK)  # 读取chunk个字节 保存到data中
            frames.append(data)  # 向列表frames中添加数据data
        print("*" * 10, "输入结束\n")
        stream.stop_stream()
        stream.close()  # 关闭
        pa.terminate()  # 终结
        # 存储输入内容
        wf = wave.open(filepath, 'wb')
        wf.setnchannels(CHANNELS)
        wf.setsampwidth(pa.get_sample_size(FORMAT))
        wf.setframerate(RATE)
        wf.writeframes(b"".join(data))
        wf.close()
    elif start == str("否"):
        exit()
    else:
        print("无效输入,请重新选择")
        get_audio(filepath)


def get_file_content(filePath):
    """返回输入内容,语音转文本"""
    with open(filePath, 'rb') as fp:
        voices = fp.read()
    result = client.asr(voices, 'pcm', 16000, {'dev_pid': 1537})
    result_content = result["result"][0]
    print("you said: " + result_content)
    return result_content


def Turing(text_words):
    """图灵机器人回复"""
    req = {
        "reqType": 0,
        "perception": {
            "inputText": {
                "text": text_words
            },

            "selfInfo": {
                "location": {
                    "city": "长治",
                    "province": "山西",
                    "street": "康庄大道"
                }
            }
        },
        "userInfo": {
            "apiKey": turing_api_key,  # 你的图灵机器人apiKey
            "userId": "hhhh"  # 用户唯一标识(随便填, 非密钥)
        }
    }
    req["perception"]["inputText"]["text"] = text_words
    response = requests.request("post", api_url, json=req, headers=headers)
    response_dict = json.loads(response.text)
    result = response_dict["results"][0]["values"]["text"]
    print("AI Robot said: " + result)
    return result


while True:
    get_audio("audio.pcm")
    answer = Turing(get_file_content("audio.pcm"))
    speaker.Speak(answer)

以上就是通过百度AI开放平台及图灵机器人来实现聊天机器人的全过程。

三. 总结反思:

通过调用各种API再配上教程感觉实现挺简单的,争取在寒假能够了解一下这些东西的具体实现方式。
另外,这是工作室早就布置下来的作业了,由于自己的坏习惯一直拖到现在才写完,flag立这了,以后有任务的话绝对不在等到最后几天才写🙃🙃

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐