1.最近在尝试用node.js 做语音识别 用的是百度的api 现在碰到了解决不了的问题 录音的库 返回的是一个blob
我做了各个方面的尝试 我得需求是这样的 通过web录音然后获取到blob 对象 然后通过$.post()的方式将这个blob传入node中 然后再通过node写入一个wav的文件
2.$.post()中的data 不能传入对象
3.blob 序列化 通过fileReader 序列化后 过长
4.网上查到了一个blob-to-buffer 的库 要求传过来的是一个blob对象 所以现在希望最好是能直接将blob对象传到后台
代码如下:
后台创建的一个录音 blob对象
encodeWAV: function () {
var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);
var sampleBits = Math.min(this.inputSampleBits, this.oututSampleBits);
var bytes = this.compress();
var dataLength = bytes.length * (sampleBits / 8);
var buffer = new ArrayBuffer(44 + dataLength);
var data = new DataView(buffer);
var channelCount = 1;//单声道
var offset = 0;
var writeString = function (str) {
for (var i = 0; i < str.length; i++) {
data.setUint8(offset + i, str.charCodeAt(i));
}
}
// 资源交换文件标识符
writeString('RIFF'); offset += 4;
// 下个地址开始到文件尾总字节数,即文件大小-8
data.setUint32(offset, 36 + dataLength, true); offset += 4;
// WAV文件标志
writeString('WAVE'); offset += 4;
// 波形格式标志
writeString('fmt '); offset += 4;
// 过滤字节,一般为 0x10 = 16
data.setUint32(offset, 16, true); offset += 4;
// 格式类别 (PCM形式采样数据)
data.setUint16(offset, 1, true); offset += 2;
// 通道数
data.setUint16(offset, channelCount, true); offset += 2;
// 采样率,每秒样本数,表示每个通道的播放速度
data.setUint32(offset, sampleRate, true); offset += 4;
// 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8
data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;
// 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8
data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;
// 每样本数据位数
data.setUint16(offset, sampleBits, true); offset += 2;
// 数据标识符
writeString('data'); offset += 4;
// 采样数据总数,即数据总大小-44
data.setUint32(offset, dataLength, true); offset += 4;
// 写入采样数据
if (sampleBits === 8) {
for (var i = 0; i < bytes.length; i++, offset++) {
var s = Math.max(-1, Math.min(1, bytes[i]));
var val = s < 0 ? s * 0x8000 : s * 0x7FFF;
val = parseInt(255 / (65535 / (val + 32768)));
data.setInt8(offset, val, true);
}
} else {
for (var i = 0; i < bytes.length; i++, offset += 2) {
var s = Math.max(-1, Math.min(1, bytes[i]));
data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}
return new Blob([data], { type: 'audio/wav' });
}
};
通过点击传后台
$('#download').click(function(){
var url = recorder.getBlob();
console.log(url) //获取到blob
//Blob {size: 44, type: "audio/wav"}
console.log(JSON.stringify(url))//这样序列化 blob 直接变成空
//{}
// var reader = new FileReader();
// reader.readAsText(url)
// reader.onloadend = function(e) {
// var result = reader.result;
// $.post('yuyin',{voiceData:result},function(data){
// console.log(data)
// })
// console.log(result)
// }
// 上面这个方式过长
$.post('yuyin',{voiceData:JSON.stringify(url)},function(data){
console.log(data)
})
})