在 scipy 中重现 sox 频谱图

2023-12-04

例如,我有一个带有语音的 wav 文件。

我可以使用 sox 创建漂亮的频谱图可视化:

wget https://google.github.io/tacotron/publications/tacotron2/demos/romance_gt.wav
sox romance_gt.wav -n spectrogram -o spectrogram.png

enter image description here

我怎样才能在Python中重现这个频谱图?

这是使用的示例scipy.signal.spectrogram

input_file = 'temp/romance_gt.wav'
fs, x = wavfile.read(input_file)
print('fs', fs)
print('x.shape', x.shape)

f, t, Sxx = signal.spectrogram(x, fs)
print('f.shape', f.shape)
print('t.shape', t.shape)
print('Sxx.shape', Sxx.shape)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.savefig('spectrogram_scipy.png')

But looks like some parameters are bad or something is broken: enter image description here


请注意 sox 生成的图中颜色条的比例。单位是dBFS:相对于满量程的分贝。要使用 SciPy 和 Matplotlib 重现该图,您需要缩放这些值以使最大值为 1,然后取这些值的对数以转换为 dB。

这是脚本的修改版本,其中包括对参数的各种调整spectrogram and pcolormesh创建一个类似于 sox 输出的图。

import numpy as np
from scipy.io import wavfile
from scipy import signal
import matplotlib.pyplot as plt

input_file = 'romance_gt.wav'
fs, x = wavfile.read(input_file)
print('fs', fs)
print('x.shape', x.shape)

nperseg = 1025
noverlap = nperseg - 1
f, t, Sxx = signal.spectrogram(x, fs,
                               nperseg=nperseg,
                               noverlap=noverlap,
                               window='hann')
print('f.shape', f.shape)
print('t.shape', t.shape)
print('Sxx.shape', Sxx.shape)
plt.pcolormesh(1000*t, f/1000, 10*np.log10(Sxx/Sxx.max()),
               vmin=-120, vmax=0, cmap='inferno')
plt.ylabel('Frequency [kHz]')
plt.xlabel('Time [ms]')
plt.colorbar()
plt.savefig('spectrogram_scipy.png')

我分了Sxx by Sxx.max()考虑 dBFS 的“全面”方面。我调整了nperseg and noverlap的论点spectrogram沿频率和时间轴提供高于默认值的分辨率。我用了window='hann'以匹配 sox 的默认行为。 (您可以在以下位置找到 sox 频谱图的详细信息:http://sox.sourceforge.net/sox.html.)我也用过vmin=-120 and vmax=0 in pcolormesh,以匹配 sox 频谱图使用的默认范围。

情节如下:

spectogram

“地狱”色彩图并不像红袜图中使用的色彩图那么强烈。请参阅教程“在 Matplotlib 中选择颜色图”用于替代颜色图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 scipy 中重现 sox 频谱图 的相关文章

随机推荐

  • Win32 确定键盘何时连接/断开

    我正在尝试确定键盘何时连接或断开连接 我尝试过以下策略 注册设备通知 使用 RegisterDeviceNotification 如上所述MSDN被建议于如何在 DirectInput 中确定键盘已断开 当我尝试这个时 我得到了DB DEV
  • 从分配给正文的按键处理程序中排除表单字段

    我有一个keypress网页上分配给 body 元素的处理程序 我真的希望它在网页的任何地方都处于活动状态 或者说我是这么想的 这keypress文本输入表单中的事件也会激活正文处理程序 这是有道理的 但我不想要 理想情况下 我想保留key
  • rJava 警告含义

    我正在尝试为 R 编译一个使用的包openNLP这依赖于rJava 编译失败并显示以下消息 当我尝试在 R 中加载包时 它显示 library openNLP Warning message replacing previous impor
  • 使用 boost::concept_check 检查模板参数时出现编译错误

    我正在尝试编译一个使用小桥模板 externally locked 的简单示例 该模板仅在锁定其父 AccountManager 对象后才能控制对 BankAccount 的访问 参考增强同步 include
  • Unity3d 在 Android 上共享图像

    尝试在 Unity 游戏上实现 Android 图像共享 我整理了几个源代码 这是我当前的代码 public static void shareImage string subject string title string message
  • 对枚举值进行排序

    我想知道是否有任何方法可以为不同的类订购枚举 例如 如果我有一组固定的化学物质 它们以不同的方式与其他化学物质发生反应 有些反应强烈 有些反应较弱 我基本上希望能够根据该组应该反应的化学物质 即取决于类别 来改变它们的排列顺序 我确实知道我
  • Javascript:用逗号分割字符串,括号内除外

    给定字符串的形式 abc ab c d e f g zyx h 123 如何拆分它以获得以下数组格式 abc ab c d e f g zyx h 123 我已经尝试过正常的 javascript split 但是它无法按预期工作 尝试正则
  • 浮点数比较不匹配

    我有一个非常奇怪的错误 我无法弄清楚 float distance Utils distance this spriteStartX this spriteStartY this getX this getY Utils log D Che
  • Java,按对象获取ArrayList索引

    所以我在我的代码中遇到了一个小问题 synchronized clients clients remove this 当客户端断开连接时 但现在我需要能够将该客户端的名称发送给所有其他客户端 为此 我本质上需要执行类似的操作 synchro
  • 确保方法声明是继承的

    如何防止在打算继承定义的情况下意外定义非继承方法 我听说有一个技巧可以表达它 但没有人能记住它 解释 我有类树 Base 在派生链的某个地方 agrglist 中存在微妙的错误 导致 D 不可继承 程序顺利编译 并且在运行时调用了错误的方法
  • 如何检查VB.NET代码中Access SysCmd失败的原因?

    我们有一个用 VB NET 以及客户端中的 VBA 开发的应用程序 在 VB NET 开发的安装程序自定义操作中 我们使用 Access 的 SysCmd 603 将 mdb 文件编译为 mde 该命令众所周知未记录 示例代码如下所示 a
  • Android 上 OpenCV 中位图和 Mat 之间转换的正确方法?

    我目前正在尝试将一些遗留代码从 iPhone 迁移到 Android 此代码使用 OpenCV 库进行一些图像处理 我不明白如何在 Mat 和 Android Bitmap 类之间进行转换 此代码显示了一个非常简化的示例 它将位图加载到 M
  • 使用总和而不是计数绘制分箱数据

    我试图寻找答案 但似乎找不到适合我的答案 我有一个数据集 data 有两个变量 人们的年龄 age 和奖项数量 awards 我的目标是绘制 R 中奖项数量与年龄的关系 仅供参考 一个人可以获得多个奖项 并且人们可以拥有相同的年龄 我尝试绘
  • __LITTLE_ENDIAN_BITFIELD 和 __BIG_ENDIAN_BITFIELD? [复制]

    这个问题在这里已经有答案了 我想知道内核编译器将如何处理不同的字节序位域 struct iphdr if defined LITTLE ENDIAN BITFIELD u8 ihl 4 version 4 elif defined BIG
  • 将 SetFields 与 MongoDB C# 驱动程序 2.0 结合使用

    使用旧驱动程序 我可以指定要从查询返回的字段 如下所示 var cursor Collection Find query SetFields Fields
  • 将索引添加到 Google App Engine 上数据存储区中已存在的实体属性

    我知道您应该将 Index 添加到实体模型中的所有属性以添加索引 但是如果您忘记并且数据存储中已经存在实体的实时写入怎么办 有没有办法通过开发人员控制台或其他方式手动向所有这些属性添加索引 我发现 如果您将 Index 添加到实体并重新部署
  • 如何在 Jaxb 中忽略 XML 中的某些标签

    我的xml文件如下
  • 使用 java 和 iText 签署 PDF 哈希值

    我有一个生成 PDF 的应用程序 需要签名 我们没有用于签署文档的证书 因为它们位于 HSM 中 而我们使用证书的唯一方法是使用 Web 服务 PdfReader reader new PdfReader src reader setApp
  • 无法让 pysnmp 与 pyinstaller 一起使用

    尝试让 pyinstaller 与 pysnmp 一起使用这是规范文件 mode python a Analysis app py pathex home robertja pysnmp hiddenimports None hookspa
  • 在 scipy 中重现 sox 频谱图

    例如 我有一个带有语音的 wav 文件 我可以使用 sox 创建漂亮的频谱图可视化 wget https google github io tacotron publications tacotron2 demos romance gt w