recorder.js 到节点以进行 azure 说话人识别

我有一个浏览器应用程序,它通过麦克风记录用户的声音并使用 recorder.js 导出到 WAV 文件。我认为将其转换为数据 url 并将其发布到节点。然后我尝试将音频发送到 Microsoft Azure Speaker Recognition API,但我总是得到“无效的音频格式:不是 WAVE 文件 - 没有 RIFF 标头”。


有没有办法添加 RIFF 标头,或者是否有关于 recorder.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)

        })

    })

}


白衣非少年
浏览 186回答 1
1回答

qq_花开花谢_0

似乎问题实际上是发送文件的方式。我不知道如果它在帖子正文中作为 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)  })我希望这对某人有所帮助,因为这两个部分都花了我太长时间才能解决!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript