语音测试,串口和adb
生活随笔
收集整理的這篇文章主要介紹了
语音测试,串口和adb
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
目錄
- 測試介紹
- 通過serial庫調(diào)用串口實現(xiàn)測試
- 喚醒測試
- 識別測試
- 通過adb命令保存到日志,再讀取實現(xiàn)測試
- 喚醒測試
- 識別測試
測試介紹
本腳本主要是用做測試【語音助手或智能家居】的【識別和喚醒】功能
語音數(shù)據(jù)存儲形式:由多個嵌套文件夾組成,如【喚醒文件夾】——>【青年人文件夾】——>音頻,所以會多一個搜索音頻文件的方法
代碼流程:
寫的邏輯比較亂,水平有限,見諒
通過serial庫調(diào)用串口實現(xiàn)測試
喚醒測試
# 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 #計數(shù):NO.df = pd.DataFrame(columns=['audio','txt','result_txt']) #保存格式:音頻,預(yù)期結(jié)果,真正結(jié)果correct = [] # 儲存結(jié)果:正確1,無識別0,錯誤識別或串擾-1,# 播放每一條音頻,并獲取結(jié)果for audio_path in all_files:count += 1#--------------喚醒音頻----------------play_audio(audio_path) #播放time.sleep(2)data = catch_output(com) #打印日志#---------------提取結(jié)果---------------audio = audio_path.split('\\')[-1] #音頻名txt = audio_path.split('\\')[-2] #預(yù)期結(jié)果,從上一級文件夾查找# 當沒有讀取到日志文件中的信息時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] #提取結(jié)果print(f"NO.{count}: {audio}")print(f"expected: {txt}")print(f"actual: {result_txt}")# 判斷結(jié)果是否正確,并保存到correct中if result_txt.strip() == txt:correct.append(1)print("result: True\n")else:correct.append(-1)print("result: error\n")# 將此條結(jié)果保存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)# 控制測試數(shù)量if count==test_num:break# 判斷結(jié)果保存df['correct'] = correct#結(jié)果統(tǒng)計desc_result(df,correct)df.to_excel(save_path)#--------------結(jié)果統(tǒng)計------------------ def desc_result(df,correct):print(f"喚醒總數(shù):{len(df)} 喚醒正確數(shù):{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())# 打印結(jié)果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)# 向串口發(fā)送信息并打印path = r'C:\Users\bwli14\Desktop\**'save_path = r'C:\Users\bwli14\Desktop\result.xlsx' #保存路徑test_num = 5 #測試數(shù)量send_out_cmd(com,path,save_path,test_num)print('結(jié)束...')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 # 計數(shù):NO.df = pd.DataFrame(columns=['audio', 'txt', 'result_txt']) # 保存格式:音頻,預(yù)期結(jié)果,真正結(jié)果correct = [] # 儲存結(jié)果:正確1,無識別0,錯誤識別或串擾-1# 播放每一條音頻,并獲取結(jié)果for audio_path in all_files:count += 1#--喚醒語音--huanxing_start(com,awa_path)#--------------識別音頻----------------play_audio(audio_path) # 播放time.sleep(2)data = catch_output(com) # --打印日志--# 提取結(jié)果audio = audio_path.split('\\')[-1] # 音頻名txt = audio_path.split('\\')[-2] # 預(yù)期結(jié)果,從上一級文件夾查找# 當沒有讀取到日志文件中的信息時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}")# 判斷結(jié)果是否正確,并保存到correct中if result_txt.strip() == txt:correct.append(1)print("result: True\n")else:correct.append(-1)print("result: error\n")# 將此條結(jié)果保存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)# 控制測試數(shù)量if count==test_num:break# 判斷結(jié)果保存df['correct'] = correct#------------結(jié)果統(tǒng)計--------------desc_result(df,correct)df.to_excel(save_path)#--------------結(jié)果統(tǒng)計------------------ def desc_result(df,correct):print(f"句總數(shù):{len(df)} 句正確數(shù):{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())# 打印結(jié)果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 #測試數(shù)量send_out_cmd(com,dist_path,awa_path,save_path,test_num)print('結(jié)束...')input('Press Enter to exit...')通過adb命令保存到日志,再讀取實現(xiàn)測試
喚醒測試
# 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 時刻保持在已經(jīng)輸出過的那個字節(jié)位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 ("讀取的數(shù)據(jù)為:" + 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#-----結(jié)果描述統(tǒng)計------- def desc_result(df):print(f"喚醒總數(shù):{len(df)} 喚醒正確數(shù):{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 #測試數(shù)量wait_time = 2 #未響應(yīng)時的等待時間all_files = search_files(path) #搜索全部語料地址read_logs() #初始化log,使其在最新內(nèi)容開始位置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) #等待響應(yīng)#記錄播放的時間和本地時間start = time.perf_counter()play_aftertime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())#判斷是否響應(yīng)while True:system_shell(shl) #輸入adb命令log = read_logs() #讀取log最新內(nèi)容#記錄響應(yīng)的時間和本地時間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) #獲取喚醒結(jié)果audio_name = audio_path.split('\\')[-1] #音頻名#獲取真實結(jié)果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)識別測試
識別測試根據(jù)上面的自行總結(jié)出來,這里就做個練習。
總結(jié)
以上是生活随笔為你收集整理的语音测试,串口和adb的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shl归纳推理测试题库_shl归纳推理测
- 下一篇: SHL笔试全攻略(转)