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

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质

丢字的本质是在一段音频中一小段数据变为0

丢字对主观感受的影响

1. 丢字位置

丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分,感知可能不明显;而如果丢字发生在高能量部分或关键音素上,感知会非常明显。

2. 丢字持续时间

虽然10ms的丢字时间相对较短,但如果丢字发生在关键音素或瞬态(如爆破音、元音等)上,感知会更加明显。

3. 音频内容

不同类型的音频内容对丢字的敏感度不同。例如,语音信号中的丢字可能比音乐信号中的丢字更容易被感知,因为语音信号中有更多的瞬态和关键音素。

4. 人耳的感知能力

人耳对不同频率和时间的变化有不同的敏感度。某些频率范围内的丢字可能更容易被感知,而其他频率范围内的丢字可能不明显。

丢字位置和丢字持续时间的影响

判断丢字的位置在高能量和低能量位置以及丢字时间对pesq分数的影响

选取一段音频,随机在其高能量和低能量位置丢字,丢字时间分别设置为

[0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]

单位为s,生成所有丢字的音频,再对丢字音频进行pesq评分,画成折线图输出

脚本代码如下:

import numpy as np
from scipy.io import wavfile
from pesq import pesq
from pesq import PesqError
import librosa
import matplotlib.pyplot as pltdef create_single_drop_audio(data, drop_start, drop_duration, sample_rate):"""在音频信号中指定位置,并将该位置的一小段音频数据设置为零"""num_samples = len(data)drop_samples = int(drop_duration * sample_rate)drop_end = drop_start + drop_samplesprint(drop_start,drop_duration)# 创建丢字音频dropped_data = np.copy(data)dropped_data[drop_start:drop_end] = 0return dropped_data# 读取原始音频文件并转换采样率
original_file = 'audio_file.wav'
target_sample_rate = 16000  # 选择8000或16000# 使用librosa加载音频文件并转换采样率
original_data, original_sample_rate = librosa.load(original_file, sr=target_sample_rate)# 计算音频信号的能量分布
energy = np.abs(original_data)**2
window_size = int(0.01 * original_sample_rate)  # 10ms窗口
energy = np.convolve(energy, np.ones(window_size), 'same')# 随机选择一个低能量位置进行丢字
low_energy_indices = np.where(energy < np.percentile(energy, 20))[0]  # 选择能量最低的20%
high_energy_indices = np.where(energy > np.percentile(energy, 80))[0]  # 选择能量最高的20%# 定义不同的drop_duration值
drop_durations = [0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1]# 存储PESQ分数
pesq_scores_low_energy = []
pesq_scores_high_energy = []# 计算原始音频的PESQ分数(与自身比较)
try:original_pesq_score = pesq(original_sample_rate, original_data, original_data, 'wb')print(f'Original Audio PESQ Score: {original_pesq_score:.2f}')
except PesqError as e:print(f'Error calculating PESQ for original audio: {e}')original_pesq_score = None# 对低能量部分进行丢字
drop_start = np.random.choice(low_energy_indices)
for drop_duration in drop_durations:dropped_data = create_single_drop_audio(original_data, drop_start, drop_duration, sample_rate=original_sample_rate)# 保存丢字音频output_file = f'low_energy_dropped_audio_{int(drop_duration*1000)}ms.wav'wavfile.write(output_file, original_sample_rate, (dropped_data * 32767).astype(np.int16))try:pesq_score = pesq(original_sample_rate, original_data, dropped_data, 'wb')pesq_scores_low_energy.append(pesq_score)print(f'Low Energy - Drop Duration: {drop_duration:.3f}s, PESQ Score: {pesq_score:.2f}')except PesqError as e:print(f'Error calculating PESQ for drop_duration {drop_duration} in low energy: {e}')pesq_scores_low_energy.append(None)# 对高能量部分进行丢字
drop_start = np.random.choice(high_energy_indices)
for drop_duration in drop_durations:dropped_data = create_single_drop_audio(original_data, drop_start, drop_duration, sample_rate=original_sample_rate)# 保存丢字音频output_file = f'high_energy_dropped_audio_{int(drop_duration*1000)}ms.wav'wavfile.write(output_file, original_sample_rate, (dropped_data * 32767).astype(np.int16))try:pesq_score = pesq(original_sample_rate, original_data, dropped_data, 'wb')pesq_scores_high_energy.append(pesq_score)print(f'High Energy - Drop Duration: {drop_duration:.3f}s, PESQ Score: {pesq_score:.2f}')except PesqError as e:print(f'Error calculating PESQ for drop_duration {drop_duration} in high energy: {e}')pesq_scores_high_energy.append(None)# 绘制折线图
plt.figure(figsize=(12, 8))
plt.plot([0] + drop_durations, [original_pesq_score] + pesq_scores_low_energy, marker='o', linestyle='-', color='b', label='Low Energy PESQ Score')
plt.plot([0] + drop_durations, [original_pesq_score] + pesq_scores_high_energy, marker='o', linestyle='-', color='r', label='High Energy PESQ Score')
plt.xlabel('Drop Duration (s)')
plt.ylabel('PESQ Score')
plt.title('PESQ Score vs Drop Duration (Low Energy vs High Energy)')
plt.grid(True)
plt.legend()
plt.show()

运行三次,随机选择不同的高能量和低能量部分,生成的折线图

从图表上看,高能部分丢字,只要出现1ms的丢字,mos下降的就很明显,mos下降0.2,主观听感上,就有一个明显的感知“bo”了一声。

但是低能量部分,出现丢字后,有时候mos下降了,有时候没有下降,10ms以内的丢字,mos基本不会下降,但是主观听感上,即使mos下降到3.8,也没有明显的感知

结论

pesq这种评分方式不能很好的评价音频丢字给主观带来的影响

相关文章:

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…...

音视频入门基础:MPEG2-TS专题(23)——通过FFprobe显示TS流每个packet的信息

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…...

Bert各种变体——RoBERTA/ALBERT/DistillBert

RoBERTa 会重复一个语句10次&#xff0c;然后每次都mask不同的15%token。丢弃了NSP任务&#xff0c;论文指出NSP任务有时甚至会损害性能。使用了BPE ALBERT 1. 跨层参数共享 可以共享多头注意力层的参数&#xff0c;或者前馈网络层的参数&#xff0c;或者全部共享。 实验结果…...

Go入门篇:(一)golang的安装和编辑工具安装

一、前言 最近我有幸接触到Go语言,深入了解后,发现go语言确实有很多让人惊叹的地方。作为一个有着多年Java编程经验的程序员,我深深地被它所吸引,并且决定记录下我的学习之路,以便与大家分享我的经验和感悟。 与Java不同,Go语言的语法和运行效率都非常高,特别是对于并…...

【技术实战】R语言统计分析与可视化从入门到精通

前言 随着大数据时代的到来&#xff0c;数据分析已经成为各行各业的重要技能。R语言作为一种强大的统计分析和数据可视化工具&#xff0c;广泛应用于科学研究、数据分析和商业决策支持。 本文将带领读者从入门到精通&#xff0c;掌握R语言在统计分析和数据可视化方面的核心技…...

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言&#xff0c;经常被用于游戏开发…...

LabVIEW实现LoRa通信

目录 1、LoRa通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

【数字化】华为数字化转型架构蓝图-2

目录 1、客户联结的架构思路 1.1 ROADS体验设计 1.2 具体应用场景 1.3 统一的数据底座 1.4 案例与成效 2、一线作战平台的架构思路 2.1 核心要素 2.2 关键功能 2.3 实施路径 2.4 案例与成效 3、能力数字化的架构思路 3.1 能力数字化的核心目标 3.2 能力数字化的实…...

【Agent】AutoGen Studio2.0开源框架-UI层环境安装+详细操作教程(从0到1带跑通智能体AutoGen Studio)

&#x1f4a5; 欢迎来到我的博客&#xff01;很高兴能在这里与您相遇&#xff01; 首页&#xff1a;GPT-千鑫 – 热爱AI、热爱Python的天选打工人&#xff0c;活到老学到老&#xff01;&#xff01;&#xff01;导航 - 人工智能系列&#xff1a;包含 OpenAI API Key教程, 50个…...

Linux 网络配置基础

文章目录 1. 前言2. Linux 的网络配置2.1 传统的网络配置方法2.2 新的网络配置方法2.3 用 DHCP 客户端管理网络 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. Linux 的网络配置 …...

科技创新 数智未来|清科·沙丘投研院走进竹云

12月20日&#xff0c;清科沙丘投研院带领企投家团队走进竹云交流分享&#xff0c;聚焦技术创新、企业数字化管理、行业前沿应用案例等热点议题&#xff0c;深入探讨数字技术如何点燃企业高质量发展的澎湃动力&#xff0c;共话企业数字化、智能化发展之道。 达晨财智股权管理部…...

Java 常见面试算法题汇总与解析

Java 常见面试算法题汇总与解析 算法题是程序员面试中常见的一部分&#xff0c;也是提升编程能力的核心手段。本文将汇总一些 Java 中常见的算法题&#xff0c;并提供详细的解析和实现代码&#xff0c;帮助开发者更好地理解和掌握算法。 一、字符串相关算法 1.1 字符串反转 …...

【社区投稿】自动特征auto trait的扩散规则

自动特征auto trait的扩散规则 公式化地概括&#xff0c;auto trait marker trait derived trait。其中&#xff0c;等号右侧的marker与derived是在Rustonomicon书中的引入的概念&#xff0c;鲜见于Rust References。所以&#xff0c;若略感生僻&#xff0c;不奇怪。 marker …...

云原生相关的 Go 语言工程师技术路线(含博客网址导航)

要成为一名云原生相关的 Go 语言工程师&#xff0c;需要在 Go 语言、云原生技术栈以及相关的开发和运维工具上建立扎实的基础。下面是一个前字节员工总结的技术路线规划&#xff1a; 1. 掌握 Go 语言基础 深入理解 Go 语言&#xff1a;你需要熟练掌握 Go 的语法、数据结构、并…...

mui框架开发的手机APP——众筹约课类【只有前端,无后端】

点击获取源码...

Python的内存管理

文章目录 1. **内存管理的基本原理**&#xff08;1&#xff09;动态内存分配&#xff08;2&#xff09;引用计数机制 2. **垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制**&#xff08;1&#xff09;循环引用问题&#xff08;2&#xff09;垃圾回收器的作用 3. …...

VSCode调试

目录 C/C远程本地调试插件配置参考 C/C远程本地调试 测试源码&#xff1a;https://github.com/jrhee17/ssl-study 插件 Remote - SSH C/C 配置 .vscode/launch.json {"version": "0.2.0","configurations": [{"name": "afte…...

Direct Preference Optimization (DPO) 简介与流程解析:中英双语

Direct Preference Optimization (DPO) 简介与流程解析 Direct Preference Optimization (DPO) 是一种基于人类偏好的强化学习优化方法&#xff0c;用于训练语言模型&#xff0c;使其更好地满足用户需求或偏好。本文将详细介绍 DPO 的核心思想、优化流程&#xff0c;并结合代码…...

fisco-bcos手动搭建webase启动注意事项

手动搭建webase-front启动注意事项 Java环境变量&#xff1a;1.8.301时候的错误 一直提示节点连接不上&#xff0c;无法连接chanale端口 这是官方提供的解决办法Help wanted: solution for secp256k1 being disabled Issue #470 FISCO-BCOS/java-sdk Java SDK 2.x连接节点失败…...

ospf 的 状态机详解

OSPF&#xff08;开放最短路径优先&#xff0c;Open Shortest Path First&#xff09;协议的状态机是其核心部分之一&#xff0c;用于确保路由器之间的邻接关系&#xff08;neighbor relationship&#xff09;建立和路由信息的交换。OSPF的状态机模型由多个状态组成&#xff0c…...

告别第三方平台!手把手教你用photo-sphere-viewer在小程序H5里嵌入VR全景图

告别第三方平台&#xff01;手把手教你用photo-sphere-viewer在小程序H5里嵌入VR全景图 在数字化营销日益重要的今天&#xff0c;VR全景展示已经成为房地产、家居、旅游等行业提升用户体验的标配功能。传统做法是依赖第三方VR云服务平台&#xff0c;但这往往意味着高昂的费用、…...

RemotelyAnywhere远程桌面无法使用鼠标操作

问题描述RemotelyAnywhere远程桌面无法使用鼠标操作&#xff0c;点击一下就刷新页面&#xff0c;无法输入密码解决方案1、使用360浏览器打开页面2、使用兼容模式3、启用系统的TLS 1.2支持 (解决核心矛盾)这是最关键的一步&#xff0c;用来强制让电脑支持相对较新的TLS 1.2协议&…...

**发散创新:基于同态加密的隐私保护计算在Python中的实战实现**随

发散创新&#xff1a;基于同态加密的隐私保护计算在Python中的实战实现 随着数据安全需求的不断升级&#xff0c;同态加密&#xff08;Homomorphic Encryption&#xff09; 正从理论走向落地。它允许对加密数据直接进行计算&#xff0c;结果解密后与明文计算一致——这为云计算…...

游戏盾导致 Unity/UE 引擎崩溃?内存占用、SO 库冲突深度排查

接入游戏盾后碰到 Unity、UE 编辑器或打包后崩溃、内存暴涨、SO 库冲突的问题&#xff0c;应该都不陌生。我最近在几个项目里反复踩过这些坑&#xff0c;从日志分析、内存追踪到 SO 符号冲突&#xff0c;一步步定位下来&#xff0c;把完整排查流程和解决方案整理出来&#xff0…...

CnOpenData 沪市IPO发行文件-B来源

IPO(Initial Public Offing)&#xff0c;即首次公开募股&#xff0c;是指一家企业(发行人)第一次将它的股份向公众出售。资本市场是现代金融体系的核心&#xff0c;是企业最高效的融资渠道和最强大的资本运作平台&#xff0c;IPO作为公司登陆资本市场的唯一路径&#xff0c;将使…...

类型擦除与部分异步编程: 消除差别,统一使用

1. std::function&#xff1a;可调用对象的“统一调用接口”std::function 是针对可调用对象的类型擦除工具&#xff0c;其底层实现核心是「抽象基类 模板子类」的多态模式&#xff0c;也是运行时类型擦除的典型应用&#xff1a;抽象基类&#xff1a;定义了与“函数签名”完全…...

Agent在财务场景有哪些核心应用?深度解析2026企业智能化转型路径

站在2026年的技术节点回望&#xff0c;财务部门早已从传统的“记账中心”转型为企业的“战略决策大脑”。AI Agent&#xff08;人工智能助手/智能体&#xff09;的爆发式应用&#xff0c;彻底终结了繁琐的表单时代。与2024年的实验性尝试不同&#xff0c;当下的财务Agent具备了…...

S-UI系统调用分析:与操作系统交互的底层实现

S-UI系统调用分析&#xff1a;与操作系统交互的底层实现 还在为网络代理管理系统的底层实现而困惑&#xff1f;本文将深入解析S-UI如何通过系统调用与操作系统深度交互&#xff0c;让你全面掌握这套高级Web面板的底层工作原理。 读完本文你将了解&#xff1a; S-UI如何处理系…...

Unity/Godot开发者看过来:手把手教你将Spine动画导出并集成到游戏引擎里(附常见报错解决)

Unity/Godot开发者实战指南&#xff1a;Spine动画工程化集成全流程解析 当你在Spine中完成了一个令人满意的角色动画后&#xff0c;接下来面临的真正挑战是如何让它活灵活现地跑在游戏引擎里。作为经历过无数次Spine动画集成的老手&#xff0c;我深知这个过程中可能遇到的种种…...

Qwen2.5-14B-Instruct开源模型落地:像素剧本圣殿短视频脚本批量生成

Qwen2.5-14B-Instruct开源模型落地&#xff1a;像素剧本圣殿短视频脚本批量生成 1. 项目概述 像素剧本圣殿&#xff08;Pixel Script Temple&#xff09;是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。它将顶尖的AI推理能力与8-Bit复古美学完美融合&#xff0c…...