diff options
Diffstat (limited to '')
-rw-r--r-- | projects/text_to_speech/utils.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/projects/text_to_speech/utils.js b/projects/text_to_speech/utils.js new file mode 100644 index 00000000..4f53dea8 --- /dev/null +++ b/projects/text_to_speech/utils.js @@ -0,0 +1,47 @@ +// 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)) + } +}
\ No newline at end of file |