Python世界:基于PESQ的自动化语音打分脚本实践
Python世界:基于PESQ的自动化语音打分脚本实践
- 任务背景
- Python实现
- 代码讲解
- 本文总结
任务背景
音频任务中,有时需对处理后的语音信号进行客观打分,以评估算法效果。这里提供一种基于PESQ的自动化语音打分脚本,提高效率。
Python实现
炒菜前,基本材料有:
- 处理前的wav文件
- 处理后的wav文件
- pesq可执行文件
接着,先找个网上能用的炒菜食谱步骤,比如以下手动指令,确保能用:
8kHz语音打分参考指令:
pesq.exe +8000 ref.wav deg.wav
16kHz语音打分参考指令:
pesq.exe +16000 +wb ref.wav deg.wav
然后,用Python模拟批量手动处理过程,设计编码思路:
- 读取输入wav参数,若非16k/8kHz及mono音频,直接退出
- 读取输出wav参数,前缀需与输入一致,读参
- 判别是否跟输入wav参数一致,不一致,直接退出
- pesq入参处理
- 传参运行pesq
- 生成打分结果txt
最后,进行编程调试。
代码讲解
第1步,编写处理单个序列的pesq指令函数:
import os
import wave
def pesq_one_seq(path_wav_in, path_wav_out, path_pesq_exe):
# 检验wav参数
with wave.open(path_wav_in, "rb") as wav_in:
sample_rate_in = wav_in.getframerate()
ch_in = wav_in.getnchannels()
if (sample_rate_in != 8000 and sample_rate_in != 16000):
print(wav_in, "{} sr not supported!".format(sample_rate_in))
return
if (ch_in != 1):
print(wav_in, "{} ch not supported!".format(ch_in))
return
with wave.open(path_wav_out, "rb") as wav_out:
sample_rate_out = wav_out.getframerate()
ch_out = wav_out.getnchannels()
if (sample_rate_out != sample_rate_in or ch_in != ch_out):
print("wav in/out not same! in: {0}, {1}, out: {2}, {3}".format(
sample_rate_in, ch_in, sample_rate_out, ch_out))
return
# exe入参处理
param_sr = "+" + str(sample_rate_in)
if (sample_rate_in == 16000):
param_bw = "+wb"
else:
param_bw = " "
param = "{0} {1} {2} {3} {4}".format(path_pesq_exe, param_sr, param_bw, path_wav_in, path_wav_out)
print(param)
# exe运行
os.system(param)
time.sleep(5)
return
第2步,编写批量运行pesq的调度逻辑:
def run_exe_pesq():
path_pesq_exe = r"E:\pesq.exe"
path_wav_in = r'E:\wav_in'
path_wav_out = r"E:\wav_out"
namelist = os.listdir(path_wav_in)
name_wav_out = os.listdir(path_wav_out)
for file_name in namelist:
for name_out in name_wav_out:
name_in_rm_postfix = file_name.split('.')[0]
if name_in_rm_postfix in name_out:
wav_in = os.path.join(path_wav_in, file_name)
wav_out = os.path.join(path_wav_out, name_out)
pesq_one_seq(wav_in, wav_out, path_pesq_exe)
return
第3步,编写主调:
if __name__ == '__main__':
print('start!')
# 正式运行
run_exe_pesq()
print('done!')
本文总结
本案例实现了利用PESQ对指定目录下的wav序列进行批量打分,并输出打分结果。
使用时,需注意:
- 仅支持wav输入,需提前构建in/out目录
- 不支持非8kHz/16kHz音源
- 序列命名条件需满足输入wav名字作为输出名字的前缀
- 比如,输入参考序列test.wav,输出后的可以为test_out_n.wav
参考链接
- Python版PESQ评分实现
- PESQ语音质量测试
- PESQ和POLQA测试工具:link1,link2