【问题标题】:How to speed up spectrogram computation with tensorflow?如何使用 tensorflow 加速频谱图计算?
【发布时间】:2020-01-16 15:45:05
【问题描述】:

我想为视频文件中的每一帧计算 1 秒音频剪辑的频谱图。

我使用tensorflow.contrib.framework.python.ops.audio_ops.audio_spectrogram 函数来计算频谱图。

从视频中提取并以 48 kHz 采样的音频。我正在使用 window_size=480 (0.01 * sample_rate) 和 stride=240 (0.5 重叠)。我所有的视频文件都有 25 fps,持续时间为 1~10 分钟。所以它需要每秒计算 25 个频谱图。

我目前正在通过获取时间 x 到 x+1 秒的波形并将波形传递给audio_spectrogram() 函数来计算频谱图。这是我如何计算音频文件的频谱图的 sn-ps 代码:

audio_binary = tf.read_file(filename)
wav = audio_ops.decode_wav(audio_binary)

with tf.Session() as sess:
    waveform, sample_rate = tf.run(wav)

for i in range(25 * video_duration):
    start = i * sample_rate / 25 # fps
    spect = audio_ops.audio_spectrogram(waveform[start:start+sample_rate], 480, 240)

    # spectrogram post processing...

    with tf.Session() as sess, open(get_output_filename(filename, i)) as output:
        encode = tf.image.encode_jpeg(spect)
        output.write(tf.run(encode))

不幸的是,这段代码需要很长时间来计算所有的频谱图。完全计算 5 个音频文件的频谱图需要 12 小时。而且我有数百个视频要计算:(。

有什么方法可以加快这个过程?

我正在考虑批量执行audio_spectrogram() 函数(有点在[batch_size, waveform] 上操作),但不知道该怎么做,因为波形参数只需要一个1 暗淡的数组。另外,我不确定批量操作是否会加快进程。

【问题讨论】:

  • 视频格式是什么?
  • 我认为视频格式并不重要。我只需要音频部分(提取到.wav 文件中)和视频帧速率(用于计算音频样本的起始索引)来计算频谱图。
  • 如果您的方法仅使用 25% 的 CPU,您可以并行运行 4 个程序,每个程序在一个视频上。相当便宜的多处理版本。
  • 应该使用TensorFlow来完成吗?是否启用/使用了 CUDA?你也可以并行化 for 循环
  • @gustavovelascoh 实际上,不,至少现在是这样。我正在使用 tensorflow,因为频谱图之前是在增强过程之前计算的,增强过程也使用了 tensorflow API,因此它可以在同一个图中处理并更多地利用 GPU(是的,正在使用 CUDA)。但现在频谱图计算已从增强过程中移出。我也在寻找其他一些可能能够替代它的库,但我仍然对 tensorflow 抱有希望。

标签: python tensorflow spectrogram


【解决方案1】:

查看this 项目。它是 Tensorflow Keras 层内语音处理功能的实现。该软件包有助于利用 GPU 加速音频处理,同时可以轻松转换为 TFLite。

import tensorflow as tf
from spela.spectrogram import Spectrogram

# Define a Sequential model
model = tf.keras.Sequential()

# Add a layer to compute Spectrogram, returns a 2D image
model.add(Spectrogram(n_dft=512, n_hop=256, input_shape=(height, width),
                      return_decibel_spectrogram=True, power_spectrogram=2.0,
                      trainable_kernel=False, name='static_stft'))

model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.001),
              loss="categorical_crossentropy"
              , metrics=[tf.keras.metrics.categorical_accuracy])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2018-05-11
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多