Я хочу вычислить спектрограмму 1-секундного аудиоклипа для каждого кадра в видеофайле.
Я использую функцию tensorflow.contrib.framework.python.ops.audio_ops.audio_spectrogram
для вычисления спектрограммы.
Звук, извлеченный извидео и сэмплированные при 48 кГц.Я использую window_size=480
(0.01 * sample_rate) и stride=240
(0.5 перекрытия).Весь мой видеофайл имеет 25 кадров в секунду и длительность 1 ~ 10 минут.Поэтому ему необходимо вычислять 25 спектрограмм в секунду.
В настоящее время я вычисляю спектрограмму, получая сигнал в моменты времени от x до x + 1 секунды и передавая сигнал в функцию audio_spectrogram()
.Вот фрагмент кода того, как я вычисляю спектрограмму аудиофайла:
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 дим. Кроме того, я не уверен, что выполнение операции в пакете ускорит процесс.