0%

语音部署

有个项目是通过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
# coding:utf-8
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)
#{'alternative': [{'transcript': '你好', 'confidence': 0.97500253}], 'final': 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简单语音识别并响应