Как преобразовать wav-файл в спектрограмму для тензорного потока с columnTruncateLength: 232 и numFramesPerSpectrogram: 43? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь использовать функцию распознавания речи тензорного потока в автономном режиме.онлайн режим с использованием микрофона работает нормально.но в автономном режиме я не могу найти надежную библиотеку для преобразования файла wav / mp3 в спектрограмму в соответствии с требуемыми спецификациями массива как ffttsize: 1024, columnTruncateLength: 232, numFramesPerSpectrogram: 43.

Все библиотекикак spectrogram.js, который я пробовал, не имеют этих вариантов разговора.в то время как речь tenorlfowjs ясно упоминает о наличии следующих спецификаций для тензора спектрографа

const mic = await tf.data.microphone({
  fftSize: 1024,
  columnTruncateLength: 232,
  numFramesPerSpectrogram: 43,
  sampleRateHz:44100,
  includeSpectrogram: true,
  includeWaveform: true
});

Получение ошибки в качестве ошибки: tenor4d () требует, чтобы форма была предоставлена, когда values представляет собой плоский массив в следующих

await recognizer.ensureModelLoaded();
    var audiocaptcha = await response.buffer();
    fs.writeFile("./afterverify.mp3", audiocaptcha, function (err) {
        if (err) {}
    });
    var bufferNewSamples =  new Float32Array(audiocaptcha);

    const buffersliced = bufferNewSamples.slice(0,bufferNewSamples .length-(bufferNewSamples .length%9976));
    const xtensor = tf.tensor(bufferNewSamples).reshape([-1, 
...recognizer.modelInputShape().slice(1)]);

получил эту ошибку после нарезки и исправления в тензор

output.scores
[ Float32Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  Float32Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  Float32Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  Float32Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ],
  Float32Array [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ] ]
score for word '_background_noise_' = 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
score for word '_unknown_' = 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
score for word 'down' = 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
score for word 'eight' = 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
score for word 'five' = 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
score for word 'four' = undefined
score for word 'go' = undefined
score for word 'left' = undefined
score for word 'nine' = undefined
score for word 'no' = undefined
score for word 'one' = undefined
score for word 'right' = undefined
score for word 'seven' = undefined
score for word 'six' = undefined
score for word 'stop' = undefined
score for word 'three' = undefined
score for word 'two' = undefined
score for word 'up' = undefined
score for word 'yes' = undefined
score for word 'zero' = undefined

1 Ответ

0 голосов
/ 26 сентября 2019

Единственное требование при работе с автономным распознаванием - наличие входного тензора формы [null, 43, 232, 1].

1 - прочитать файл wav и получить массив данных

var spectrogram = require('spectrogram');

var spectro = Spectrogram(document.getElementById('canvas'), {
  audio: {
    enable: false
  }
});

var audioContext = new AudioContext();

readWavFile() {
return new Promise(resove => {
var request = new XMLHttpRequest();
request.open('GET', 'audio.mp3', true);
request.responseType = 'arraybuffer';

request.onload = function() {
  audioContext.decodeAudioData(request.response, function(buffer) {
    resolve(buffer)
  });
};
request.send()
})

}

const buffer = await readWavFile()

То же самое можно сделать без использования сторонней библиотеки.Возможны 2 варианта.

  • Считайте файл, используя <input type="file">.В этом случае этот ответ показывает, как получить typedarray.

  • Обслуживание и чтение wav-файла с помощью http-запроса

var req = new XMLHttpRequest();
req.open("GET", "file.wav", true);
req.responseType = "arraybuffer";

req.onload = function () {
  var arrayBuffer = req.response;
  if (arrayBuffer) {
    var byteArray = new Float32Array(arrayBuffer);
  }
};

req.send(null);

2 - преобразование буфера в типизированный массив

const data = Float32Array(buffer)

3 - преобразовать массив в тензор, используя форму модели распознавания речи.

const x = tf.tensor(
   data).reshape([-1, ...recognizer.modelInputShape().slice(1));

Если последние команды не выполняются, это означает, что данные не имеют формы, необходимой для модели.Тензор должен быть нарезан, чтобы иметь соответствующую форму, или сделанная запись должна соответствовать fft и другим параметрам.

...