如何做一个假wei斯

这个其实也是在完成作业时的副产品,之所以选择百度就是因为便宜还有易于开发

一、获取百度SDK

首先,你需要拥有一个百度账号(估计都有吧,这年代还有人不用百度云?)

然后,登陆 https://console.bce.baidu.com/ai/#/ai/speech/overview/index 创建应用,接口默认即可

点击查看应用详情,获取 AppID,API Key,Secret Key

安装Python SDK

pip install baidu-aip

无pip也可在应用页下载SDK手动安装,解包后执行

python setup.py install

二、安装依赖

这部分没pip的只有自己想办法了…

除SDK外,还需安装playsound,pyaudio,scipy,numpy

第一个用于播放合成出来的语音

后面三个主要用在录音环节

依次执行

pip install 包名

如果pyaudio无法安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 下载对应包

pip install 包名.whl

即可完成安装

另外,还需对playsound进行修改,否则循环时会一直占用音频文件,导致无法写入

请参考 python下playsound模块解除占用

三、码代码

我们分成四个部分来完成

第一部分:语音识别

参考官方文档,我们首先需要将之前获得的APP_IDAPI_KEYSECRET_KEY 填入

from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

再参照文档中的示例

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 识别本地文件
client.asr(get_file_content('audio.pcm'), 'pcm', 16000, {
    'dev_pid': 1536,
})

这个示例是将目录下的audio.pcm上传识别

因此,能想到,如果有什么方法能自动录音,判断我们已经停止说话,然后将文件上传识别,那么这个模块就已经完善

然而,我对这个自动录音想的太过简单,最终,录音部分通过对python录音程序提供的源码进行修改实现

大佬的源码非常完善,我们只需要对其中几个参数进行修改即可,录音阈值可以按环境进行适度调整,为了美观,可以将其中的两个print进行修改

删除源码的最后两行,保存为record.py

录音模块便制作完成

将其import后就可以直接调用了,我们可以直接recording(‘in.wav’)完成录音

再看回百度这边,client.asr调用后会返回一个dict,处理起来非常方便,只需dict.get(‘result’)就可以获取到[‘内容’]形式的结果

我通过对字符串的简单处理去除了[‘和’]

questionall = client.asr(get_file_content('in.wav'), 'pcm', 16000, {'dev_pid': 1536, }) # 此部分实现语音识别,返回值在questionall内
questional = str(questionall.get('result'))
    lens = int(len(questional))
    ques = questional[2:lens - 2]str(questionall.get('result')) # 此部分将结果提取并转为字符串
lens = int(len(questional)) # 获取字符串长度
ques = questional[2:lens - 2] # 只保留内容到ques

第二部分:调用机器人

因为懒,我直接用了一个百度出来的机器人http://api.qingyunke.com/ 说实话,还蛮好的

我们通过GET来获取回答,信息已存入message中,需注意,message必须urlencode,否则可能报错

r=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg='+message)

结果为一个dict和json都会报错的东西(大概是我太蔡了),所以我只能再次进行字符串处理

answer=str(r.json()) # 转为字符串
lens=int(len(answer)) # 计算长度
ans=answer[26:lens-2] # 保留结果

第三部分:语音合成

同样,根据官方文档

result  = client.synthesis('你好百度', 'zh', 1, {
    'vol': 5,
})

# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
    with open('auido.mp3', 'wb') as f:
        f.write(result)

所以我们只需把‘你好百度’换成我们需要的文字即可,可以修改参数来优化语音

播放语音通过playsound(‘out.mp3’)实现

第四部分:逻辑主体

这里主要是逻辑方面的编写,你们自己看着办吧…

比如一阵机械的嘘寒问暖之后,开始循环,直到识别到关键字退出或进行指定回答…

最终节:出来吧,假wei斯

唔,我还是直接贴代码吧,不想写了,安装完依赖后,直接执行应该能得到一个假wei斯吧…(记得替换APP_ID啥的,record.py必须在同目录下)

from aip import AipSpeech
import requests
import urllib.parse
from record import recording
from playsound import playsound

# 认证部分
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

# 读取文件
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

# 录音并调用SDK进行语音识别,输出并返回结果
def voice():
    recording('in.wav')
    questionall = client.asr(get_file_content('in.wav'), 'pcm', 16000, {'dev_pid': 1536, })
    questional = str(questionall.get('result'))
    lens = int(len(questional))
    ques = questional[2:lens - 2]
    print('.',end='')
    print(ques)
    ques = urllib.parse.quote(ques)
    return ques

# 根据给入的文字调用SDK输出并播放音频
def voiceout(message):
    result  = client.synthesis(message, 'zh', 1, {'vol': 5,})
    if not isinstance(result, dict):
        with open('out.mp3', 'wb') as f:
            f.write(result)
    playsound('out.mp3')

# 向机器人发送信息并对返回值处理
def ai(message):
    r=requests.get('http://api.qingyunke.com/api.php?key=free&appid=0&msg='+message)
    answer=str(r.json())
    lens=int(len(answer))
    ans=answer[26:lens-2]
    return ans

# 程序主体
print('欢迎使用聊天机器人')
ainame=input('给你的机器人取个名字吧\n')
name=input('你叫什么名字?\n')
print(ainame,':你好',name,',说些什么吧')
voiceout('你好,'+name+',说些什么吧')
i=1;
while i==1:
    print(name,':',end='')
    requ=voice()
    requ=urllib.parse.unquote(requ)
    if '再见' in requ or '晚安' in requ or '退出' in requ or '拜拜' in requ:
        i=0
    anse=ai(requ)
    if anse=='未获取到相关信息':
        anse='听不清,请再说一遍'
    print(ainame,':',anse)
    voiceout(anse)
print('谢谢使用!')
voiceout('谢谢使用!')

最后,再次感谢百度SDK,聊天机器人录音脚本playsound修改等教程或服务的作者或开发者

发表评论