1.python庫准備
[](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可以根據場景不同來改變,參考,
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里的地址自己可以隨便寫,
如果你問與地名有關的內容時時,它會根據這個地址進行回答,例如問天氣。
運行結果:
相關連接: