在网络上录制音频,预设:16000Hz 16bit
Record audio on web, preset: 16000Hz 16bit
function floatTo16BitPCM(output, offset, input){
for (var i = 0; i < input.length; i++, offset+=2){
var s = Math.max(-1, Math.min(1, input[i]));
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}
function writeString(view, offset, string){
for (var i = 0; i < string.length; i++){
view.setUint8(offset + i, string.charCodeAt(i));
}
}
function encodeWAV(samples){
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer);
/* RIFF identifier */
writeString(view, 0, 'RIFF');
/* RIFF chunk length */
view.setUint32(4, 36 + samples.length * 2, true);
/* RIFF type */
writeString(view, 8, 'WAVE');
/* format chunk identifier */
writeString(view, 12, 'fmt ');
/* format chunk length */
view.setUint32(16, 16, true);
/* sample format (raw) */
view.setUint16(20, 1, true);
/* channel count */
view.setUint16(22, 2, true);
/* sample rate */
view.setUint32(24, sampleRate, true);
/* byte rate (sample rate * block align) */
view.setUint32(28, sampleRate * 4, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, 4, true);
/* bits per sample */
view.setUint16(34, 16, true);
/* data chunk identifier */
writeString(view, 36, 'data');
/* data chunk length */
view.setUint32(40, samples.length * 2, true);
floatTo16BitPCM(view, 44, samples);
return view;
}
您好,我正在使用此源代码为我的学校考试录制音频。它以 44100Hz 和 16 位录制音频。我想更改录制设置以录制 16000Hz 和 16 位的音频。
我尝试将函数 encodeWAV 中的 44 修改为 16,但没有成功。
function encodeWAV(samples){
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer)
我也尝试过更改 floadRToBitPCM。我试图将 44 更改为 16,但它也没有用。
floatTo16BitPCM(view, 44, samples);
你能帮我解决这个问题吗??不知道怎么修改这个源码
您正在修改错误的字段。波形文件是 header 后跟数据。 wave header 通常 44 字节长。您在示例代码中看到的 44
的值与此相关,与 44100
.
无关
在您未发布的代码中,sampleRate
被定义为 44100。您需要找到该定义并将其更改为 16000。具体取决于您的代码的其余部分和示例的来源它可能不是那么简单。例如,如果正在从设备记录样本并且该设备已配置为以 44100 记录,那么简单地将保存的波形标记为 16000 不会产生预期的效果。它只会使播放速度太慢 2.75 倍,也就是 Barry White 效果。
编辑:
另一种选择(IMO 更好)是使用 HTML 的 MediaRecorder 并以 .ogg
格式记录,demo, and it's git repo
我假设您正在使用 this 作为来源,就像 jaket 所说的那样,floatTo16BitPCM(view, 44, samples);
行与采样率无关...
如果你想对数据重新采样,你必须修改这个:
function exportWAV(type){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
buffers.push(mergeBuffers(recBuffers[channel], recLength));
}
if (numChannels === 2){
var interleaved = interleave(buffers[0], buffers[1]);
} else {
var interleaved = buffers[0];
}
var dataview = encodeWAV(interleaved);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
进入这个:
function exportWAV(type, desiredSamplingRate){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
var buffer = mergeBuffers(recBuffers[channel], recLength);
buffer = interpolateArray(buffer, desiredSamplingRate, sampleRate);
buffers.push(buffer);
}
sampleRate = desiredSamplingRate;
if (numChannels === 2){
var interleaved = interleave(buffers[0], buffers[1]);
} else {
var interleaved = buffers[0];
}
var dataview = encodeWAV(interleaved);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
数据重采样代码,
// for changing the sampling rate, data,
function interpolateArray(data, newSampleRate, oldSampleRate) {
var fitCount = Math.round(data.length*(newSampleRate/oldSampleRate));
var newData = new Array();
var springFactor = new Number((data.length - 1) / (fitCount - 1));
newData[0] = data[0]; // for new allocation
for ( var i = 1; i < fitCount - 1; i++) {
var tmp = i * springFactor;
var before = new Number(Math.floor(tmp)).toFixed();
var after = new Number(Math.ceil(tmp)).toFixed();
var atPoint = tmp - before;
newData[i] = this.linearInterpolate(data[before], data[after], atPoint);
}
newData[fitCount - 1] = data[data.length - 1]; // for new allocation
return newData;
};
function linearInterpolate(before, after, atPoint) {
return before + (after - before) * atPoint;
};
编辑:如果你不想改变太多,你可以硬编码为
function exportWAV(type){
var buffers = [], desiredSamplingRate = 16000;
我不相信您可以使用 Web Audio 控制采样率 API ...它会获取在浏览器外部定义的系统默认采样率 ...当然,在录制之后,您可以以编程方式更改您的音频以重新采样到任何采样率......大多数音频播放器只能播放标准采样率的媒体......能够呈现 16 kHz 的关闭采样率可能比从 44.1 到 16 kHz 重新采样更具挑战性
您可以像这样更改 init 函数,在这里您可以克服默认浏览器采样率到 16000 以及指示 mono/stereo 的通道,我们也可以更改那个,
如果是单声道,则为 1 ,否则为 2 。
function init(config) {
//sampleRate = config.sampleRate;
sampleRate = 16000;
debugger;
//numChannels = config.numChannels;
numChannels = 1;
initBuffers();
}
function floatTo16BitPCM(output, offset, input){
for (var i = 0; i < input.length; i++, offset+=2){
var s = Math.max(-1, Math.min(1, input[i]));
output.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
}
}
function writeString(view, offset, string){
for (var i = 0; i < string.length; i++){
view.setUint8(offset + i, string.charCodeAt(i));
}
}
function encodeWAV(samples){
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer);
/* RIFF identifier */
writeString(view, 0, 'RIFF');
/* RIFF chunk length */
view.setUint32(4, 36 + samples.length * 2, true);
/* RIFF type */
writeString(view, 8, 'WAVE');
/* format chunk identifier */
writeString(view, 12, 'fmt ');
/* format chunk length */
view.setUint32(16, 16, true);
/* sample format (raw) */
view.setUint16(20, 1, true);
/* channel count */
view.setUint16(22, 2, true);
/* sample rate */
view.setUint32(24, sampleRate, true);
/* byte rate (sample rate * block align) */
view.setUint32(28, sampleRate * 4, true);
/* block align (channel count * bytes per sample) */
view.setUint16(32, 4, true);
/* bits per sample */
view.setUint16(34, 16, true);
/* data chunk identifier */
writeString(view, 36, 'data');
/* data chunk length */
view.setUint32(40, samples.length * 2, true);
floatTo16BitPCM(view, 44, samples);
return view;
}
您好,我正在使用此源代码为我的学校考试录制音频。它以 44100Hz 和 16 位录制音频。我想更改录制设置以录制 16000Hz 和 16 位的音频。 我尝试将函数 encodeWAV 中的 44 修改为 16,但没有成功。
function encodeWAV(samples){
var buffer = new ArrayBuffer(44 + samples.length * 2);
var view = new DataView(buffer)
我也尝试过更改 floadRToBitPCM。我试图将 44 更改为 16,但它也没有用。
floatTo16BitPCM(view, 44, samples);
你能帮我解决这个问题吗??不知道怎么修改这个源码
您正在修改错误的字段。波形文件是 header 后跟数据。 wave header 通常 44 字节长。您在示例代码中看到的 44
的值与此相关,与 44100
.
在您未发布的代码中,sampleRate
被定义为 44100。您需要找到该定义并将其更改为 16000。具体取决于您的代码的其余部分和示例的来源它可能不是那么简单。例如,如果正在从设备记录样本并且该设备已配置为以 44100 记录,那么简单地将保存的波形标记为 16000 不会产生预期的效果。它只会使播放速度太慢 2.75 倍,也就是 Barry White 效果。
编辑:
另一种选择(IMO 更好)是使用 HTML 的 MediaRecorder 并以 .ogg
格式记录,demo, and it's git repo
我假设您正在使用 this 作为来源,就像 jaket 所说的那样,floatTo16BitPCM(view, 44, samples);
行与采样率无关...
如果你想对数据重新采样,你必须修改这个:
function exportWAV(type){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
buffers.push(mergeBuffers(recBuffers[channel], recLength));
}
if (numChannels === 2){
var interleaved = interleave(buffers[0], buffers[1]);
} else {
var interleaved = buffers[0];
}
var dataview = encodeWAV(interleaved);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
进入这个:
function exportWAV(type, desiredSamplingRate){
var buffers = [];
for (var channel = 0; channel < numChannels; channel++){
var buffer = mergeBuffers(recBuffers[channel], recLength);
buffer = interpolateArray(buffer, desiredSamplingRate, sampleRate);
buffers.push(buffer);
}
sampleRate = desiredSamplingRate;
if (numChannels === 2){
var interleaved = interleave(buffers[0], buffers[1]);
} else {
var interleaved = buffers[0];
}
var dataview = encodeWAV(interleaved);
var audioBlob = new Blob([dataview], { type: type });
this.postMessage(audioBlob);
}
数据重采样代码,
// for changing the sampling rate, data,
function interpolateArray(data, newSampleRate, oldSampleRate) {
var fitCount = Math.round(data.length*(newSampleRate/oldSampleRate));
var newData = new Array();
var springFactor = new Number((data.length - 1) / (fitCount - 1));
newData[0] = data[0]; // for new allocation
for ( var i = 1; i < fitCount - 1; i++) {
var tmp = i * springFactor;
var before = new Number(Math.floor(tmp)).toFixed();
var after = new Number(Math.ceil(tmp)).toFixed();
var atPoint = tmp - before;
newData[i] = this.linearInterpolate(data[before], data[after], atPoint);
}
newData[fitCount - 1] = data[data.length - 1]; // for new allocation
return newData;
};
function linearInterpolate(before, after, atPoint) {
return before + (after - before) * atPoint;
};
编辑:如果你不想改变太多,你可以硬编码为
function exportWAV(type){
var buffers = [], desiredSamplingRate = 16000;
我不相信您可以使用 Web Audio 控制采样率 API ...它会获取在浏览器外部定义的系统默认采样率 ...当然,在录制之后,您可以以编程方式更改您的音频以重新采样到任何采样率......大多数音频播放器只能播放标准采样率的媒体......能够呈现 16 kHz 的关闭采样率可能比从 44.1 到 16 kHz 重新采样更具挑战性
您可以像这样更改 init 函数,在这里您可以克服默认浏览器采样率到 16000 以及指示 mono/stereo 的通道,我们也可以更改那个, 如果是单声道,则为 1 ,否则为 2 。
function init(config) {
//sampleRate = config.sampleRate;
sampleRate = 16000;
debugger;
//numChannels = config.numChannels;
numChannels = 1;
initBuffers();
}