From: riqo Date: Thu, 4 Feb 2021 00:01:48 +0000 (-0600) Subject: add recorder file X-Git-Tag: v0.9~107 X-Git-Url: https://andrewgundersen.net/repos?a=commitdiff_plain;h=1a328b41b94ffc30cf3c012bb90de1e8442ca05e;p=mime-chat add recorder file --- diff --git a/src/background.ts b/src/background.ts index de64c26..e53ab80 100644 --- a/src/background.ts +++ b/src/background.ts @@ -9,20 +9,11 @@ const fs = require('fs'); import WebSocket from "ws"; const portAudio = require('naudiodon'); -// Create an instance of AudioIO with inOptions (defaults are as below), which will return a ReadableStream -const audioOptions = { - channelCount: 2, - sampleFormat: portAudio.sampleFormat16Bit, - sampleRate: 16000, - deviceId: -1, // Use -1 or omit the deviceId to select the default device - closeOnError: false // Close the stream if an audio error is detected, if set false then just log the error -} - -const ai = new portAudio.AudioIO({ - inOptions: audioOptions -}); +// const ai = new portAudio.AudioIO({ +// inOptions: audioOptions +// }); //ai.pipe(); -ai.start(); +// ai.start(); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. diff --git a/src/background/recorder.ts b/src/background/recorder.ts new file mode 100644 index 0000000..f47a228 --- /dev/null +++ b/src/background/recorder.ts @@ -0,0 +1,79 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const portAudio = require('naudiodon'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { Writable } = require('stream'); +// eslint-disable-next-line @typescript-eslint/no-var-requires +const { StringDecoder } = require('string_decoder'); + +interface RecorderI { + start(): void; + stop(): string; +} + +class StringWritable extends Writable { + + constructor(options: { + defaultEncoding: string; + }) { + super(options); + this._decoder = new StringDecoder(options && options.defaultEncoding); + this.data = ''; + } + + _write(chunk: Buffer, encoding: string, callback: (error? : Error) => void) { + if (encoding === 'buffer') { + chunk = this._decoder.write(chunk); + } + this.data += chunk; + callback(); + } + + _final(callback: (error? : Error) => void) { + this.data += this._decoder.end(); + callback(); + } + +} + +export class Recorder implements RecorderI { + + private ia: any; + private micWritable: StringWritable; + + constructor(options: { + + }) { + this.ia = new portAudio.AudioIO({ + inOptions: options + }); + this.micWritable = new StringWritable({ + defaultEncoding: 'binary' + }); + this.start(); + } + + start(): void { + console.log('inititate recording'); + this.ia.pipe(this.micWritable); + this.ia.start(); + this.ia.pause(); + } + + record(): void { + this.ia.resume(); + } + + pause(): void { + this.ia.pause(); + } + + getData(): string { + return this.micWritable.data; + } + + stop(): string { + this.ia.quit(); + return this.micWritable.data; + } + +} diff --git a/testAudio.js b/testAudio.js index 3312d27..c2c291b 100644 --- a/testAudio.js +++ b/testAudio.js @@ -1,3 +1,4 @@ + const fs = require('fs'); const speech = require('@google-cloud/speech'); const portAudio = require('naudiodon');