目录

  • 测试介绍
  • 通过serial库调用串口实现测试
    • 唤醒测试
    • 识别测试
  • 通过adb命令保存到日志,再读取实现测试
    • 唤醒测试
    • 识别测试

测试介绍

本脚本主要是用做测试【语音助手或智能家居】的【识别和唤醒】功能
语音数据存储形式:由多个嵌套文件夹组成,如【唤醒文件夹】——>【青年人文件夹】——>音频,所以会多一个搜索音频文件的方法

代码流程:

  1. 文件夹下的音频文件搜索
  2. 播放音频文件
  3. 读取log日志
  4. 比对结果
  5. 输出保存

写的逻辑比较乱,水平有限,见谅

通过serial库调用串口实现测试

唤醒测试

# coding=utf-8
import re
import os
import serial
import serial.tools.list_ports
import time
import pandas as pd
import pyaudio
import wave# -------------播放-------------
def play_audio(audio_path):CHUNK = 1024wf = wave.open(audio_path,mode='rb')p = pyaudio.PyAudio()steam = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)data = wf.readframes(CHUNK)while data != b'':steam.write(data)data = wf.readframes(CHUNK)steam.stop_stream()steam.close()p.terminate()# ---------搜索文件夹-----------
def search_files(path,all_files = []):filename_list = os.listdir(path)for filename in filename_list:cur_path = os.path.join(path,filename)if os.path.isdir(cur_path):search_files(cur_path,all_files)else:cur_path_tr = cur_path.replace(' ','_')os.rename(cur_path,cur_path_tr)all_files.append(cur_path)return all_files#-----------串口日志捕获,并打印---------------
def catch_output(com):#从串口中读取每一行日志信息lines = com.readlines()line = [line.decode('utf-8').strip() for line in lines]return line# 输入,打印输出并保存
def send_out_cmd(com,path,save_path,test_num):# 获取文件夹下所有音频路径all_files = search_files(path)count = 0   #计数:NO.df = pd.DataFrame(columns=['audio','txt','result_txt']) #保存格式:音频,预期结果,真正结果correct = []    # 储存结果:正确1,无识别0,错误识别或串扰-1,# 播放每一条音频,并获取结果for audio_path in all_files:count += 1#--------------唤醒音频----------------play_audio(audio_path) #播放time.sleep(2)data = catch_output(com) #打印日志#---------------提取结果---------------audio = audio_path.split('\\')[-1]  #音频名txt = audio_path.split('\\')[-2]    #预期结果,从上一级文件夹查找# 当没有读取到日志文件中的信息时if len(data) == 0:result_txt = 'nan'print(f"NO.{count}: {audio}")print(f"expected: {txt}")print(f"actual: {result_txt}")correct.append(0)print("result: False\n")df = pd.concat([df,pd.DataFrame([[audio,txt,result_txt]],columns=['audio','txt','result_txt'])],ignore_index=True)# 日志中有一个或多个时for d in data:result_txt = re.findall(r'\[TXT\]: (.*?), \[KID\]', str(d))[0]  #提取结果print(f"NO.{count}: {audio}")print(f"expected: {txt}")print(f"actual: {result_txt}")# 判断结果是否正确,并保存到correct中if result_txt.strip() == txt:correct.append(1)print("result: True\n")else:correct.append(-1)print("result: error\n")# 将此条结果保存df = pd.concat([df,pd.DataFrame([[audio,txt,result_txt]],columns=['audio','txt','result_txt'])],ignore_index=True)df['correct'] = correctdf.to_excel(save_path)# 控制测试数量if count==test_num:break# 判断结果保存df['correct'] = correct#结果统计desc_result(df,correct)df.to_excel(save_path)#--------------结果统计------------------
def desc_result(df,correct):print(f"唤醒总数:{len(df)} 唤醒正确数:{correct.count(1)} 准确率:{round(float(correct.count(1) / (len(df))) * 100, 2)}%")print(f"串扰率:{round(float(correct.count(-1) / (len(df))) * 100, 2)}% 拒识率:{round(float(correct.count(0) / (len(df))) * 100, 2)}%")# -------------检查可用串口-------------
def search_port():# 读取可用串口列表port_list = list(serial.tools.list_ports.comports())# 打印结果if len(port_list) == 0:print('无可用串口')else:for i in range(0,len(port_list)):print(port_list[i])if __name__ == '__main__':search_port()# 链接串口com = serial.Serial(port='COM4', baudrate=115200, timeout=2)# 向串口发送信息并打印path = r'C:\Users\bwli14\Desktop\**'save_path = r'C:\Users\bwli14\Desktop\result.xlsx'  #保存路径test_num = 5    #测试数量send_out_cmd(com,path,save_path,test_num)print('结束...')input('Press Enter to exit...')

识别测试

# coding=utf-8
import re
import os
import serial
import time
import pandas as pd
import serial.tools.list_ports
import pyaudio
import wave# -------------播放-------------
def play_audio(audio_path):CHUNK = 1024wf = wave.open(audio_path,mode='rb')p = pyaudio.PyAudio()steam = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)data = wf.readframes(CHUNK)while data != b'':steam.write(data)data = wf.readframes(CHUNK)steam.stop_stream()steam.close()p.terminate()# ---------搜索文件夹-----------
def search_files(path,all_files = []):filename_list = os.listdir(path)for filename in filename_list:cur_path = os.path.join(path,filename)if os.path.isdir(cur_path):search_files(cur_path,all_files)else:cur_path_tr = cur_path.replace(' ','_')os.rename(cur_path,cur_path_tr)all_files.append(cur_path)return all_files#-----------串口日志捕获,并打印---------------
def catch_output(com):#从串口中读取每一行日志信息lines = com.readlines()line = [line.decode('utf-8').strip() for line in lines]return line# 输入,打印输出并保存
def send_out_cmd(com,dist_path,awa_path,save_path,test_num):# 获取文件夹下所有音频路径all_files = search_files(dist_path)count = 0  # 计数:NO.df = pd.DataFrame(columns=['audio', 'txt', 'result_txt'])  # 保存格式:音频,预期结果,真正结果correct = []  # 储存结果:正确1,无识别0,错误识别或串扰-1# 播放每一条音频,并获取结果for audio_path in all_files:count += 1#--唤醒语音--huanxing_start(com,awa_path)#--------------识别音频----------------play_audio(audio_path)  # 播放time.sleep(2)data = catch_output(com)  # --打印日志--# 提取结果audio = audio_path.split('\\')[-1]  # 音频名txt = audio_path.split('\\')[-2]  # 预期结果,从上一级文件夹查找# 当没有读取到日志文件中的信息时if len(data) == 0:result_txt = 'nan'print(f"NO.{count}: {audio}")print(f"expected: {txt}")print(f"actual: {result_txt}")correct.append(0)print("result: False\n")df = pd.concat([df,pd.DataFrame([[audio,txt,result_txt]],columns=['audio','txt','result_txt'])],ignore_index=True)# 日志中有一个或多个时for d in data:result_txt = re.findall(r'\[TXT\]: (.*?), \[KID\]', str(d))[0]print(f"NO.{count}: {audio}")print(f"expected: {txt}")print(f"actual: {result_txt}")# 判断结果是否正确,并保存到correct中if result_txt.strip() == txt:correct.append(1)print("result: True\n")else:correct.append(-1)print("result: error\n")# 将此条结果保存df = pd.concat([df,pd.DataFrame([[audio,txt,result_txt]],columns=['audio','txt','result_txt'])],ignore_index=True)df['correct'] = correctdf.to_excel(save_path)# 控制测试数量if count==test_num:break# 判断结果保存df['correct'] = correct#------------结果统计--------------desc_result(df,correct)df.to_excel(save_path)#--------------结果统计------------------
def desc_result(df,correct):print(f"句总数:{len(df)} 句正确数:{correct.count(1)} 准确率:{round(float(correct.count(1) / (len(df))) * 100, 2)}%")print(f"串扰率:{round(float(correct.count(-1) / (len(df))) * 100, 2)}% 拒识率:{round(float(correct.count(0) / (len(df))) * 100, 2)}%")# ---------唤醒音频-----------
def huanxing_start(com,awa_path):# 播放唤醒音频,直到唤醒成功while True:play_audio(awa_path)time.sleep(1)s = catch_output(com)try:result_txt = re.findall(r'\[TXT\]: (.*?), \[KID\]', str(s))[0]except IndexError:continueif result_txt == '摩根摩根':print('唤醒成功')break# -------------检查可用串口-------------
def search_port():# 读取可用串口列表port_list = list(serial.tools.list_ports.comports())# 打印结果if len(port_list) == 0:print('无可用串口')else:for i in range(0,len(port_list)):print(port_list[i])if __name__ == '__main__':search_port()com = serial.Serial(port='COM4', baudrate=115200, timeout=2)dist_path = r'C:\Users\bwli14\Desktop\***'  #识别音频路径awa_path = r'C:\Users\bwli14\Desktop\**\**.wav'    #唤醒音频save_path = r'C:\Users\bwli14\Desktop\result.xlsx'  #保存路径test_num = 5    #测试数量send_out_cmd(com,dist_path,awa_path,save_path,test_num)print('结束...')input('Press Enter to exit...')

通过adb命令保存到日志,再读取实现测试

唤醒测试

# coding=utf-8
import os
import re
import subprocess
import time
import waveimport pandas as pd
import pyaudio
from loguru import logger#-------------播放-------------
def play_audio(audio_path):CHUNK = 1024wf = wave.open(audio_path,mode='rb')p = pyaudio.PyAudio()steam = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)data = wf.readframes(CHUNK)while data != b'':steam.write(data)data = wf.readframes(CHUNK)steam.stop_stream()steam.close()p.terminate()#---------搜索文件夹-----------
def search_files(path,all_files = []):filename_list = os.listdir(path)for filename in filename_list:cur_path = os.path.join(path,filename)if os.path.isdir(cur_path):search_files(cur_path,all_files)else:cur_path_tr = cur_path.replace(' ','_')os.rename(cur_path,cur_path_tr)all_files.append(cur_path)return all_files#---------adb命令输入到cmd----------
def system_shell(shl):os.system(shl)#----------读取日志信息并返回-------------
def read_logs():fo = open(r"C:\Users\bwli14\Desktop\**\**.log", "rb") # 一定要用'rb'因为seek 是以bytes来计算的# print ("文件名为: ", fo.name)global start_point #使用全局变量,让start_point 时刻保持在已经输出过的那个字节位fo.seek(start_point, 1)#移动文件读取指针到指定位置lines = fo.readlines()log = ''for line in lines:try:log = log + ''.join(line.decode('utf-8'))except UnicodeDecodeError:continue# print ("读取的数据为:" + str(log))#输出后的指针位置赋值给start_piontstart_point=fo.tell()fo.close()return log#-----正则提取-------
def re_extract(log):if re.findall('ci_wakeup',log):return Trueelse:return False#-----结果描述统计-------
def desc_result(df):print(f"唤醒总数:{len(df)} 唤醒正确数:{len(df[df['result']==True])}")print(f"准确率:{round(float(len(df[df['result']==True]) / (len(df))) * 100, 2)}% 拒识率:{round(float(len(df[df['result']==False])/ (len(df))) * 100, 2)}%")if __name__ == '__main__':start_point=0   #文件指针,不可修改shl = 'adb pull /sdcard/***/***.log C:\\Users\\bwli14\\Desktop\\**'   #adb pull命令path = r'C:\Users\bwli14\Desktop\*******' #语料地址save_path = r'C:\Users\bwli14\Desktop\***.xlsx'   #保存路径expected = 'ci_wakeup' #期望值test_num = 5    #测试数量wait_time = 2   #未响应时的等待时间all_files = search_files(path)  #搜索全部语料地址read_logs() #初始化log,使其在最新内容开始位置df = pd.DataFrame(columns=['audio','result','expected','actual','play_aftertime','response_time'])count = 0for audio_path in all_files:count+=1play_audio(audio_path)  #播放音频time.sleep(1)   #等待响应#记录播放的时间和本地时间start = time.perf_counter()play_aftertime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())#判断是否响应while True:system_shell(shl)   #输入adb命令log = read_logs()   #读取log最新内容#记录响应的时间和本地时间end = time.perf_counter()response_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())#判读是否唤醒if re_extract(log)==True:break#判断等待时间是否超时if round(end-start,2)>=wait_time-1:response_time = 0break# system_shell(shl)# log = read_logs()result = re_extract(log)    #获取唤醒结果audio_name = audio_path.split('\\')[-1] #音频名#获取真实结果if result:actual = expectedelse:actual = ''#保存new_df = pd.DataFrame([[audio_name,result,expected,actual,play_aftertime,response_time]],columns=['audio','result','expected','actual','play_aftertime','response_time'])df = pd.concat([df,new_df],ignore_index=True)df.to_excel(save_path)print(f"NO.{count}:{audio_name}")print(f'expected:{expected} \nactual:{actual}')print(f"result: {result}\n")if count == test_num:breakdesc_result(df)

识别测试

识别测试根据上面的自行总结出来,这里就做个练习。

语音测试,串口和adb相关推荐

  1. Android终端测试-常用的ADB命令

    作为一个终端测试来说,adb命令绝对是必备且常用的工具,不管是使用adb工具来抓取设备日志还是操作设备,都是比较方便的. 下面命令是在某信工作几年中经常用的的adb命令,主要用来操作TV端(Andro ...

  2. 语音mos测试软件,Pilot Pioneer3.6软件MOS语音测试简易指导书.doc

    - PAGE 2 - Pilot Pioneer3.6软件MOS语音测试简易指导书 (前台部分) 张新 2008年12月17日 TOC \o "1-3" \h \z \u 一.设备 ...

  3. Android App压力测试(Monkey和ADB)

    压力测试简介 压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分.压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试.通常 ...

  4. android modem开发(16)---MTK语音测试

    场地测试:语音测试 一.Speech 测试 1.测试机与固定电话进行拨打,二者处于不同空间,避免二者的Uplink&DL声音都是一样; 2.对比机与测试机处于同一个环境,之间建议相隔几米,同时 ...

  5. 【第3篇】人工智能(AI)语音测试原理和实践

    第1章第2节 人工智能简介 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人工智能语音测 ...

  6. CDS软件语音测试,cds测试软件

    这是cds测试软件,适用于FDDLTE测试 使用CDS 软件连接终端,两HTC-M8终端在连接CDS软件语音测试时,任一HTC-M8呼叫被保持后出. 软件介绍 cds测试软件适用于FDDLTE测试 使 ...

  7. 【第5篇】人工智能(AI)语音测试原理和实践

    第1章第4节 AI语音测试简介 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人工智能语 ...

  8. 【第1篇】人工智能(AI)语音测试原理和实践

    第1章第1节   人工智能语音测试介绍 本章首先介绍语音的基本概念及语音的产生原理,然后介绍什么是人工智能语音.人工智能语音交互和人工智能语音测试,最后阐述人工智能语音测试的目的和意义,引领大家走入人 ...

  9. AISHELL-2021E-EVAL 法律庭审场景语音测试数据集

    法律庭审场景语音测试数据集 语音识别实验评测 Speech Recognition Evaluation DATA Information Total Time  1 Hours Sampling R ...

  10. 智能座舱测试——数据驱动开发的语音测试方案

    数据驱动开发的语音测试方案 背景 面向对象 数据准备 技术需求 测试任务 测试基础设施 附录 背景 本文章只涉及思路,不涉及具体技术实现 不知不觉已经做语音云端测试已经有段日子了,从刚开始关注语音识别 ...

最新文章

  1. 一文概览深度学习中的五大正则化方法和七大优化策略
  2. 自动驾驶真的会来得那么快吗:关于自动驾驶的7个疑问
  3. mongoDB 文档概念
  4. 06年做的一个配置,从net130转过来的
  5. JavaScript 对象属性作实参以及实参对象的callee属性
  6. django 获取外键对应数据的方式
  7. matlab平面绘图命令
  8. VisualNet在资源管理中的应用
  9. html5新增的js api,对HTML5新增JS Api的思考
  10. 韩国拟监管加密相关国际汇款,以限制资金流向海外
  11. java graham_Graham Scan凸包算法
  12. 计算机网络胡工程施工税率,弱电项目增值税6%、9%、13%税率怎样区分?项目经理必知内容...
  13. JavaSE的思维导图
  14. 阿里天池工业蒸汽量预测baseline-数据探索篇
  15. 一个垃圾分类项目带你玩转飞桨(2)
  16. MacTex字体缺失 Error: The font “TeX Gyre Termes Math“ cannot be found.
  17. DHCP 解决单位网络私接路由器的办法
  18. IDEA中maven项目dependencies报错飘红问题解决
  19. 噩梦射手(SurvivalShooter)教程(一)
  20. 批量打印电子发票方法,发票连续打印教程分享

热门文章

  1. 【口令破解】远程口令破解和本地口令破解(crunch 字典工具和hydra工具)
  2. Windows内核的基本概念
  3. Windows内核编程(二)-第一个内核程序
  4. VS2013安装番茄助手
  5. CEO如何做好企业战略管理?
  6. XAP部署错误代码大全
  7. 9008刷机模式写入超时刷机帮_高通9008模式刷机,让小米刷机不再畏惧
  8. xy的联合概率密度函数怎么求_X Y的联合密度函数
  9. RTP发送h264文件,用vlc播放
  10. .NET反编译之manager,base.AutoScaleMode修复