Enregistrer l'audio sur le Web, préréglé: 16000Hz 16 bits

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; } 

Bonjour, j'utilise ce code source pour enregistrer l'audio pour mon examen scolaire. Il enregistre l'audio en 44100Hz et 16 bits. Je souhaite modifier les paramètres d'enregistrement pour enregistrer l'audio en 16000Hz et 16 bits. J'ai essayé de modifier 44 dans la fonction encodeWAV à 16, mais cela n'a pas fonctionné.

 function encodeWAV(samples){ var buffer = new ArrayBuffer(44 + samples.length * 2); var view = new DataView(buffer) 

J'ai également essayé de changer floadRToBitPCM. J'ai essayé de changer de 44 à 16, mais cela n'a pas non plus fonctionné.

 floatTo16BitPCM(view, 44, samples); 

Pouvez-vous m'aider avec ce problème? Je ne sais pas comment modifier ce code source.

Je ne crois pas que vous puissiez contrôler le taux d'échantillonnage en utilisant l'API Web Audio … il reprend le taux d'échantillonnage par défaut du système qui est défini en dehors du navigateur … Bien sûr, après l'enregistrement, vous pouvez modifier votre audio de manière programmatique à un échantillon Notez … La plupart des lecteurs audio ne peuvent jouer que des médias de taux d'échantillonnage standard … être capable de rendre une fréquence d'échantillonnage hors service de 16 kHz pourrait être plus difficile que le rééchantillonnage de 44,1 à 16 kHz

Modifier:

Une autre option (beaucoup mieux une IMO) est juste d'aller pour le MediaRecorder du HTML et d'enregistrer en format .ogg , demo , et c'est un compte rendu git


Je suppose que vous utilisez cette source comme source, et comme jaket dit, la ligne floatTo16BitPCM(view, 44, samples); N'a rien à voir avec le taux d'échantillonnage …

Si vous souhaitez rééchantillonner les données, vous avez modifié ceci:

 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); } 

Dans ceci:

 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); } 

Code pour le rééchantillonnage des données,

 // 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; }; 

Edit: si vous ne le changez pas trop, vous pouvez simplement le coder comme

 function exportWAV(type){ var buffers = [], desiredSamplingRate = 16000; 

Vous modifiez le mauvais champ. Un fichier wave est un en-tête suivi des données. L'en-tête d'onde est généralement de 44 octets. La valeur de 44 vous voyez dans l'exemple de code est liée à cela et non à 44100 .

Quelque part dans le code que vous n'avez pas posté, sampleRate est défini comme étant 44100. Vous devez retrouver cette définition et la modifier à 16000. Selon le reste de votre code et la source des échantillons, cela pourrait ne pas être aussi simple. Par exemple, si des échantillons sont enregistrés à partir d'un périphérique et que le périphérique a été configuré pour enregistrer à 44100, il suffit de marquer la forme d'onde enregistrée alors que 16000 n'aura pas l'effet désiré. Il suffit de faire une lecture 2,75x trop lente, comme l'effet Barry White.

Vous pouvez modifier la fonction d'initialisation comme celle-ci, ici vous pouvez surmonter le taux d'échantillonnage du navigateur par défaut à 16000 et aussi les canaux indiquant le mono / stéréo, nous pouvons également changer celui-là, s'il est mono il sera 1, autrement deux.

  function init(config) { //sampleRate = config.sampleRate; sampleRate = 16000; debugger; //numChannels = config.numChannels; numChannels = 1; initBuffers(); }