python3基于百度开放平台和图灵机器人的语音助手

python3基于百度开放平台和图灵机器人的语音助手

简介:刚刚接触python,作为一个小白,想搞一个方便自己日常生活的助手,功能肯定不多,但是满足我的基本要求。
(我用的是pycharm)
本demo可以实现的功能:

  • 图灵机器人的聊天答复
  • 语音控制打开应用程序
  • 语音控制音量,静音,播放/暂停,关机等等

程序流程

无对应指令
有对应指令
录音
百度语音识别
遍历本地对应指令
图灵机器人
执行本地指令
百度语音合成
播放语音

本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录音

这里是有坑的,pyaudio无法直接用pip或者pycharm工具安装,而且pyaudio的安装需要运行库portaudio来支持,接下来说说安装办法

  • pyaudio
    从官网下载pyaudio对应的版本,下载好之后打开cmd进入文件所在目录,键入pip install ’你下载的文件名‘
  • portaudio
    这里参考portaudioV19库安装
    由于我不会,也嫌麻烦,所以直接下载了别人编译好的文件
  • SpeechRecogintion
    SpeechRecogintion 是 Python 的一个语音识别框架,它可以检测语音中的停顿自动终止录音并保存,
    直接用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

你可能感兴趣的:(python,语音识别,python,AI,语音识别)