基于Linux的语音小助手

闲来无事,参考文档写了一个语音助手小程序,主要流程为,录音,音频转文字,自动化处理文字并回复,将回复内容转语音输出,代码写的烂,博客也写的烂,不喜勿喷。

1.用python实现录音

看别人的文章用的是  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安装

2.录音转文字

录音转文字采用百度免费的语音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

​

3.利用图灵机器人自动回复

图灵机器人每天大概可以回复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

4.文字转语音

百度的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格式,

5.书写主流程代码

在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,所以暂时这样吧。

你可能感兴趣的:(python)