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

devtools/2024/9/20 2:02:32/ 标签: python, 自动化, 语音识别

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指令函数:

python">import os
import wavedef 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))returnif (ch_in != 1):print(wav_in, "{} ch not supported!".format(ch_in))returnwith 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

http://www.ppmy.cn/devtools/114350.html

相关文章

【论文阅读】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

Abstract 在这篇论文中,我们研究了使基于视觉的机器人操纵系统能够泛化到新任务的问题,这是机器人学习中的一个长期挑战。我们从模仿学习的角度来应对这一挑战,旨在研究如何扩展和扩大收集的数据来促进这种泛化。为此,我们开发了…

项目小总结

这段时间主要把大概的开发流程了解完毕 修改了,并画了几个界面 一.界面 修改为 博客主页 个人中心 二.前后端分离开发 写前端时 就可以假设拿到这些数据了 const blogData2 {blog:{id:1,title: "如何编程飞人",author_id: 1,content: "这是一篇…

学习风格的类型

学习风格是指个体在学习过程中偏好的方式和方法。不同的学习风格反映了人们在接收、处理和记忆信息方面的不同偏好。了解自己的学习风格可以帮助提高学习效率和效果。以下是几种常见的学习风格类型: 1. 视觉型(Visual Learner) 特点&#x…

深度解析代理IP地址与端口:定义及高效获取方法

代理服务器在互联网生活中扮演了重要角色,不仅能帮助我们实现隐私安全浏览,还能获取更多的网络资源。而代理IP地址和端口是设置代理服务器的关键参数,想要成功连接代理,这两个参数是不可或缺的。那什么是代理IP地址和端口&#xf…

828华为云征文|部署在线文件管理器 Spacedrive

828华为云征文|部署在线文件管理器 Spacedrive 一、Flexus云服务器X实例介绍1.1 云服务器介绍1.2 产品优势1.3 计费模式 二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 Spacedrive3.1 Spacedrive 介绍3.2 Docker 环境搭建3.3 Spac…

《信息系统安全》课程实验指导

第1关:实验一:古典密码算法---代换技术 任务描述 本关任务:了解古典密码体制技术中的代换技术,并编程实现代换密码的加解密功能。 注意所有明文字符为26个小写字母,也就是说字母表为26个小写字母。 相关知识 为了完…

基于PHP的丽江旅游管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的丽江旅游管理系统 一 介绍 此丽江旅游系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…

CKF的改进思路,SVDCKF,LSTMCKF,BPCKF,SVMCKF,自适应抗差CKF

CKF的基于介绍 CKF算法全称为容积卡尔曼滤波(Cubature Kalman Filter),是一种非线性滤波算法,由加拿大学者Arasaratnam和Haykin在2009年首次提出。CKF算法基于三阶球面径向容积准则,并使用一组容积点来逼近具有附加高斯噪声的非线性系统的状态均值和协方差,旨在实现非线…

Python编码系列—Python工厂方法模式:构建灵活对象的秘诀

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

element-plus组件问题汇总

element-plus组件问题汇总 一、el-select 1. 下拉选项实现添加全部 问题描述:value为空时,select框中不显示全部选项,但是下拉列表中全部显示是勾选状态 图片: 解决办法:添加 :empty-values“[null, undefined]” …

为啥数组指针指向一个数组时需要使用符号

int (*p)[10]; int a[10]; for (int i0;i<10;i) { a[i]i; } p &a; 在这个代码片段中&#xff0c;p 被声明为指向包含 10 个整数的数组的指针&#xff1a; 而 a 是一个包含 10 个整数的数组&#xff1a; &a 表示数组 a 的地址&#xff0c;且类型是 int (*)[10]&a…

专业学习|系统动力学概观(方法特色、构成要素、建模步骤)

一、系统动力学概览 &#xff08;一&#xff09;系统动力学介绍 系统动力学是一门综合交叉学科&#xff0c;其基础理论涵盖了控制论、信息论和决策论等多个领域。它利用计算机仿真技术对复杂系统进行定量研究&#xff0c;尤其是那些具有非线性、高阶次和多重反馈特征的系统。这…

docker构建镜像环境搭建深度学习开发环境

我想经常需要装环境的同学应该很烦&#xff0c;可能因为你的不小心&#xff0c;导致系统崩溃等等问题&#xff0c;或者环境需要装另一个版本的cuda&#xff0c;但是目前换可能不是很方便。这些我都遇到过&#xff0c;那么docker可以满足你的一切需求&#xff0c;你可以安装不同…

SpringBoot Web开发中的Thymeleaf模版引擎

在Spring Boot的Web开发中&#xff0c;模板引擎是处理视图层的重要组件之一。在众多模板引擎中&#xff0c;Thymeleaf以其优雅的自然模板设计和对HTML的良好支持&#xff0c;成为了Spring Boot官方推荐的模板引擎。本文将详细介绍如何在Spring Boot项目中使用Thymeleaf模板引擎…

VirtualBox增加磁盘并给docker用

在VirtualBox新增磁盘 在虚拟机停止的情况下依次选择&#xff0c;然后创建新磁盘 虚拟机新磁盘创建分区、格式化、挂载分区 开机自动挂载新磁盘分区/dev/sdb1&#xff1a; nano /etc/fstab末尾添加一行&#xff1a; /dev/sdb1 /disk02 e…

[Python学习日记-23] Python v2 和 v3 中的字符编码

[Python学习日记-23] Python v2 和 v3 中的字符编码 简介 Python2 vs Python3 的编码 总结 简介 在Python 中的字符编码&#xff08;上&#xff09;和Python 中的字符编码&#xff08;下&#xff09;中学习了字符编码的理论知识那么就&#xff0c;我们把目光回到 Python 当…

【深度学习】(2)--PyTorch框架认识

文章目录 PyTorch框架认识1. Tensor张量定义与特性创建方式 2. 下载数据集下载测试展现下载内容 3. 创建DataLoader&#xff08;数据加载器&#xff09;4. 选择处理器5. 神经网络模型构建模型 6. 训练数据训练集数据测试集数据 7. 提高模型学习率 总结 PyTorch框架认识 PyTorc…

canvas和svg的区别是什么?它们的应用场景是什么?

区别 绘图方式&#xff1a; Canvas 使用JavaScript API在画布上绘制像素来创建图形&#xff0c;提供了对像素级别的控制&#xff0c;可以实现复杂的图形和动画效果1。SVG 使用XML语法描述图形&#xff0c;是一种基于矢量路径的矢量图形格式&#xff0c;可以无损缩放而不失真1。…

【C++算法】模拟算法

替换所有的问号 题目链接 替换所有的问号https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/description/ 算法原理 代码步骤 class Solution { public:string modifyString(string s) {int n s.size();for(int i 0; i < n; i){…

经典sql题(六)查找用户每月累积访问次数

使用聚合开窗查找用户每月累积访问次数&#xff0c;首先介绍一下使用 GROUP BY和开窗的区别 GROUP BY 行数变化&#xff1a;使用 GROUP BY 后&#xff0c;原始数据会按指定列进行分组&#xff0c;结果中每组只保留一行&#xff0c;因此行数通常减少。作用&#xff1a;适用于需…