Spaces:
Runtime error
Runtime error
export function audioBufferToWav(audioBuffer: AudioBuffer): Uint8Array { | |
const numOfChan = audioBuffer.numberOfChannels; | |
const length = audioBuffer.length * numOfChan * 2 + 44; | |
const buffer = new ArrayBuffer(length); | |
const view = new DataView(buffer); | |
let offset = 0; | |
// Write WAV header | |
const writeString = function ( | |
view: DataView, | |
offset: number, | |
string: string | |
): void { | |
for (let i = 0; i < string.length; i++) { | |
view.setUint8(offset + i, string.charCodeAt(i)); | |
} | |
}; | |
writeString(view, offset, "RIFF"); | |
offset += 4; | |
view.setUint32(offset, length - 8, true); | |
offset += 4; | |
writeString(view, offset, "WAVE"); | |
offset += 4; | |
writeString(view, offset, "fmt "); | |
offset += 4; | |
view.setUint32(offset, 16, true); | |
offset += 4; // Sub-chunk size, 16 for PCM | |
view.setUint16(offset, 1, true); | |
offset += 2; // PCM format | |
view.setUint16(offset, numOfChan, true); | |
offset += 2; | |
view.setUint32(offset, audioBuffer.sampleRate, true); | |
offset += 4; | |
view.setUint32(offset, audioBuffer.sampleRate * 2 * numOfChan, true); | |
offset += 4; | |
view.setUint16(offset, numOfChan * 2, true); | |
offset += 2; | |
view.setUint16(offset, 16, true); | |
offset += 2; | |
writeString(view, offset, "data"); | |
offset += 4; | |
view.setUint32(offset, audioBuffer.length * numOfChan * 2, true); | |
offset += 4; | |
// Write PCM audio data | |
for (let i = 0; i < audioBuffer.numberOfChannels; i++) { | |
const channel = audioBuffer.getChannelData(i); | |
for (let j = 0; j < channel.length; j++) { | |
view.setInt16(offset, channel[j] * 0xffff, true); | |
offset += 2; | |
} | |
} | |
return new Uint8Array(buffer); | |
} | |