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

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 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的调度逻辑:

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024全球数字电影摄像机、相机、广播摄像机市场报告
  • 两个网站访问统计系统的访客页面访问轨迹停留对比
  • 揭开OpenAI草莓模型神秘面纱——重塑大语言模型的逻辑能力
  • 专注LabVIEW 做好一件事
  • 数据填充-随机森林填充
  • 算法学习路线总结:算法工程师的修炼手册
  • “左侧文字横向”的QTabWidget
  • MyBatis-Plus分页查询、分组查询
  • 区块链Dapp开发:质押挖矿的各模式开发详解
  • 自选择问题和处理效应模型
  • 【Linux修行路】信号的产生
  • 性能测试的复习3-jmeter的断言、参数化、提取器
  • Apache Pulsar 与 Kafka Streams
  • Java后端开发(十六)-- JavaBean对象拷贝工具类:运用反射机制,实现对象的深拷贝
  • 速盾:cdn海外加速服务是什么?
  • hexo+github搭建个人博客
  • @jsonView过滤属性
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Angular6错误 Service: No provider for Renderer2
  • ES6 学习笔记(一)let,const和解构赋值
  • jquery ajax学习笔记
  • mysql 5.6 原生Online DDL解析
  • socket.io+express实现聊天室的思考(三)
  • Spring Cloud Feign的两种使用姿势
  • Vue--数据传输
  • webpack入门学习手记(二)
  • 翻译:Hystrix - How To Use
  • 少走弯路,给Java 1~5 年程序员的建议
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • $ git push -u origin master 推送到远程库出错
  • (6)设计一个TimeMap
  • (js)循环条件满足时终止循环
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (笔试题)分解质因式
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (一)Docker基本介绍
  • .net core docker部署教程和细节问题
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core和.Net Standard直观理解
  • .net FrameWork简介,数组,枚举
  • .Net Memory Profiler的使用举例
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET4.0并行计算技术基础(1)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Transient注解
  • @vue/cli脚手架
  • [ C++ ] 类和对象( 下 )
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备
  • [C/C++入门][字符与ASCII码]6、用代码来转换字符与它的ASCII码