диктофон. js для подключения к azure распознавания динамика - PullRequest
0 голосов
/ 16 марта 2020

У меня есть браузерное приложение, которое записывает голос пользователя через микрофон и экспортирует в файл WAV с помощью рекордера. js. Я думаю, что преобразовать это в URL-адрес данных и отправить его на узел. Затем я пытаюсь отправить аудиосигнал в Microsoft Azure Speaker Recognition API, но всегда получаю «Неверный формат звука: не файл WAVE - нет заголовка RIFF».

Есть ли способ добавить заголовок RIFF или что-то есть в рекордере. js или преобразовании в base64 и из base64, который удаляет эти заголовки? Есть ли способ добавить их обратно?

Код: INDEX. HTML

rec.exportWAV(function (blob) {
    var reader = new window.FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = function () {
        base64 = reader.result;
        console.log(base64)
        $.ajax({
            type: "POST",
            url: '/addVoiceToProfile',
            data: { userId: '', voiceId: "XXX-XXX", voice: base64, sampleRate: audioContext.sampleRate / 1000 },
            success: function (results) {
                console.log(results)
            }
        })
    }
})

ПУТЬ УЗЛА:

app.post('/addVoiceToProfile', function(req, res){
    var voicedata = req.body.voice;
    var base64Data = voicedata.replace(/^data:([A-Za-z-+/]+);base64,/, '');
    addVoicesToProfile(base64Data, req.body.voiceId).then(function(results){
        res.send(results)
    })
})

addVoicesToProfile:

function addVoicesToProfile(voice, id, user){
    return new Promise(function (resolve, reject) {
        var url = AzureParameters.endPoint+"/spid/v1.0/verificationProfiles/"+id+"/enroll";
        request({
            url:url,
            headers:{'Content-Type':'audio/wave', 'Ocp-Apim-Subscription-Key':AzureParameters.key},
            body: Buffer.from(voice, 'base64').toString('binary'),
            method: "POST",
            json: true
        }, function(err, response, body){
            if(err) return reject(err);
            return resolve(body)
        })
    })
}

1 Ответ

0 голосов
/ 17 апреля 2020

Кажется, проблема была в том, как файл был отправлен. Я не знаю, почему это работает, если оно отправлено в виде wav в теле сообщения, а не в виде данных в сообщении, но вот мой рабочий код, если это пригодится в будущем:

html:

Я использовал этот ответ для html. включает в себя кодировку для WAV. Единственное изменение, которое я сделал, было, как следует из ответа, я отправляю сообщение на свой сервер, а не напрямую в службу MS Azure.

маршрут узла:

Это заняло у меня некоторое время, пока я не удалось получить узел, чтобы увидеть файл, который я отправлял. Также я использую bodyParser, поэтому необработанное тело почтовых запросов возиться с ним до того, как я его увижу. Вот мой маршрут для почтового запроса:

  app.post('/uploadAudio', function (req, res, next) {
    var data = new Buffer('');
    req.on('data', function (chunk) {
        data = Buffer.concat([data, chunk]);
    });
    req.on('end', function () {
        req.rawBody = data;
        next();
    });
  }, function (req, res) {
    addVoicesToProfile(req.rawBody)
  })

Надеюсь, это кому-нибудь поможет, потому что обе части этого заняли у меня слишком много времени, чтобы разобраться!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...