Python世界:基于PESQ的自动化语音打分脚本实践

Python世界:基于PESQ的自动化语音打分脚本实践

任务背景

音频任务中,有时需对处理后的语音信号进行客观打分,以评估算法效果。这里提供一种基于PESQ的自动化语音打分脚本,提高效率。

Python实现

炒菜前,基本材料有:

  • 处理前的wav文件
  • 处理后的wav文件
  • pesq可执行文件

接着,先找个网上能用的炒菜食谱步骤,比如以下手动指令,确保能用:

8kHz语音打分参考指令:

shell 复制代码
pesq.exe +8000 ref.wav deg.wav

16kHz语音打分参考指令:

shell 复制代码
pesq.exe +16000 +wb ref.wav deg.wav

然后,用Python模拟批量手动处理过程,设计编码思路:

  • 读取输入wav参数,若非16k/8kHz及mono音频,直接退出
  • 读取输出wav参数,前缀需与输入一致,读参
  • 判别是否跟输入wav参数一致,不一致,直接退出
  • pesq入参处理
  • 传参运行pesq
  • 生成打分结果txt

最后,进行编程调试。

代码讲解

第1步,编写处理单个序列的pesq指令函数:

python 复制代码
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的调度逻辑:

python 复制代码
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步,编写主调:

python 复制代码
if __name__ == '__main__':
    print('start!')

    # 正式运行
    run_exe_pesq()

    print('done!')

本文总结

本案例实现了利用PESQ对指定目录下的wav序列进行批量打分,并输出打分结果。

使用时,需注意:

  • 仅支持wav输入,需提前构建in/out目录
  • 不支持非8kHz/16kHz音源
  • 序列命名条件需满足输入wav名字作为输出名字的前缀
    • 比如,输入参考序列test.wav,输出后的可以为test_out_n.wav

参考链接

  1. Python版PESQ评分实现
  2. PESQ语音质量测试
  3. PESQ和POLQA测试工具:link1,link2
相关推荐
打工仔折腾 AI23 分钟前
从BPE到SentencePiece:Transformer分词原理与Python实战对比
android·人工智能·python·深度学习·langchain·transformer·ai agent 实战
骑着蜗牛撵大象32733 分钟前
Qt 事件机制详解:从 QEvent 派生类到事件过滤器的全景指南
前端·python
流形填表44 分钟前
题库迁移实战:Excel中间格式与列映射
python·excel
东方芷兰1 小时前
Agent 技术摘要 06 —— Harness、原生视觉、Jev、mmproj、dsh
人工智能·笔记·python·ai·langchain·ai编程
qq_2518364571 小时前
理发管理系统 —— 会员模块
开发语言·前端·python·flask
郝学胜-神的一滴1 小时前
AI 编程智能体 03:拆解当下主流智能体能力
开发语言·c++·人工智能·python·程序人生·游戏
言乐61 小时前
Python文字审核模型
开发语言·windows·python·django·pygame
天远API2 小时前
零信任架构实战:基于天远股权穿透构建自动化供应链授信穿透网关
java·人工智能·架构·自动化
wuyk5552 小时前
Python网络爬虫入门到实战 第02章:HTTP/HTTPS协议超通俗精讲(GET/POST、请求头、响应码、爬虫核心基础)
爬虫·python·http
昔我往昔2 小时前
init文件介绍
python·flask