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

在这里插入图片描述

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()

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM原理(十二):JVM虚拟机类加载过程

一个类型从被加载到虚拟机内存中开始,到卸载为止,它的整个生命周期将会经过 加载、验证、准备、解析、初始化、使用、卸载七个阶段。其中 验证、准备、解析三个部分统称为 连接 1. 加载 加载是整个类加载的一个过程。在加载阶段,Java虚拟机…

【测试】五子棋项目测试报告

目录 一、项目概述及测试目标 二、项目功能 三、测试类型 1)功能测试 ​编辑 2)自动化测试 四、测试总结 一、项目概述及测试目标 本项目是一个基于Web的五子棋实时对战应用,旨在提供用户之间的多人实时游戏体验。项目采用前…

springboot微信小程序的化妆品商城系统-计算机毕业设计源码041152

摘 要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,微信小程序的化妆品商城系统被用户普遍使用,为…

超声波俱乐部分享:万物智能——AI重新定义交互体验

6月25日,第十八期超声波俱乐部内部分享会在杭州圆满落幕,本期的主题是:万物智能——AI重新定义交互体验。 到场的嘉宾有:超声波创始人杨子超,超声波联合创始人、和牛商业创始人刘思雨,上海非著名资深程序员…

centos编译内核ko模块

1、make报错 make: * /lib/modules/4.14.0-49.el7a.aarch64/build: 没有那个文件或目录。 停止。 [rootlocalhost 4.14.0-49.el7a.aarch64]# pwd /lib/modules/4.14.0-49.el7a.aarch64 [rootlocalhost 4.14.0-49.el7a.aarch64]# ll 总用量 1744 lrwxrwxrwx. 1 root root …

小程序-<web-view>嵌套H5页面支付功能

背景:小程序未发布前,公司使用vue框架搭建了管理系统,为了减少开发成本,微信提供了web-view来帮助已有系统能在小程序上发布,详见web-view | 微信开放文档。因公司一直未打通嵌套H5小程序的支付功能,导致用…

Android 输入系统 InputStage

整体流程如上所说,简要归纳如下: 输入法之前的处理 输入法处理 输入法之后处理 综合处理 InputStage将输入事件的处理分成若干个阶段(Stage), 如果当前有输入法窗口,则事件处理从 NativePreIme 开始,否…

Flink 窗口触发器(Trigger)(一)

Flink 窗口触发器(Trigger)(一) Flink 窗口触发器(Trigger)(二) Flink的窗口触发器(Trigger)是流处理中一个非常关键的概念,它定义了窗口何时被触发并决定触发后的行为(如进行窗口数据的计算或清理)。 一、基本概念 …

AC7801时钟配置流程

一 默认配置 在启动文件中,已经对时钟进行了初始化,默认按外部8M晶振,配置系统时钟为48MHZ,APB为系统时钟的2分频,为24MHZ。在system_ac780x.c文件中,可以找到下面这个系统初始化函数,里面有Se…

力扣hot100-普通数组2

文章目录 题目:轮转数组方法1-使用额外的数组方法2-三次反转数组 除自身以外数组的乘积方法1-用到了除法方法2-前后缀乘积法 题目:轮转数组 原题链接:轮转数组 方法1-使用额外的数组 方法1是自己写出来的。方法2参考的别人的,…

守护创新之魂:源代码防泄漏的终极策略

在信息化快速发展的今天,企业的核心机密数据,尤其是源代码,成为了企业竞争力的关键所在。然而,源代码的泄露风险也随之增加,给企业的安全和发展带来了巨大威胁。在这样的背景下,SDC沙盒作为一种创新的源代码…

C++——stack和queue类用法指南

一、stack的介绍和使用 1.1 stack的介绍 1、stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行插入与提取操作 2、stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器&am…

imx6ull/linux应用编程学习(8)PWM应用编程(基于正点)

1.应用层如何操控PWM: 与 LED 设备一样, PWM 同样也是通过 sysfs 方式进行操控,进入到/sys/class/pwm 目录下 这里列举出了 8 个以 pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了…

同样的APP为何在Android 8以后网络感觉变卡?

前言 在无线网络技术不断发展的今天,Wi-Fi已经成为了我们日常生活中不可或缺的一部分。无论是家庭娱乐、办公还是在线游戏,Wi-Fi都在提供着便捷的互联网接入服务。然而,在安卓8.1后,为了进一步延长安卓设备的待机时间。原生安卓(A…

Ubuntu18.04新安装--无网络连接、重启黑屏解决教程

一、安装Ubuntu Ubuntu安装需要U盘作为启动盘,在目前教新的电脑中选中GPT作为分区,制作启动盘,其中在安装双系统Ubuntu时,以自定义格式作为存储空间。详细安装过程以以及如何分区请参考下列链接:内含详细安装过程&…

不是大厂云用不起,而是五洛云更有性价比

明月代维的一个客户的大厂云境外云服务器再有几天就到期了,续费提醒那是提前一周准时到来,但是看到客户发来的续费价格截图,我是真的没忍住。这不就是在杀熟吗?就这配置续费竟然如此昂贵?说实话这个客户的服务器代维是…

哈哈看到这条消息感觉就像是打开了窗户

在这个信息爆炸的时代,每一条动态可能成为我们情绪的小小触发器。今天,当我无意间滑过那条由杜海涛亲自发布的“自曝式”消息时,不禁心头一颤——如果这是我的另一半,哎呀,那画面,简直比烧烤摊还要“热辣”…

Qt安装配置教程

目录 一、下载Qt二、进行安装1、点击安装包(QT6.7版本演示)2、注册Qt账号3、选择安装的位置4、选择对应的组件 三、新建项目1、打开Qt Creator2、创建项目3、编辑名称和地址4、选择默认的CMake或切换成qmake构建5、选择自己的编译器,在此选择…

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列

ui.perfetto.dev sql 查询某个事件范围内,某个事件的耗时并降序排列 1.打开https://ui.perfetto.dev 导入Chrome Trace Json文件2.ParallelMLP.forward下的RowParallelLinear.forward3.点击Query(SQL),在输入框中输入以下内容,按CtrlEnter,显示查询结果4.点击Show timeline,点击…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好!如果你是美工或设计师,肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具,让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具,还能通过先进的AI技术,让抠图变得简单快速,让你专…