Аудиоанализ с использованием javascript + октавы, «различный результат данных канала между аудиоконтекстным декодером и октавой»? - PullRequest
0 голосов
/ 23 апреля 2019

Я разрабатываю веб-приложение для калибровки звука с использованием Google Polymer 3. Некоторые процессы выполняются до тех пор, пока я не пойму, что результат данных аудиоканала отличается от ожидаемого.Я отсылаю свой результат ожидания к октавному программному обеспечению.

Я создал образец репо для эксперимента на https://github.com/mahdiridho/decodeAudioData

Результат клиентского приложения выглядит так:

0: 0.738193154335022
1: 0.17993010580539703
2: 0.143886536359787
3: -0.49501433968544006
4: -0.581611156463623
5: -0.07922420650720596
6: 0.25858914852142334
7: 0.42484045028686523
8: 0.12840349972248077
9: -0.15169838070869446
10: -0.27878567576408386
11: -0.13389098644256592
12: 0.07916242629289627
13: 0.18276247382164001
14: 0.11339849978685379
15: -0.03214486315846443
16: -0.11864637583494186
17: -0.08897825330495834
18: 0.006309896241873503
19: 0.07485105097293854

в то время как ссылка на октаву выглядит примерно так:

1.000000
-0.059232
0.408143
-0.503169
-0.554996
-0.336158
0.122070
0.389484
0.336810
0.057144
-0.204190
-0.268489
-0.131052
0.069502
0.179210
0.140048
0.010775
-0.098861
-0.115960
-0.047979

Мы можем видеть, что они разные, не идентичны и не масштабированы верно?

Мой логический код должен работать с результатом, таким же или идентичным октаве.ссылка.Что именно проблема здесь?Как вы будете исправлять эти различия?

Best

1 Ответ

1 голос
/ 23 апреля 2019

Я не знаю ни Octave, ни его audioread метод, но BaseAudioContext.decodeAudioData делает " [повторная выборка аудиоданных] до частоты дискретизации AudioContext. "

Это означает, что два экземпляра AudioContexts могут возвращать разные аудиоданные из этого метода.

В настоящее время sampleRate для AudioContext можно установить только вручную в Firefox и Chrome 74 + , в других браузерах по умолчанию используется предпочитаемое значение текущего оборудования; поэтому ниже Snippet в настоящее время должен запускаться из браузера Firefox или Chrome 74 + .

const AudioContext = window.AudioContext || window.webkitAudioContext;
const ctx1 = new AudioContext({
  sampleRate: 8000
});
const ctx2 = new AudioContext({
  sampleRate: 44100
});

if (ctx1.sampleRate !== 8000 || ctx2.sampleRate !== 44100) {
  console.error("your browser doesn't support sampleRate option, please try again from Firefox or Chrome 74+");
} else {
  fetch('https://dl.dropboxusercontent.com/s/1cdwpm3gca9mlo0/kick.mp3')
    .then(r => r.arrayBuffer())
    .then(buf => Promise.all([
      ctx1.decodeAudioData(buf.slice()),
      ctx2.decodeAudioData(buf.slice())
    ])).then(([data1, data2]) => {
      console.log('8000Hz', data1.getChannelData(0).slice(0, 5));
      console.log('44100Hz', data2.getChannelData(0).slice(0, 5));
    })
    .catch(console.error);
}

Вывод из моего Firefox :

8000 Гц {
«0»: 0,005487468093633652,
«1»: 0,006598024629056454,
«2»: 0,009341353550553322,
«3»: 0,003335932269692421,
«4»: 0,002990187844261527
}
44100 Гц {
«0»: 0,011174305342137814,
«1»: 0,016991807147860527,
«2»: 0,016990941017866135,
«3»: 0,01010976918041706,
«4»: 0,0003506771754473448
}

Обратите внимание, что мой Chrome 76 с тем же sampleRate возвращает что-то еще.

Таким образом, вы можете ожидать, что этот метод не будет возвращать какие-либо жестко закодированные данные, и, конечно, он не будет таким же, как тот, который возвращал Octave.

...