python绘制多个wav文件的基频曲线图

news2024/11/16 22:00:57

任务描述

需要在一个图中绘制多个wav文件的基频图,具体一点,绘制三种不正常的基频曲线,和一种正常的基频曲线进行对比,并且将正常的基频曲线的范围画出。

代码

import pyworld as pw
import librosa
import numpy as np

def extract_f0(wav_file):
    # 读取 WAV 文件
    y, sr = librosa.load(wav_file, sr=16000)

    # 将音频数据类型转换为 double
    y = y.astype(np.float64)

    # 提取基频(F0)值
    # f0, timeaxis = pw.harvest(y, sr)

    pitch, t = pw.dio(
            y.astype(np.float64),
            sr,
            frame_period= 200 / sr * 1000,
        )
    f0 = pw.stonemask(y.astype(np.float64), pitch, t, sr)

    new_f0 = [i for i in f0 if i>0]

    return new_f0

wav = ''
data_dir = ''

# 提取三种不同程度的基频(F0)值
pitch_values_file1 = extract_f0(f'{data_dir}/*/*_{wav}.wav')
pitch_values_file2 = extract_f0(f'{data_dir}/*/*_{wav}.wav')
pitch_values_file3 = extract_f0(f'{data_dir}/*/*_{wav}.wav')

# 提取所有正常的基频值
pitch_values_normal_file1 = extract_f0(f'{data_dir}/*/*/*_{wav}.wav')
pitch_values_normal_file2 = extract_f0(f'{data_dir}/*/*/*_{wav}.wav')
pitch_values_normal_file3 = extract_f0(f'{data_dir}/*/*/*_{wav}.wav')
pitch_values_normal_file4 = extract_f0(f'{data_dir}/*/*/*_{wav}.wav')

# 找到最长的正常序列长度
max_length = max(len(pitch_values_normal_file1), len(pitch_values_normal_file2), len(pitch_values_normal_file3), len(pitch_values_normal_file4))

# 使用线性插值将所有正常序列调整为相同长度
sequence1_interp = np.interp(np.linspace(0, 1, max_length), np.linspace(0, 1, len(pitch_values_normal_file1)), pitch_values_normal_file1)
sequence2_interp = np.interp(np.linspace(0, 1, max_length), np.linspace(0, 1, len(pitch_values_normal_file2)), pitch_values_normal_file2)
sequence3_interp = np.interp(np.linspace(0, 1, max_length), np.linspace(0, 1, len(pitch_values_normal_file3)), pitch_values_normal_file3)
sequence4_interp = np.interp(np.linspace(0, 1, max_length), np.linspace(0, 1, len(pitch_values_normal_file4)), pitch_values_normal_file4)

# 计算平均值序列
average_sequence = np.mean([sequence1_interp, sequence2_interp, sequence3_interp, sequence4_interp], axis=0)

# 计算最大值序列
max_sequence = np.maximum.reduce([sequence1_interp, sequence2_interp, sequence3_interp, sequence4_interp])

# 计算最小值序列
min_sequence = np.minimum.reduce([sequence1_interp, sequence2_interp, sequence3_interp, sequence4_interp])



import matplotlib.pyplot as plt
from scipy.interpolate import interp1d


# 生成时间序列作为横轴
time = np.linspace(0, 1, max(len(pitch_values_file1), len(pitch_values_file2), len(pitch_values_file3), max_length))

# 使用线性插值将基频值列表插值为与时间序列相匹配的长度
f1 = interp1d(np.linspace(0, 1, len(pitch_values_file1)), pitch_values_file1, kind='linear')
f2 = interp1d(np.linspace(0, 1, len(pitch_values_file2)), pitch_values_file2, kind='linear')
f3 = interp1d(np.linspace(0, 1, len(pitch_values_file3)), pitch_values_file3, kind='linear')

# 画出正常的基频
ave = interp1d(np.linspace(0, 1, len(average_sequence)), average_sequence, kind='linear')
max = interp1d(np.linspace(0, 1, len(max_sequence)), max_sequence, kind='linear')
min = interp1d(np.linspace(0, 1, len(min_sequence)), min_sequence, kind='linear')


# 创建图表
plt.figure(figsize=(10, 6))  # 设置图表大小

# 绘制四个wav文件的基频值变化图
plt.plot(time, f1(time), marker='', color='blue', label='Low Intelligibility',markersize=1)
plt.plot(time, f2(time), marker='', color='purple', label='Middle Intelligibility',markersize=1)
plt.plot(time, f3(time), marker='', color='green', label='High Intelligibility',markersize=1)
plt.plot(time, ave(time), marker='', color='red', label='Normal Average',markersize=1, linewidth=3.5)


# 绘制最大值序列和最小值序列之间的区域
plt.fill_between(time, min(time), max(time), color='lightpink', label='Normal Range')

plt.xlabel('Time')  # 设置横轴标签
plt.ylabel('Pitch Value (Hz)')  # 设置纵轴标签
plt.title('Pitch Value Changes over Time')  # 设置图表标题
plt.grid(True)  # 显示网格线
plt.legend()  # 显示图例

# 保存图表为一个图像文件
plt.savefig(f'pitch_value_plot-v2-{wav}.png')

# 显示图表
plt.show()

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微调大模型(Finetuning Large Language Models)—Data_preparation(四)

1. 数据的质量 数据准备的步骤: 什么是tokenizing? 其实就是将文本数据转换为代表文本的数字,一般是基于字符出现的频率。需要注意的,编码和解码的tokenizer需保持一致,一般训练的模型有自己专属匹配的tokenizer。 …

实习结帖(flask加上AIGC实现设计符合OpenAPI要求的OpenAPI Schema,让AIGC运行时可以调用api,协助公司门后迁移新后端等)

终于,笔者的实习生活也要告一段落了,最后的几天都在忙着和公司做AIGC的项目,在搞api的设计以及公司门户网站的迁移。 牛马搬运工(牛马了3天) 先说这个门户网站的迁移,我原本以为只是换个后端(若…

新版本Android Studio如何新建Java code工程

新版本Android Studio主推Kotlin,很多同学以为无法新建Java工程了,其实是可以的,如果要新建Java代码的Android工程,在New Project的时候需要选择Empty Views Activity,如图所示,gradle也建议选为build.grad…

RP2040 C SDK GPIO和IRQ 唤醒功能使用

RP2040 C SDK GPIO和中断功能使用 SIO介绍 手册27页: The Single-cycle IO block (SIO) contains several peripherals that require low-latency, deterministic access from the processors. It is accessed via each processor’s IOPORT: this is an auxiliary…

MyBatis——Plus

MyBatis——Plus怎么知道他是访问哪张表

48 旋转图像

解题思路: \qquad 这道题同样需要用模拟解决,原地算法要求空间复杂度尽量小,最好为 O ( 1 ) O(1) O(1)。模拟的关键是找到旋转的内在规律,即旋转前后的位置坐标的变化规律。 \qquad 正方形矩阵类似洋葱,可以由不同大小…

计算机毕业设计 在线问诊系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

又一条地铁无人线开通!霞智科技智能清洁机器人正式“上岗”

2024年9月26日12时,又一条无人线开通运营,这是陕西省首条全自动无人驾驶地铁线路。该线路作为北跨战略的先行工程,是连接主城区与渭北地区的轨道交通快线,对优化城市总体空间布局、推动区域融合发展、促进沿线产业升级具有十分重要…

电脑上数据丢了怎么找回来 Win系统误删文件如何恢复

无论是在工作中,还是生活中,电脑都是不可缺少的重要工具,尤其是在工作中,电脑不仅可以高效的完成工作,还可以存储工作中的重要资料。不过在使用电脑的时候,也会遇到数据丢失的情况。针对这一问题&#xff0…

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码,限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改,抓取上传数据包,并且修改 Content-Type 3.服务端检测(目录路径检测) 对目…

在Java中使用GeoTools解析POI数据并存储到PostGIS实战

目录 前言 一、POI数据相关介绍 1、原始数据说明 2、空间数据库表设计 二、POI数据存储的设计与实现 1、对应的数据模型对象的设计 2、属性表数据和空间信息的读取 3、实际运行结果 三、总结 前言 POI点,全称为Point of Interest(兴趣点&#xf…

大数据技术:Hadoop、Spark与Flink的框架演进

大数据技术,特别是Hadoop、Spark与Flink的框架演进,是过去二十年中信息技术领域最引人注目的发展之一。这些技术不仅改变了数据处理的方式,而且还推动了对数据驱动决策和智能化的需求。在大数据处理领域,选择合适的大数据平台是确…

git 清除二进制文件的 changes 状态

问题:某个分支上修改了二进制文件,导致 changes 一直存在,切换到主分支也仍然存在,点击 Discard 也没用 使用 git reset --hard 还原到初始状态,也不行,不过输出结果会给出错误信息 Encountered 7 file(s) …

raise Exception(“IPAdapter model not found.“)

IPAdapter模型文件太多了,而节点IPAdapter Unified Loader是通过函数(get_ipadapter_file与get_clipvision_file)预设来加载模型文件,当发生错误“IPAdapter model not found.“时并不指明模型文件名,导致想要有针对性…

C语言 | Leetcode C语言题解之第438题找到字符串中所有字母异位词

题目: 题解: /*** Note: The returned array must be malloced, assume caller calls free().*/ /* *int strCmpn:比较滑动窗口和字符串的相同值 char * s:字符串s,滑动窗口的位置 char * p:字符串p&#…

【Python】Flask-Admin:构建强大、灵活的后台管理界面

在 Web 应用开发中,构建一个直观且功能丰富的后台管理系统对于处理数据和维护应用至关重要。虽然构建一个完全自定义的管理后台界面非常耗时,但 Flask-Admin 提供了一个简洁、灵活的解决方案,可以让开发者快速集成一个功能齐全的后台管理系统…

【移植】轻量系统STM32F407芯片移植案例

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 介绍基于 STM32F407IGT6 芯片在拓维信息 Niobe407 开发板上移植 Op…

Linux操作系统中MongoDB

1、什么是MongoDB 1、非关系型数据库 NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问…

改变安全策略的五大实践

随着网络威胁形势的加剧,网络安全计划必须不断发展以保护组织的使命。 为了管理这种持续的网络安全发展,应遵循五项关键的安全计划变更管理实践: 1. 识别并吸引受安全风险影响的业务利益相关者 随着新的网络安全风险被发现,受影…

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13

HEITRONICS TC13红外辐射高温计CT13 INFRARED RADIATION PYROMETER CT13