有个项目是通过jenkins部署的,多人合作开发的项目,有一天有人问如何部署项目,有人开玩笑说你可以语音部署(喊另外一个同事部署),突然有个想法把项目搞成语音部署。
最开始的想法是借用微信,电脑登录微信用程序监听,然后发微信语音部署,这个项目感觉有点复杂不知道能不能获取语音的文字没有具体研究。后来突然想到用python监听麦克风来实现。先查了下python是有库可以监听麦克风并保存为音频文件的,后来查资料的时候发现有用python做的简单语音识别借鉴了下开搞
首先需要用到的扩展:
logging 日志
SpeechRecognition 语音识别
pyAudio 跨平台的音频 I/O 库
pyttsx3 文字转语音库
paramiko 远程操作服务器
思路就是脚本启动后,用户说出需要部署的项目,通过程序识别用户说的话,然后通过正则匹配是部署那个项目,识别后执行远程部署服务器的部署脚本,部署完 语音播报下部署完成
说下过程中遇到的问题
1.语音识别用的谷歌云平台的语音转文字服务,因为是不需要API密钥的,源码中默认配置了一个密钥,使用这个需要梯子,然而部署的服务器是需要连vpn的,我的梯子配置的是socks,没有配置全局代理(不知道直接配置全局代理会不会就可以了 没有试),然后命令行配置proxychains,,所以执行脚本的时候需要加proxychains 命令,然后就会有识别出文字后,在执行服务器脚本的时候,报错连不上服务器,因为走了梯子,所以就连不上服务器了。开始想的是看看能不能在语音识别的时候配置代理,后来查资料没有发现可以配置的(可能有我没查到),然后想直接把vpn安装到梯子的服务器,然后使用梯子应该可以(嫌麻烦这个方法也没执行),然后查是否可以部分代理,然远程部署的服务器不走代理,查资料发现好socks,proxychains的貌似不可以(可能我没查到),后来想到http_proxy是支持配置那些不代理的,最后的解决办法是把本地的带来改成http的,然后配置部署服务器不走代理,最后解决这个问题
2.执行完脚本后,语音播报执行完成的时候,发出的声音中文是乱音,英文没问题 然后查资料,给的例子都是一样的(感觉都是从哪里复制的),但是我本地是问题,可能是我本地的环境有问题,后来google查了下有遇到相同问题的,是需要设置语言(setProperty(‘voice’,’zh’)),之前找的demo都没有这个,不知道他们是怎么用的
3.本地环境是arch,部署服务器的vpn是有密码的,每次启动vpn的时候都要输入密码很麻烦这个还没有优化
解决办法在openvpn配置文件中添加
askpass /etc/openvpn/pass.pass
这个文件中放密码
最后上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| import speech_recognition as sr import logging import pyttsx3 import paramiko logging.basicConfig(level=logging.WARNING)
engine = pyttsx3.init() engine.setProperty('voice', 'zh') hostname = '10.123.0.197' port = 22 username = 'mp' password = '/home/bxw/.ssh/id_rsa' def sshclient_execmd(hostname, port, username, ssh_key_path, execmd): s = paramiko.SSHClient() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) pkey = paramiko.RSAKey.from_private_key_file(ssh_key_path, password="username") s.connect(hostname=hostname, port=port, username=username, pkey=pkey) stdin, stdout, stderr = s.exec_command (execmd)
line = stdout.readlines() s.close() return line
while True: r = sr.Recognizer() mic = sr.Microphone()
logging.info('录音中...') with mic as source: r.adjust_for_ambient_noise(source) audio = r.listen(source) logging.info('录音结束,识别中...') test = r.recognize_google(audio, language='cmn-Hans-CN', show_all=True) if len(test) >0: result = test['alternative'][0]['transcript'] logging.info(result) if "部署" in result: print(result) if "后台" in result or "后端" in result: print("部署后台") engine.say("部署后台启动") engine.runAndWait() line=sshclient_execmd(hostname,port,username,password,"cd /backup05/mp/eladmin;sh update.sh") print(line) engine.say("部署完成") elif "前端" in result or "前台" in result : print("部署前端") engine.say("部署前端启动") engine.runAndWait() line=sshclient_execmd(hostname,port,username,password,"cd /backup05/mp/web/monitor-web/;sh run-build.sh") print(line) engine.say("部署完成") logging.info('end')
|
现在需要程序一直运行,之后添加语音唤醒功能
代理配置在.bashrc中加
export http_proxy=”127.0.0.1:1081” http代理地址
export no_proxy=”10.123.0.197” 不走代理的服务
参考的博客:
https://www.cnblogs.com/warcraft/p/10112486.html Python简单语音识别并响应