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展示前端聊天窗口就完美了。~~~~~
相关连接:
来源:https://www.cnblogs.com/z-x-h/p/12608092.html