闲来无事,参考文档写了一个语音助手小程序,主要流程为,录音,音频转文字,自动化处理文字并回复,将回复内容转语音输出,代码写的烂,博客也写的烂,不喜勿喷。
看别人的文章用的是 speech_recognition实现录音并调用其recognize_google()来实现语音转换,但是国内不能访问谷歌,加上speech_recognition录音时报的错误无法处理,所以退而求其次,采用pyaudio实现录音,由于各种XXXXXXX原因,直接贴别人代码了。
import pyaudio
import wave
def speak():
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 16000
RECORD_SECONDS = 3#设置录音时间
WAVE_OUTPUT_FILENAME = "saying.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print("please say....")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
#print("录音结束,请闭嘴!")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
对于pyaudio的安装就不再赘述,因为各系统不同,安装方法也不同,特别声明,出windows系统,其他不能只使用pip安装
录音转文字采用百度免费的语音api,百度有封装好的api,pip install baidu-api 可以直接安装,代码如下:
#音频转文字
from aip import AipSpeech
APP_ID = "你注册的ID"
API_KEY = "你的API_KEY"
SECRET_KEY = "你的SECRET_KEY"
client = AipSpeech(APP_ID,API_KEY,SECRET_KEY)
def listen():
with open("saying.wav","rb") as f:
audio_data = f.read()
result = client.asr(audio_data,"wav","16000",{"dev_pid":1536,})
result_text = result[ "result"][0]
return result_text
图灵机器人每天大概可以回复100条消息,但好的是可以注册多个机器人轮着使用。图灵机器人并没有打包好需要调用requrests请求,并用json解析数据。注册图灵机器人后,它也有接入教程,可以参考其文档。我的实现代码如下:
import requests
import json
apikey = "你的api_key"
user_id = 你的id
url = "http://openapi.tuling123.com/openapi/api/v2"
HEADERS = {'Content-Type': 'application/json;charset=UTF-8'}
def robot(text=""):
data={
"reqType":0,
"perception": {
"inputText": {
"text": ""
},
"selfInfo": {
"location": {
"city": "西安",
"province": "北京",
"street": "西安工业大学"
}
}
},
"userInfo": {
"apiKey": apikey,
"userId": user_id
}
}
data["perception"]["inputText"]["text"] = text
response = requests.request("post",url,json=data,headers=HEADERS)
response_dict = json.loads(response.text)
try:#对返回url的进行处理
result = response_dict["results"][0]["values"]["text"]
except:
result =response_dict["results"][0]["values"]["url"]
print(result)
return result
百度的TTS可以帮助我们将文本转语音。参考代码如下:
#文本转语音输出 audio.mp3
from aip import AipSpeech
APP_ID = "你的id"
API_KEY = "你的API_KEY"
SECRET_KEY = "你的秘钥"
client = AipSpeech(APP_ID,API_KEY,SECRET_KEY)
def speak(text=""):
result = client.synthesis(text,"zh",1,{"spd":4,"vol":5,"per":4,})
if not isinstance(result,dict):
with open("audio.mp3","wb") as f:
f.write(result)
执行完后会将文本转换为MP3格式的文件,貌似只能转为MP3格式,
在Linux下播放MP3还是有点麻烦,所以先用sox将MP3转为wav格式,调用paplay便可直接播放得到的语音,同是定义一些特定指令以让它帮我们完成一些事情,另外让人最蛋疼的是,这个识别问题还是挺大的,不好完善,可以改为文字输入而不是语音输入。
参考代码如下:
import tu_ling
import tts
import os
import luyin
import bai_du
def chat():
# text = input("please say ... :")
result = tu_ling.robot(text)
if "http" in result:
tts.speak("为你找到图片啦")
os.system("sox audio.mp3 audio.wav")
os.system("paplay audio.wav")
os.system("xdg-open %s"%(result))
else:
tts.speak(result)
#将MP3转为wav
os.system("sox audio.mp3 audio.wav")
os.system("paplay audio.wav")
while True:
luyin.speak() #放外面便于Ctrl+c 直接退出
try:
text = bai_du.listen()
#text=input("play say ...")
if text == "关机":
os.system("shutdown")
break
elif text == "来首歌":
tts.speak("先听一首30岁的女人吧")
os.system("sox audio.mp3 audio.wav")
os.system("paplay audio.wav")
os.system("xdg-open Music/CloudMusic/30岁的女人.mp3")
elif text == "不聊了":
break
elif text =="q":
break
else:
chat()
except:
tts.speak("我没听清哦")
#将MP3转为wav
os.system("sox audio.mp3 audio.wav")
os.system("paplay audio.wav")
虽然简略实现了功能,但是其作用还是比较鸡肋的,偶尔当做消遣而已,如果语音识别比较准确,可以在系统下设置快捷键启动,还有那么一点点作用。而且语音输入模块也比较烂,speech_recognition做语音输入应该还不错,但是实在无力改那个bug,所以暂时这样吧。