声音音频文件波谱可视化展示

news2024/10/7 14:28:06

在这里插入图片描述

1、简单图形展示

import matplotlib.pyplot as plt
import numpy as np
import torch
import torchaudio

def plot_waveform(waveform, sample_rate, title="Waveform", xlim=None, ylim=None):
    waveform = waveform.numpy()
    num_channels, num_frames = waveform.shape
    time_axis = torch.arange(0, num_frames) / sample_rate

    figure, axes = plt.subplots(num_channels, 1, figsize=(15, 5))
    if num_channels == 1:
        axes = [axes]
    for c in range(num_channels):
        axes[c].plot(time_axis, waveform[c], linewidth=1)
        axes[c].grid(True)
        if num_channels > 1:
            axes[c].set_ylabel(f'Channel {c+1}')
        if xlim:
            axes[c].set_xlim(xlim)
        if ylim:
            axes[c].set_ylim(ylim)
    figure.suptitle(title)
    plt.xlabel('Time [s]')
    plt.show()

# 示例音频文件路径
audio_path = r"E:\allchat\output_16000_mono_0.wav"

# 加载音频文件
waveform, sample_rate = torchaudio.load(audio_path)

# 绘制波形图
plot_waveform(waveform, sample_rate)

在这里插入图片描述

2、更美观可视化

import numpy as np
import matplotlib.pyplot as plt
import torch
from PIL import Image

def create_spectrogram(audio, sr=48000, n_fft=1024, hop=512, vmin=-100, vmax=0):
    # 确保音频是 torch.Tensor 类型
    audio = torch.as_tensor(audio)
    
    # 应用短时傅里叶变换(STFT)
    window = torch.hann_window(n_fft)
    spec = torch.stft(audio, n_fft, hop, window=window, return_complex=True)
    
    # 计算幅度谱并转换为分贝刻度
    spec = spec.abs().clamp_min(1e-12).log10().mul(10)
    
    # 如果是多声道,取平均
    if spec.dim() > 2:
        spec = spec.mean(0)
    
    # 将谱图转换为numpy数组
    spec_np = spec.cpu().numpy()
    
    # 计算时间和频率轴
    t = np.arange(0, spec_np.shape[1]) * hop / sr
    f = np.arange(0, spec_np.shape[0]) * sr / 2 / (n_fft // 2) / 1000

    # 创建图形
    fig, ax = plt.subplots(figsize=(15, 5))
    
    # 绘制谱图
    im = ax.pcolormesh(t, f, spec_np, shading='auto', vmin=vmin, vmax=vmax, cmap='inferno')
    
    # 设置标签
    ax.set_xlabel('Time [s]')
    ax.set_ylabel('Frequency [kHz]')
    ax.set_title('Spectrogram')
    
    # 添加颜色条
    plt.colorbar(im, ax=ax, format='%+2.0f dB')
    
    # 调整布局
    plt.tight_layout()
    
    # 将图形转换为PIL图像
    fig.canvas.draw()
    img = Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb())
    
    # 关闭matplotlib图形以释放内存
    plt.close(fig)
    
    return img


# 读取 WAV 文件
sr, audio = wavfile.read(r"E:\allchat\output_16000_mono_0.wav")

# 如果音频是整数类型,将其转换为 -1.0 到 1.0 之间的浮点数
if audio.dtype == np.int16:
    audio = audio.astype(np.float32) / 32768.0
elif audio.dtype == np.int32:
    audio = audio.astype(np.float32) / 2147483648.0

# 如果音频是立体声,取平均得到单声道
if audio.ndim > 1:
    audio = audio.mean(axis=1)

# 创建谱图
spectrogram = create_spectrogram(audio, sr=sr)

# 显示图像
spectrogram.show()

# 保存图像
spectrogram.save('1_spectrogram.png')

在这里插入图片描述

颜色自定义:
颜色映射(colormap)来改变频谱图的颜色方案

import numpy as np
import matplotlib.pyplot as plt
import torch
from PIL import Image
from scipy.io import wavfile
from matplotlib.colors import LinearSegmentedColormap

def create_custom_cmap(base_color):
    if base_color == 'blue':
        colors = ['darkblue', 'blue', 'cyan', 'yellow', 'red']
    elif base_color == 'black':
        colors = ['black', 'darkblue', 'blue', 'cyan', 'yellow', 'red']
    else:
        raise ValueError("base_color must be 'blue' or 'black'")
    
    return LinearSegmentedColormap.from_list("custom", colors)

def create_spectrogram(audio, sr=48000, n_fft=1024, hop=512, vmin=-100, vmax=0, base_color='blue'):
    # 确保音频是 torch.Tensor 类型
    audio = torch.as_tensor(audio)
    
    # 应用短时傅里叶变换(STFT)
    window = torch.hann_window(n_fft)
    spec = torch.stft(audio, n_fft, hop, window=window, return_complex=True)
    
    # 计算幅度谱并转换为分贝刻度
    spec = spec.abs().clamp_min(1e-12).log10().mul(10)
    
    # 如果是多声道,取平均
    if spec.dim() > 2:
        spec = spec.mean(0)
    
    # 将谱图转换为numpy数组
    spec_np = spec.cpu().numpy()
    
    # 计算时间和频率轴
    t = np.arange(0, spec_np.shape[1]) * hop / sr
    f = np.arange(0, spec_np.shape[0]) * sr / 2 / (n_fft // 2) / 1000

    # 创建自定义颜色映射
    custom_cmap = create_custom_cmap(base_color)

    # 创建图形
    fig, ax = plt.subplots(figsize=(15, 5))
    
    # 绘制谱图
    im = ax.pcolormesh(t, f, spec_np, shading='auto', vmin=vmin, vmax=vmax, cmap=custom_cmap)
    
    # 设置标签
    ax.set_xlabel('Time [s]')
    ax.set_ylabel('Frequency [kHz]')
    ax.set_title('Spectrogram')
    
    # 添加颜色条
    plt.colorbar(im, ax=ax, format='%+2.0f dB')
    
    # 调整布局
    plt.tight_layout()
    
    # 将图形转换为PIL图像
    fig.canvas.draw()
    img = Image.frombytes('RGB', fig.canvas.get_width_height(), fig.canvas.tostring_rgb())
    
    # 关闭matplotlib图形以释放内存
    plt.close(fig)
    
    return img


# 读取 WAV 文件
sr, audio = wavfile.read(r"E:\allchat\output_16000_mono_0.wav")

# 如果音频是整数类型,将其转换为 -1.0 到 1.0 之间的浮点数
if audio.dtype == np.int16:
    audio = audio.astype(np.float32) / 32768.0
elif audio.dtype == np.int32:
    audio = audio.astype(np.float32) / 2147483648.0

# 如果音频是立体声,取平均得到单声道
if audio.ndim > 1:
    audio = audio.mean(axis=1)

# 创建蓝色底的谱图
spectrogram_blue = create_spectrogram(audio, sr=sr, base_color='blue')
spectrogram_blue.save('1_spectrogram_blue.png')

# 创建黑色底的谱图
spectrogram_black = create_spectrogram(audio, sr=sr, base_color='black')
spectrogram_black.save('1_spectrogram_black.png')

# 显示图像
spectrogram_blue.show()
spectrogram_black.show()

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

基于用户的协同过滤算法

目录 原理: 计算相似度: 步骤: 计算方法:Jaccard相似系数、余弦相似度。 推荐 原理: 先“找到相似用户”,再“找到他们喜欢的物品”--->人以群分。即,给用户推荐“和他兴趣相似的其他用…

selenium,在元素块下查找条件元素

def get_norms_ele_text(self):elementsself.get_norms_elements()locBy.CSS_SELECTOR,"div.sku-select-row-label"by loc[0] # 获取By类型,例如By.CSS_SELECTORvalue loc[1] # 获取具体的CSS选择器字符串,例如"div.sku-select-row-l…

【C++】vector的底层原理及实现

文章目录 vector的底层结构迭代器容量操作size()capacity()reserve()resize() 默认成员函数构造无参构造函数带参构造函数 析构拷贝构造赋值重载 operator[ ]插入删除操作insert()任意位置插入erase()任意位置删除push_back()尾插pop_back()尾删 vector的底层结构 我们的目的不…

数据万象推出智能检索MetaInsight,现已开启限时公测

海量文件的分析统计一直是对象存储COS的热点需求,伴随AIGC飞速迭代发展,在众多不同模态素材的海洋中,用户也急需更高效地管理和利用多媒体内容,打破传统搜索的桎梏。 数据万象推出的智能检索 MetaInsight 服务将多模态检索与元数…

第十四章 Qt绘图

目录 一、Qt绘图基础 1、主要的类 2、paintEvent 事件 二、坐标体系 三、画笔 1、画笔的常用接口 2、画笔样式 3、画笔画线时的端点样式 4、画笔画线时,连接点的样式 5、实例 四、画刷 1、画刷的填充样式 2、实例 五、基本图形的绘制 1、画矩形 drawRect 2、画…

miniconda3 安装jupyter notebook并配置网络访问

由于服务器安装的miniconda3,无jupyter notebook,所以手工安装jupyter notebook 1 先conda 安装相关包 在base 环境下 conda install ipython conda install jupyter notebook 2 生成配置文件 jupyter notebook --generate-config Writing defaul…

Coze终于顶不住了?开始收费了

🤔各位老铁都知道,之前Coze以免费出圈,香碰碰,字节一个月几个亿补贴用户。现在终于顶不住了,开始收费了! 我们来看看具体情况吧! 💸收费情况一览 目前国内版本还没有开始收费&#x…

CesiumJS【Basic】- #054 绘制渐变填充多边形(Entity方式)-使用shader

文章目录 绘制渐变填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制渐变填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制渐变填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium…

迅睿CMS 后端配置项没有正常加载,上传插件不能正常使用

首先,尝试迅睿CMS官方提供的【百度编辑器问题汇总】解决方案来解决你的问题。你可以访问这个链接:官方解决方案。 如果按照【百度编辑器问题汇总】解决方案操作后,依然遇到“后端配置项没有正常加载,上传插件不能正常使用”的问题…

windows重装系统

一、下载Ventoy工具,制作启动盘 官网地址:https://www.ventoy.net/cn/download.html 电脑插入用来制作系统盘的U盘,建议大小在8G以上。 双击打开刚解压出来的Ventoy2Disk.exe文件。打开界面如图: 确认U盘,如图&am…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

VoiceCraft—— 业界最高水平的自然语音合成语言模型

VoiceCraft: 实现语音编辑和合成的 SOTA 论文地址:https://arxiv.org/html/2403.16973v1 源码地址:https://github.com/jasonppy/voicecraft 本文介绍VoiceCraft 的开发情况,它在语音编辑和零点语音合成 (TTS) 方面都实现了 SOTA。在本文中…

如何压缩jpg图片的大小?关于缩小jpg图片的四种方法

如何压缩jpg图片的大小?压缩JPG图片大小是一项常见的技术,用来优化图片以适应不同的应用需求。无论是为了在网页上提高加载速度、减少存储空间占用,还是为了便于通过电子邮件或社交媒体分享,压缩jpg图片都是必不可少的步骤。这种技…

AIoTedge:智能边缘计算平台

随着物联网(IoT)和人工智能(AI)技术的飞速发展,AIoT(人工智能物联网)已成为推动智能化转型的关键力量。AIoT Edge作为这一领域的创新平台,通过边缘计算技术,为企业提供了一个高效、灵活且安全的解决方案。 边云协同架构…

Java 7新特性深度解析:提升效率与功能

文章目录 Java 7新特性深度解析:提升效率与功能一、Switch中添加对String类型的支持二、数字字面量的改进三、异常处理(捕获多个异常)四、增强泛型推断五、NIO2.0(AIO)新IO的支持六、SR292与InvokeDynamic七、Path接口…

Xilinx FPGA:vivado实现乒乓缓存

一、项目要求 1、用两个伪双端口的RAM实现缓存 2、先写buffer1,再写buffer2 ,在读buffer1的同时写buffer2,在读buffer2的同时写buffer1。 3、写端口50M时钟,写入16个8bit 的数据,读出时钟25M,读出8个16…

前端进阶全栈计划:Spring扫盲

Spring扫盲 spring 和 springboot的关系? 类比前端:vue.js和nuxt.js的关系 Spring Boot 是基于 Spring 框架的快速开发工具,简化了 Spring 应用的配置和部署。 spring核心特性 1. 依赖注入 依赖注入是Spring框架的核心功能之一。它允许你通过配置将对…

Golang | Leetcode Golang题解之第206题反转链表

题目: 题解: func reverseList(head *ListNode) *ListNode {if head nil || head.Next nil {return head}newHead : reverseList(head.Next)head.Next.Next headhead.Next nilreturn newHead }

什么是Web3D交互展示?有什么优势?

在智能互联网蓬勃发展的时代,传统的图片、文字及视频等展示手段因缺乏互动性,正逐渐在吸引用户注意力和提升宣传效果上显得力不从心。而Web3D交互展示技术的横空出世,则为众多品牌与企业开启了一扇全新的展示之门,让线上产品体验从…

学校卫星电子怎么自动校准时间呢

在学校的教室里,卫星电子钟精准地为师生们提供着时间服务,而其自动校准时间的功能令人称奇。那么,学校卫星电子钟是如何实现自动校准时间的呢? 学校卫星电子钟自动校准时间的原理基于卫星导航系统。常见的如北斗卫星导航系统或 GP…