python 音频处理(1)——重采样、音高提取

news/2025/1/20 3:46:30/文章来源:https://www.cnblogs.com/io-T-T/p/18336825

采集数据->采样率调整

  1. 使用torchaudio进行重采样(cpu版)
    • 首先导入相关包,既然使用torch作为我们的选项,安装torch环境我就不必多说了,如果你不想用torch可以使用后文提到的另一个库

      1 import torch
      2 import torchaudio
      3 from torchaudio.transforms import Resample
      4 from time import time#仅计算时间,不影响主体
    • 使用torchaudio.load导入音频文件

    • 设定目标采样率并构造resample函数

    • 调用构造好的resample函数

    • 调用torchaudio的保存函数

    封装一下,总函数【记得先导入】:

     1 def resample_by_cpu():
     2     file_path = input("please input your file path: ")
     3     start_time = time()#不影响,可去掉
     4     y, sr = torchaudio.load(file_path)  #使用torchaudio.load导入音频文件
     5  6     target_sample = 32000   #设定目标采样率
     7     resampler = Resample(orig_freq=sr, new_freq=target_sample)#构造resample函数,输入原始采样率和目标采样率
     8     resample_misic = resampler(y)                             #调用resample函数
     9 10     torchaudio.save("test.mp3", resample_misic, target_sample)#调用torchaudio的保存即可
    11     print(f"cost :{time() - start_time}s")#不影响,可去掉

    最后结果大概是几秒钟这样子

    1. 使用使用torchaudio进行重采样(gpu版):

      有了上面cpu的基础,其实调用gpu也就更换一下设备,和放入gpu的操作就好了,因此不过多赘述

      def resample_use_cuda():
      ​device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')start_time = time()file_path = input("please input your file path:")y, sr = torchaudio.load(file_path)
      ​y = y.to(device)target_sample = 32000resampler = Resample(orig_freq=sr, new_freq=target_sample).to(device)resample_misic = resampler(y)torchaudio.save("test.mp3", resample_misic.to('cpu'), target_sample)    #这里注意要把结果从gpu中拿出来到cpu,不然会报错。print(f"cost :{time() - start_time}s")

      时间方面嘛,单个音频多了放入gpu取出gpu的步骤肯定会稍慢的,但是跑过cuda都知道它的强大,更多是用于后续的操作说是。

    2. 使用librosa库进行重采样

      具体步骤:

      • 导入两个库文件,librosa和音频文件读写库soundfile

        import librosa
        import soundfile as sf
        from time import time#仅计算时间,不影响主体
      • 导入音频文件

      • 设定目标采样率

      • 重采样

      • 输出

      综合封装成函数:

      1 def resample_by_lisa():
      2     file_path = input("please input your file path:")
      3     start_time = time()
      4     y, sr = librosa.load(file_path)     #使用librosa导入音频文件
      5     target_sample_rate = 32000
      6     y_32k = librosa.resample(y=y, orig_sr=sr, target_sr=target_sample_rate)         #使用librosa进行重采样至目标采样率
      7     sf.write("test_lisa.mp3", data=y_32k, samplerate=target_sample_rate)        #使用soundfile进行文件写入
      8     print(f"cost :{time() - start_time}s")

      总结:

      • 优点,简单小巧,ibrosa有很多能处理音频的功能

      • 缺点:无法调用cuda,保存的时候需要依赖soundfile库。

      • 时间:也是几秒左右,和torchaudiocpu版差不多

      • 小声bb:提取32k的效果好像没有torchaudio好【嘛,毕竟librosa历史有点久了,没有专注深度学习的torch好很正常啦】,你们也可以自己测一下

    all code:

     1 import torch
     2 import torchaudio
     3 from torchaudio.transforms import Resample
     4 import librosa
     5 import soundfile as sf
     6 from time import time
     7  8 def resample_by_cpu():
     9     file_path = input("please input your file path: ")
    10     start_time = time()
    11     y, sr = torchaudio.load(file_path)  #使用torchaudio.load导入音频文件
    12 13     target_sample = 32000   #设定目标采样率
    14     resampler = Resample(orig_freq=sr, new_freq=target_sample)#构造resample函数,输入原始采样率和目标采样率
    15     resample_misic = resampler(y)                             #调用resample函数
    16 17     torchaudio.save("test.mp3", resample_misic, target_sample)#调用torchaudio的保存即可
    18     print(f"cost :{time() - start_time}s")
    19 def resample_use_cuda():
    20 21     device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    22     start_time = time()
    23     file_path = input("please input your file path:")
    24     y, sr = torchaudio.load(file_path)
    25 26     y = y.to(device)
    27     target_sample = 32000
    28     resampler = Resample(orig_freq=sr, new_freq=target_sample).to(device)
    29     resample_misic = resampler(y)
    30     torchaudio.save("test.mp3", resample_misic.to('cpu'), target_sample)
    31     print(f"cost :{time() - start_time}s")
    32 33 def resample_by_lisa():
    34     file_path = input("please input your file path:")
    35     start_time = time()
    36     y, sr = librosa.load(file_path)#使用librosa导入音频文件
    37     target_sample_rate = 32000
    38     y_32k = librosa.resample(y=y, orig_sr=sr, target_sr=target_sample_rate)#使用librosa进行重采样至目标采样率
    39     sf.write("test_lisa.mp3", data=y_32k, samplerate=target_sample_rate)#使用soundfile进行文件写入
    40     print(f"cost :{time() - start_time}s")
    41 42 if __name__ == '__main__':
    43     resample_use_cuda()
    44     resample_by_cpu()
    45     resample_by_lisa()

2.2 提取pitch基频特征【音高提取】

  1. 使用torchaudio进行基频特征提取

    其实主要使用的这个函数:torchaudio.transforms._transforms.PitchShift

    让我们来看看它官方的example,仿照着来写就好啦

    >>> waveform, sample_rate = torchaudio.load("test.wav", normalize=True)
    >>> transform = transforms.PitchShift(sample_rate, 4)
    >>> waveform_shift = transform(waveform)  # (channel, time)

    步骤:

    • 导入依赖

      import torchaudio
      import torchaudio.transforms as Tf
      import matplotlib.pyplot as plt     #画图依赖
    • 导入音频

    • 构造PitchShift

    • 使用这个函数对歌曲进行基频提取

    code:

    def get_pitch_by_torch():file_path = input("file path:")y, sr = torchaudio.load(file_path)"""specimen:>>> waveform, sample_rate = torchaudio.load("test.wav", normalize=True)>>> transform = transforms.PitchShift(sample_rate, 4)>>> waveform_shift = transform(waveform)  # (channel, time)"""pitch_tf = Tf.PitchShift(sample_rate=sr, n_steps=0)feature = pitch_tf(y)# 绘制基频特征 这部分可以忽略,只是画图而已,可以直接复制不用理解plt.figure(figsize=(16, 5))plt.plot(feature[0].numpy(), label='Pitch')plt.xlabel('Frame')plt.ylabel('Frequency (Hz)')plt.title('Pitch Estimation')plt.legend()plt.show()

    输出图片【总歌曲】效果:

    image-20240801144650461

    将输出的范围稍微改一下,切分特征的一部分,就是歌曲部分的音高特征啦,效果就很明显了

    改为:plt.plot(feature[0][5000:10000].numpy(), label='Pitch')

    image-20240801145201858

  2. 使用librosa提取基频特征
    • 步骤:

      • 导入包

      • 提取基频特征

      • (可选)绘制基频特征

    • 主要函数:librosa.pyin,请见官方example

    #Computing a fundamental frequency (F0) curve from an audio input
    >>> y, sr = librosa.load(librosa.ex('trumpet'))
    >>> f0, voiced_flag, voiced_probs = librosa.pyin(y,
    ...                                              sr=sr,
    ...                                              fmin=librosa.note_to_hz('C2'),
    ...                                              fmax=librosa.note_to_hz('C7'))
    >>> times = librosa.times_like(f0, sr=sr)

    code:

     1 def get_pitch_by_librosa():
     2  3     file_path = input("请输入音频文件路径:")
     4     y, sr = librosa.load(file_path)
     5     """librosa.pyin(y,sr=sr,fmin=librosa.note_to_hz('C2'),fmax=librosa.note_to_hz('C7'))"""
     6     # 使用pyin提取基频特征
     7     f0, voiced_flag, voiced_probs = librosa.pyin(y, sr=sr, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7'))
     8  9     # 绘制基频特征,可忽略
    10     plt.figure(figsize=(14, 5))
    11     librosa.display.waveshow(y, sr=sr, alpha=0.5)
    12     plt.plot(librosa.times_like(f0), f0, label='f0 (fundamental frequency)', color='r')
    13     plt.xlabel('Time (s)')
    14     plt.ylabel('Frequency (Hz)')
    15     plt.title('Pitch (fundamental frequency) Estimation')
    16     plt.legend()
    17     plt.show()
    • 总结:

      • 比torchaudio略微麻烦一点,不过多了两个参数 voiced_flag, voiced_probs,看起来的视觉图好像也有些不一样,不过都是按照官方的这个来了,这也不对的话我也不会了

    • 输出:

      image-20240801151606191

  3. all code:
    import torchaudio
    import torchaudio.transforms as Tf
    import matplotlib.pyplot as plt
    import librosa
    def get_pitch_by_torch():file_path = input("file path:")y, sr = torchaudio.load(file_path)"""specimen:>>> waveform, sample_rate = torchaudio.load("test.wav", normalize=True)>>> transform = transforms.PitchShift(sample_rate, 4)>>> waveform_shift = transform(waveform)  # (channel, time)"""pitch_tf = Tf.PitchShift(sample_rate=sr, n_steps=0)feature = pitch_tf(y)# 绘制基频特征plt.figure(figsize=(16, 5))plt.plot(feature[0][5000:10000].numpy(), label='Pitch')plt.xlabel('Frame')plt.ylabel('Frequency (Hz)')plt.title('Pitch Estimation')plt.legend()plt.show()
    def get_pitch_by_librosa():
    ​file_path = input("请输入音频文件路径:")y, sr = librosa.load(file_path)"""librosa.pyin(y,sr=sr,fmin=librosa.note_to_hz('C2'),fmax=librosa.note_to_hz('C7'))"""# 使用pyin提取基频特征f0, voiced_flag, voiced_probs = librosa.pyin(y, sr=sr, fmin=librosa.note_to_hz('C2'), fmax=librosa.note_to_hz('C7'))
    ​# 绘制基频特征,可忽略plt.figure(figsize=(14, 5))librosa.display.waveshow(y, sr=sr, alpha=0.5)plt.plot(librosa.times_like(f0), f0, label='f0 (fundamental frequency)', color='r')plt.xlabel('Time (s)')plt.ylabel('Frequency (Hz)')plt.title('Pitch (fundamental frequency) Estimation')plt.legend()plt.show()
    if __name__ == '__main__':# get_pitch_by_torch()# get_pitch_by_librosa()

    后续PPG特征、vec特征见下一章

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信呼OA2.6.3文件上传漏洞

感觉过程还是蛮简单的,主要思路没有见过。 危险函数createtxt()侵权声明 本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。 如果您是版权持有人,并且认…

一次动态接口替换经历

接口改造 背景 现有旧订单接口 orderDetail,该接口会返回全量节点,部分节点不会使用因此造成了冗余,给数据库造成了较大压力,因此改造新接口 basicOrderDetail(xxx) 支持传入需要赋值的节点,方便赋值。 有如下改造方案:现有多个其他部分接口调用当前 orderDetail 接口获取…

智算引领,数耀鹭岛!天翼云与厦门电信共筑智算时代新底座!

在数字化浪潮的推动下,算力已成为推动社会进步的重要力量。近日,由厦门市数据管理局指导,天翼云科技有限公司、中国电信有限公司厦门分公司(以下简称“厦门电信”)主办的“智算引领 数耀鹭岛”——厦门智算中心(电信中心)发布会暨算力补贴政策宣贯会在福建厦门成功举办。…

行业标准引领者!天翼云助推智算领域规范化发展!

7月24日,2024可信云大会召开期间,智算云服务论坛上,天翼云荣获中国信通院颁发的“智算工程平台能力要求标准参编证书”,代表了业界对天翼云在推动行业标准制定中所作贡献及成果的重要肯定,以及对天翼云技术创新水平的高度认可。会上,天翼云科技有限公司智算产品线资深技术…

07HTML+CSS

标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 浮动(了解) 作用:让块元素水平排列。 属性名:float 属性值 • left:左对齐 • right:右对齐 特点: • 浮动后的盒子顶对齐 • 浮动后的盒子具备行内块特…

推荐一款好用的刷题工具

为了帮助正在准备求职季的开发者提升备战效率,阿里云特别推出“通义灵码陪你备战求职季”活动,精心挑选百道历史校招技术面试/笔试题,借助通义灵码智能问答、代码智能生成、代码优化等核心功能,帮助开发者更加准确地了解程序员职业所需的核心技能,加强对问题解决思维和解题…

win10 in arm

记得流水账了,非技术控跳过即可。 10年前,早在win10刚出的那些天,就浏览到有支持arm架构的信息,只是未见缘来打怪,磨蹭到微软快要取消支持的了,方哦,哦,哦... 老板的华为平板cpu是枭龙850+8g内存,64位家庭版。平板上旧系统中了comup.dll的毒,一阵删杀后把系统给搞崩了…

Getty 携手英伟达升级商业文生图 AI 模型;苹果新专利探索「心跳」解锁 iPhone 丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

《DNK210使用指南 -CanMV版 V1.0》第十六章 machine模块实验

第十六章 machine模块实验 1)实验平台:正点原子DNK210开发板 2)章节摘自【正点原子】DNK210使用指南 - CanMV版 V1.0 3)购买链接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/A…

使用Scanner类处理用户输入时,当捕获到异常后,需要适当的清理输入流,以确保程序可以正确继续执行

问题描述 代码示例 public class Example {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true){System.out.print("正常输入一个数字: ");int anInt = scanner.nextInt();//正常输入try {//错误输入的字符System.out.p…

在处理用户输入时,当捕获到异常后,需要适当的清理输入流,以确保程序可以正确继续执行

问题描述 代码示例 public class Example {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (true){System.out.print("正常输入一个数字: ");int anInt = scanner.nextInt();//正常输入try {//错误输入的字符System.out.p…

Ubuntu20.04.2安装Cockpit通过web管理系统

Cockpit是一个简单易用的Web界面,让用户可以通过浏览器管理Linux服务器,支持系统监控、存储管理、网络配置和日志查看等,适合初学者和希望简化管理流程的系统管理员。目录什么是Cockpit安装启用&设为自动启动Wiki 什么是Cockpit Cockpit是一个简单易用的Web界面,让用户…