Как можно выполнить БПФ-анализ аудио-файла в Chrome без необходимости воспроизведения? - PullRequest
0 голосов
/ 16 февраля 2019

В Интернете не существует ни одного рабочего примера того, как выполнить FFT-анализ звукового файла / буфера / аудиобуфера в браузере без необходимости воспроизведения.API веб-аудио слишком сильно изменен, чтобы, например, использовать эту библиотеку https://github.com/corbanbrook/dsp.js больше.Все другие подсказки в настоящее время не приводят к решению.

РЕДАКТИРОВАТЬ: мне не нужно манипулировать какими-либо данными, просто чтобы прочитать частотный спектр в разные моменты времени аудио.Ввод решения может быть любой формой данных (wav-файл, массив буферов, аудиобуфер, что угодно), но не потоком.В идеале ожидаемый результат - это массив (моменты времени) массивов (амплитуды бина частоты).

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Вам нужно 4 вещи:

  • Код Javascript для чтения в WAV-файле в виде двоичного двоичного объекта

  • Код для преобразования фрагментов этогоblob как 16-битные сэмплы в подходящие массивы Javascript числовых сэмплов для FFT

  • Реализация на Javascript массивов DFT или FFT подходящего размера для желаемого разрешения по времени и частоте

  • Код для оценки желаемых параметров частоты и величины при пошаговом и повторном БПФ для срезов данных

Первые 3 можно найтииз веб-поиска (Github, здесь и др.)

0 голосов
/ 17 февраля 2019

Если вы должны использовать WebAudio, способ сделать это - использовать OfflineAudioContext.Затем, когда вам нужно получить данные о частоте, позвоните suspend(time).Примерно так:

c = new OfflineAudioContext(....);
a = new AnalyserNode(c);
src.connect(a);  // src is the signal you want to analyze.

c.suspend(t1)
  .then(() => {
    a.getFloatFrequencyData(array1);
  })
  .then(() => c.resume());

c.suspend(t2)
  .then(() => {
    a.getFloatFrequencyData(array2);
  })
  .then(() => c.resume());

// More suspends if needed

// Render everything now
c.startRendering()
  .then((buffer => {
    // Maybe do something now that all the frequency data is available.
  })

Однако я думаю, что только Chrome поддерживает suspend с автономным контекстом.

0 голосов
/ 16 февраля 2019

Вы можете многое сделать с офлайн-аудиоконтекстом, но это просто запустит весь граф узлов как можно быстрее, чтобы воспроизвести результирующий кусок аудио.Я не понимаю, как анализаторный узел даже работал бы в такой ситуации (поскольку его аудиовыход бесполезен).

Мне кажется, что вы правы в том, что вы не можете использовать Web Audio API безфактически воспроизводит файл в режиме реального времени.Вы должны будете выполнить анализ самостоятельно, для этого должно быть доступно много библиотек (так как это всего лишь сжатие чисел).Webworkers или Wasm, вероятно, путь.

...