大佬教程收集整理的这篇文章主要介绍了用python写一个自动朗读的自动化测试程序,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
做物联网涉及到实际使用环境语音识别准确率的测试,大量的语料如果是人来朗读的话太费功夫,编一个自动测试程序即可无人通宵测试,大大提高了效率;朗读上可以通过调用powersHell来朗文档中的语料,通然后过串口抓取设备设备对语料响应的数据进行分析把识别结果写入到文档当中;
需要安装serial(串口支持模块)和openxl(Exel文档支持模块);编译调试完成打包为.exe文件,可在没有配置python环境的电脑上运行;
使用到python多线程(通过Queue线程间通信),还有文档读写操作;很有参考价值,
import threading
import time
import os
import re
import fileinput
from glob import glob
import subprocess as sp
from queue import Queue
# import xlrd
from openpyxl import load_workbook
from openpyxl import Workbook
print('
Hellow World:',time.time()) #时间戳:秒
event = threading.Event()
#//////////////////////////////////////////////////////////////////////////////调用powers
Hell的类
# from scapy
def __init__(self, coding, ):
cmd = [self._where('PowerS
Hell.exe'),
"-NoLogo", "-NonInteractive", # Do not print headers
"-Command", "-"] # Listen commands from stdin
startupinfo = sp.STARTUPINFO()
startupinfo.dwFlags |= sp.STARTF_USESHOWWINDOW
self.popen = s
p.popen(cmd, stdout=s
p.pIPE, stdin=s
p.pIPE, stderr=sp.STDOUT, startupinfo=startupinfo)
self.coding = coding
def __enter__(self):
return self
def __exit__(self, a, b,
C):
self.popen.kill()
def run(self, cmd, timeout=6): #timeout
=0 延时
b_cmd = cm
d.encode(encoding=self.coding)
try:
b_outs, errs = self.popen.communicate(b_cmd, timeout=timeout)
except sp.TimeoutExpired:
self.popen.kill()
b_outs, errs = self.popen.communicate()
outs = b_out
s.decode(encoding=self.coding)
return outs, errs
@staticmethod
def _where(fil
ename, dirs=None, env="PATH"):
"""Find file in current dir, in deep_lookup cache or in system path"""
if dirs is None:
dirs = []
if not isinstance(dirs, list):
dirs = [dirs]
paths = [o
s.curdir] + o
s.environ[env].split(o
s.path.pathse
p) + dirs
try:
return next(o
s.path.normpath(match)
for path in paths
for match in glob(o
s.path.join(path, file
Name))
if match)
except (StopIteration, RuntimeError):
raise IOError("File not found: %s" % file
Name)
#//////////////////////////////////////////////////////////////////////////
#/////////////////////////////////////////////////////////////////////////文本处理
pscmd='Add-Type -AssemblyName Syste
m.speech;\
$speak = New-Ob
ject Syste
m.Speech.Synthesi
s.SpeechSynthesizer;\
$speak.Rate = 0;\
$speak.Speak("天猫精灵")' #powers
Hell文本朗读指令
cmd="天猫精灵"
StandardCmd_n=''
FailDispaly_n=[]
uart_error
=0 #控制,朗读10次天猫精灵都没有回应,退出程序
# input()
data = load_workbook('test.x
LSX')#
打开表格
@H_287_6
@mydata=data["Sheet1"] #sheet1
log='' #提取日志
def SpeakTm():
global uart_error #读天猫
with PowerS
Hell('GBK') as ps:
print("天猫精灵")
uart_error+=1
if uart_error>10: #朗读10次没有回应,保存信息,退出程序
data.save('TestResult.x
LSX')
with open('Show.txt', mode='a',encoding='utf-8') as LogUart:
LogUart.writeli
nes(["天猫精灵\n"])
LogUart.close()
def changepscmd(fcmd): #读设定朗读语句
cmd=str(fcmd)
pscmd0=pscmd
p = re.compile("天猫精灵")
pscmd1 = p.sub(cmd,pscmd0)
with PowerS
Hell('GBK') as ps:
outs, errs = p
s.run(pscmd1) #在run函数中输入powers
Hell指令
print('error:', o
s.li
nesep, errs)
print('output:', o
s.li
nesep, outs)
# with open('LogSpeech.txt', mode='a',encoding='utf-8') as LogSpeech:
# LogSpeech.writeli
nes([time.
ctime(), ' say :',cmd,'\n'])
# LogSpeech.close()
with open('Show.txt', mode='a',encoding='utf-8') as LogUart:
LogUart.writeli
nes([time.
ctime(), ' say :',cmd,'\n'])
LogUart.close()
print(cmd) #打印朗读的语料
def
checkcmd(StandardCmd_n): #比较提取的指令和标准指令
global FailDispaly_n
# q2.get()
p = re.compile(", 0x")
pscmd0 = p.sub('',log)
pscmd1=pscmd0.upper()
scmd0=str(StandardCmd_n)
scmd=scmd0.upper()
print('yu--->',cmd,'pscmd1--->',pscmd1,'standard--->',StandardCmd_n)
with open('Show.txt', mode='a',encoding='utf-8') as LogUart:
LogUart.writeli
nes(['yu--->',cmd,'pscmd1--->',pscmd1,'standard--->',StandardCmd_n])
LogUart.close()
if pscmd1.find(scmd)
!=-1:
return True
else:
def Rouse_Tm(log):
if log.find('tian mao jing ling')
!=-1:
return True
else:
#//////////////////////////////////////////////////////////////////////////////////朗读线程函数入口
def Speech():
global StandardCmd_n
global Corpus_n
global order
order=1
for i in mydata['A']:
if order > 1: #使得order读取的数据和i的下标同步,好自然结束for循环
StandardCmd_n=str(mydata['B%d'%order].
value) #取语料对应的标准指令
number_n=mydata['C%d'%order].value #取语料对应的朗读次数
FailDispaly_n="" #初始失败次数置空
while
number_n>0: #朗读次数大于0朗读,并递减
SpeakTm()
time.sleep
(1) #使线程等待收到相应天猫响应指令后
继续执行
event.wait(7) #线程等待触发
if q.empty():
print('cant listen')
con
Tinue #天猫精灵没有唤醒,重新进行唤醒
else:
q.get()
print('good')
event.clear() #set会重置所有wait为不再等待,clear使所有wait重新生效
changepscmd(Corpus_n) #朗读
# time.sleep(5) #必须有个时间等待接收指令
event.wait(10) #线程等待触发
event.clear()
if q1.empty():
print('cant know') #天猫精灵唤醒成功,朗读语料,没有回应相关的指令
with open('Show.txt', mode='a',encoding='utf-8') as LogUart:
LogUart.writeli
nes([time.
ctime(), 'cant know\n'])
LogUart.close()
if cmd_error==2:
if FailSum<10:
FailSum+=1
FailDispaly_n+="识别T 发送F- \n"
mydata['E%d'%order].value=FailDispaly_n #直接写入没有识别进行下一次朗读
else:
if FailSum<10:
FailSum+=1
FailDispaly_n+="识别错误- \n"
mydata['E%d'%order].value=FailDispaly_n #直接写入没有识别进行下一次朗读
else:
q1.get()
print('good')
with open('Show.txt', mode='a',encoding='utf-8') as LogUart:
LogUart.writeli
nes([time.
ctime(), 'good\n'])
LogUart.close()
if
checkcmd(StandardCmd_n): #判断指令是否正确,正确添加成功数,不正确打印错误案例
else:
if FailSum<10:
FailSum+=1
FailDispaly_n+=log+'\n'
mydata['E%d'%order].value=FailDispaly_n
break
mydata['D%d'%order].value=
successNum_n #直接将所获得得数据输入对应单元格
try:
data.save('TestResult.x
LSX')#保存到
一个新的excel
except():
order+=1
time.sleep(5)
#/////////////////////////////////////////////////////////////////////////////////////串口调试
print("请输入正确的串口号按回车健运行:")
@H_287_6
@mycomX='COM'+str(input())
#///////////////////////////////////////////////////////////////////////////////////主线程串口接收
#/////////////////////////////////////////////////////////////////////////////////////