当前位置: 首页 > article >正文

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

参考链接

  1. Python版PESQ评分实现
  2. PESQ语音质量测试
  3. PESQ和POLQA测试工具:link1,link2

http://www.kler.cn/a/302258.html

相关文章:

  • 提高数据处理效率:JavaScript 操作 XLSX 文件的最佳实践
  • 深度学习之pytorch常见的学习率绘制
  • 4-6-2.C# 数据容器 - ArrayList 扩展(ArrayList 注意事项、ArrayList 存储对象的特性、ArrayList 与数组的转换)
  • 安全见闻1-5
  • LeetCode 86.分隔链表
  • 【数据结构与算法】第11课—数据结构之选择排序和交换排序
  • 【安当产品应用案例100集】016-如何实现人大金仓数据库的透明加密及访问控制
  • 从搜索热度上看Arcgis的衰退
  • 初识php库管理工具composer的体验【爽】使用phpword模板功能替换里面的字符串文本
  • 鸿蒙开发5.0【帧率】解析
  • 排序链表(归并排序)
  • 2024年AI智能电销机器人为什么那么火爆
  • 阿里巴巴1688中国站商品搜索API返回值深度解析与实战应用
  • 四川财谷通赋能抖音小店前景璀璨
  • 【828华为云征文|手把手教你如何用华为云Flexus X实例部署之前爆火的“人生重启“游戏】
  • SpringBoot基础 -- 高级特性
  • 浅谈C#之线程创建和管理
  • 基于深度学习的多模态信息检索
  • MapBox Android版开发 4 国际化功能v11
  • 什么不建议通过 `Executors` 构建线程池?
  • 抓包工具检测手把手教学 - 某招聘网站
  • 7-6 列出连通集
  • pyqt自定义文本编辑器
  • TCP通信实现
  • 2024 天池云原生编程挑战赛决赛名单公布,9 月 20 日开启终极答辩
  • 【从0开始在CentOS 9中安装redis】