【问题标题】:How can I convert spectrogram data to a tensor (or multidimensional numpy array)?如何将频谱图数据转换为张量(或多维 numpy 数组)?
【发布时间】:2020-05-31 22:54:43
【问题描述】:

我正在使用keras 并且拥有:

        corrupted_samples, corrupted_sample_rate = sf.read(
            self.corrupted_audio_file_paths[index])

        frequencies, times, spectrogram = scipy.signal.spectrogram(
            corrupted_samples, corrupted_sample_rate)

根据the docs,这给出了:

f (ndarray) - Array of sample frequencies.
t (ndarray) - Array of segment times.
Sxx (ndarray) - Spectrogram of x. By default, the last axis of Sxx corresponds to the segment times.

我假设所有时间都会排队,所以我不在乎时间的价值(我不这么认为)。 frequencies 也是如此。所以我真正需要的是每个频率在每个时间的值,由我的代码中的Sxx(或spectrogram)给出。我不确定如何实际做到这一点。不过看起来很简单。

【问题讨论】:

标签: python numpy keras scipy tensor


【解决方案1】:

基于https://towardsdatascience.com/speech-recognition-analysis-f03ff9ce78e9,作者表示频谱图是声音的频谱-时间表示,并展示了将wav文件转换为频谱图的一些步骤。

其中一个示例如下:

## Check the sampling rate of the WAV file.
audio_file = './siren_mfcc_demo.wav'


import wave
with wave.open(audio_file, "rb") as wave_file:
    sr = wave_file.getframerate()
print(sr)

audio_binary = tf.read_file(audio_file)

# tf.contrib.ffmpeg not supported on Windows, refer to issue
# https://github.com/tensorflow/tensorflow/issues/8271
waveform = tf.contrib.ffmpeg.decode_audio(audio_binary, file_format='wav', samples_per_second=sr, channel_count=1)
print(waveform.numpy().shape)

signals = tf.reshape(waveform, [1, -1])
signals.get_shape()

# Compute a [batch_size, ?, 128] tensor of fixed length, overlapping windows
# where each window overlaps the previous by 75% (frame_length - frame_step
# samples of overlap).
frames = tf.contrib.signal.frame(signals, frame_length=128, frame_step=32)
print(frames.numpy().shape)

# `magnitude_spectrograms` is a [batch_size, ?, 129] tensor of spectrograms. We
# would like to produce overlapping fixed-size spectrogram patches; for example,
# for use in a situation where a fixed size input is needed.
magnitude_spectrograms = tf.abs(tf.contrib.signal.stft(
    signals, frame_length=256, frame_step=64, fft_length=256))

print(magnitude_spectrograms.numpy().shape)

以上方法参考https://colab.research.google.com/drive/1Adcy25HYC4c9uSBDK9q5_glR246m-TSx#scrollTo=QTa1BVSOw1Oe

希望对您有所帮助。

【讨论】:

  • 谢谢。我已经拥有来自scipy.signal.spectrogramspectogram。我需要以某种方式将其转换为 (n_timesteps, n_frequencies) 的张量
  • 你有没有为@Shamoon找到解决方案?
猜你喜欢
  • 2017-08-11
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2018-11-28
  • 2020-12-21
  • 2019-06-13
相关资源
最近更新 更多