1.python库准备

[

copycode.gif](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可以根据场景不同来改变,参考,

1773446-20200331202659461-1411912475.jpg

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里的地址自己可以随便写,

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

运行结果:

1773446-20200331202641470-1272868247.jpg

相关连接:

Logo

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

更多推荐