mirror of
https://github.com/xtekky/gpt4free.git
synced 2024-11-15 06:13:01 +00:00
47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
|
// Adapted from https://www.npmjs.com/package/audiobuffer-to-wav
|
||
|
|
||
|
export function encodeWAV(samples) {
|
||
|
let offset = 44;
|
||
|
const buffer = new ArrayBuffer(offset + samples.length * 4);
|
||
|
const view = new DataView(buffer);
|
||
|
const sampleRate = 16000;
|
||
|
|
||
|
/* RIFF identifier */
|
||
|
writeString(view, 0, 'RIFF')
|
||
|
/* RIFF chunk length */
|
||
|
view.setUint32(4, 36 + samples.length * 4, 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, 3, true)
|
||
|
/* channel count */
|
||
|
view.setUint16(22, 1, 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, 32, true)
|
||
|
/* data chunk identifier */
|
||
|
writeString(view, 36, 'data')
|
||
|
/* data chunk length */
|
||
|
view.setUint32(40, samples.length * 4, true)
|
||
|
|
||
|
for (let i = 0; i < samples.length; ++i, offset += 4) {
|
||
|
view.setFloat32(offset, samples[i], true)
|
||
|
}
|
||
|
|
||
|
return buffer
|
||
|
}
|
||
|
|
||
|
function writeString(view, offset, string) {
|
||
|
for (let i = 0; i < string.length; ++i) {
|
||
|
view.setUint8(offset + i, string.charCodeAt(i))
|
||
|
}
|
||
|
}
|