简介:刚刚接触python,作为一个小白,想搞一个方便自己日常生活的助手,功能肯定不多,但是满足我的基本要求。
(我用的是pycharm)
本demo可以实现的功能:
import time
import os
import pyaudio
import wave
import speech_recognition as sr
import requests
import json
from playsound import playsound
# 百度api接口设置
from aip import AipSpeech
""" 你的 APPID AK SK """
APP_ID = '*****'
API_KEY = '**********'
SECRET_KEY = '***********'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 图灵接口api
TURING_KEY = "******************"
URL = "http://openapi.tuling123.com/openapi/api/v2"
HEADERS = {'Content-Type': 'application/json;charset=UTF-8'}
分别注册百度开放平台和图灵机器人,并且申请端口,获得appid替换代码中的******
此处无需多说,参考百度和图灵的官方文档即可
这里是有坑的,pyaudio无法直接用pip或者pycharm工具安装,而且pyaudio的安装需要运行库portaudio来支持,接下来说说安装办法
pip install ’你下载的文件名‘
pip install SpeechRecogintion
安装即可录音部分代码
import pyaudio
import wave
import speech_recognition as sr
# pyaudio 录音
def rec(rate=16000):
r = sr.Recognizer()
with sr.Microphone(sample_rate=rate) as source:
audio = r.listen(source)
with open("recording.wav", "wb") as f:
f.write(audio.get_wav_data())
参考百度官方文档
# 百度请求音频
def listen():
with open('recording.wav', 'rb') as f:
audio_data = f.read()
result = client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1536,
})
x = result["err_no"]
if x == 0:
result_text = result["result"][0]
print("#" + result_text)
return result_text
else:
run()
这里遇到了一个问题,由于这一些列的程序一直处于循环里,如果你运行了程序,他会不停的把录音请求到百度那里,你总不能一直和录音机一直说话,所以,当你发送的录音为空,或者识别不出来的话,百度会返回你一个err_no:!= 0
的值,并且不会返回"result"
的值,导致程序出错,而正常识别的返回值是err_no: 0
所以,我们设置条件,如果err_no: 0
则正常运行下面的程序,否则重新录音。
(ps,更好的解决办法应该是录音麦克收到高分贝信息的时候开始录音,我知道有这个处理办法,但是我没有找到具体方法)
# 图灵聊天
def robot(text=""):
data = {
"reqType": 0,
"perception": {
"inputText": {
"text": ""
},
"selfInfo": {
"location": {
"city": "哈尔滨",
"street": "红旗大街"
}
}
},
"userInfo": {
"apiKey": TURING_KEY,
"userId": "starky"
}
}
data["perception"]["inputText"]["text"] = text
response = requests.request("post", URL, json=data, headers=HEADERS)
response_dict = json.loads(response.text)
result = response_dict["results"][0]["values"]["text"]
print("AI: " + result)
return result
# 百度TTS
def speak(text=""):
result = client.synthesis(text, 'zh', 1, {
'spd': 5,
'vol': 5,
'per': 4,
'pit': 5,
})
#把接收到的二进制数据流输入到MP3文件中
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
这里附上官方给的语音设置(我当然用的萝莉音—_—)
参数 | 描述 |
---|---|
spd | 语速,取值0-9,默认为5中语速 |
pit | 音调,取值0-9,默认为5中语调 |
vol | 音量,取值0-15,默认为5中音量 |
per | 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女 |
这里需要一个库playsound用来播放mp3文件
from playsound import playsound
# 播放接收百度返回音频
def play():
playsound('audio.mp3')
#删除
def dele():
os.remove('audio.mp3')
用command的方法运行,我把这个方法直接写到了运行整段代码的方法里面,结合我的程序流程来看,如果识别出来的文字能在我设置好的命令库里面匹配出来,那么优先运行命令,跳过图灵聊天机器人的过程。
像播放/暂停/静音…这些指令是通过运行vbs文件执行的,每个指令有一个”虚拟键值“,
例如静音的写法:
Set Ws = CreateObject("Wscript.Shell")
Ws.Sendkeys "棴"
保存为vbs文件 这个值"棴"
就是代表不同的指令,去网上找找有更多的指令可以使用
def run():
while True:
rec()
phrase = listen()
if phrase in command1.keys():
os.system(command1[phrase])
speak(text='为您%s' %phrase)
play()
print('为您%s' %phrase)
dele()
else:
request = phrase
response = robot(request)
speak(response)
play()
# 运行程序目录
command1 = {'关机': 'shutdown -s -t 1',
'重启': 'shutdown -r',
'打开网易云音乐': 'start cloudmusic.exe',
'播放音乐':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\播放暂停.vbs',
'停止播放':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\播放暂停.vbs',
'静音':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\静音.vbs',
'上一首':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\上一首.vbs',
'下一首':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\下一首.vbs',
'减小音量':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\减小音量.vbs',
'增大音量':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\增大音量.vbs',
'打开微信':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\微信.lnk',
'打开ps':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\Photoshop.lnk',
'打开pr':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\AdobePremierePro.lnk',
'打开浏览器':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\MicrosoftEdge.lnk',
}
最后执行run()方法
run()
大合影
import time
import os
import pyaudio
import wave
import speech_recognition as sr
import requests
import json
from playsound import playsound
# 百度api接口设置
from aip import AipSpeech
""" 你的 APPID AK SK """
APP_ID = '16690797'
API_KEY = 'E3M2RW8IOsixXpKVjNBMgxyE'
SECRET_KEY = 'chnwOnAoyPNRWwiafcACpTnEYKZgzvLq'
client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
# 图灵接口api
TURING_KEY = "9a8deb05f6b14ef38d87f4c638e387aa"
URL = "http://openapi.tuling123.com/openapi/api/v2"
HEADERS = {'Content-Type': 'application/json;charset=UTF-8'}
# pyaudio 录音
def rec(rate=16000):
r = sr.Recognizer()
with sr.Microphone(sample_rate=rate) as source:
audio = r.listen(source)
with open("recording.wav", "wb") as f:
f.write(audio.get_wav_data())
# 百度请求音频
def listen():
with open('recording.wav', 'rb') as f:
audio_data = f.read()
result = client.asr(audio_data, 'wav', 16000, {
'dev_pid': 1536,
})
x = result["err_no"]
if x == 0:
result_text = result["result"][0]
print("#" + result_text)
return result_text
else:
run()
# 图灵聊天
def robot(text=""):
data = {
"reqType": 0,
"perception": {
"inputText": {
"text": ""
},
"selfInfo": {
"location": {
"city": "哈尔滨",
"street": "红旗大街"
}
}
},
"userInfo": {
"apiKey": TURING_KEY,
"userId": "starky"
}
}
data["perception"]["inputText"]["text"] = text
response = requests.request("post", URL, json=data, headers=HEADERS)
response_dict = json.loads(response.text)
result = response_dict["results"][0]["values"]["text"]
print("AI: " + result)
return result
# 百度TTS
def speak(text=""):
result = client.synthesis(text, 'zh', 1, {
'spd': 5,
'vol': 5,
'per': 4,
'pit': 5,
})
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
# 播放接收百度返回音频
def play():
playsound('audio.mp3')
def dele():
os.remove('audio.mp3')
# 运行程序目录
command1 = {'关机': 'shutdown -s -t 1',
'重启': 'shutdown -r',
'打开网易云音乐': 'start cloudmusic.exe',
'播放音乐':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\播放暂停.vbs',
'停止播放':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\播放暂停.vbs',
'静音':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\静音.vbs',
'上一首':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\上一首.vbs',
'下一首':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\下一首.vbs',
'减小音量':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\减小音量.vbs',
'增大音量':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\增大音量.vbs',
'打开微信':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\微信.lnk',
'打开ps':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\Photoshop.lnk',
'打开pr':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\AdobePremierePro.lnk',
'打开浏览器':'C:\\Users\\Administrator\\PycharmProjects\\untitled1\\venv\\vbs命令\\MicrosoftEdge.lnk',
}
def run():
while True:
rec()
phrase = listen()
if phrase in command1.keys():
os.system(command1[phrase])
speak(text='为您%s' %phrase)
play()
print('为您%s' %phrase)
else:
request = phrase
response = robot(request)
speak(response)
play()
run()
我觉得不管我写的怎么样,我把它记录下来,在这个开源的时代,我很乐意和大家一起讨论
图灵机器人
pyaudio
百度云AI