UNPKG

sofya.transcription

Version:

a JavaScript library that provides a robust and flexible solution for real-time audio transcription. It is designed to transcribe audio streams and can be easily integrated into web applications.

242 lines 9.36 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); //@ts-nocheck var speech_audio_resampler_1 = __importDefault(require("../speech-audio-resampler")); var AudioStreamer = /** @class */ (function () { function AudioStreamer(mediaStream, config) { var _this = this; this.audioProcessStatus = false; this.onAudioDataAvailable = function (e) { if (_this.getState() === "PAUSED") { return; } if (!_this.isMediaStreamActive()) { _this.audioNode.disconnect(); _this.setState("STOPPED"); } if (_this.getState() !== "RECORDING") { if (_this.audioInput) { _this.audioInput.disconnect(); _this.audioInput = {}; } return; } if (!_this.audioProcessStatus) _this.audioProcessStatus = true; var bufferData = e.inputBuffer.getChannelData(0); var buffersCopy = new Float32Array(bufferData); _this.timeSlicedAudioBuffer.bufferArray.push(buffersCopy); _this.timeSlicedAudioBuffer.length += _this.config.bufferSize; if (_this.getState() !== "RECORDING" || typeof _this.config.callBack !== "function") return; if (_this.timeSlicedAudioBuffer.bufferArray.length) { _this.processAudioBuffers(); _this.timeSlicedAudioBuffer = { bufferArray: [], length: 0 }; } }; this.callBack = function (buffer, view) { var blob = new Blob([view], { type: "audio/wav", }); _this.config.callBack(blob); }; this.processAudioBuffers = function () { var sampleRate = _this.audioContext.sampleRate; var targetSampleRate = _this.config.sampleRate; var audioBuffer = _this.timeSlicedAudioBuffer; var buffers = mergeBuffers(audioBuffer.bufferArray.slice(0), audioBuffer.length); if (sampleRate !== targetSampleRate) buffers = _this.audioResampler.resample(buffers); function mergeBuffers(bufferArray, bufferLength) { var result = new Float32Array(bufferLength); var offset = 0; var length = bufferArray.length; for (var i = 0; i < length; i++) { var buffer_1 = bufferArray[i]; result.set(buffer_1, offset); offset += buffer_1.length; } return result; } var interleavedLength = buffers.length; var resultingBufferLength = interleavedLength * 2; var buffer = new ArrayBuffer(resultingBufferLength); var view = new DataView(buffer); // data chunk length // write the PCM samples var lng = interleavedLength; var index = 0; var volume = 1; for (var i = 0; i < lng; i++) { view.setInt16(index, buffers[i] * (0x7fff * volume), true); index += 2; } _this.callBack(buffer, view); }; this.enableCompatibility = function () { window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext; window.URL = window.URL || window.webkitURL; window.MediaStream = window.MediaStream || window.webkitMediaStream; }; this.setState = function (state) { _this.state = state; }; this.initiateAudioWithSampleRate = function (sampleRate) { _this.audioContext = new window.AudioContext({ sampleRate: sampleRate }); _this.audioInput = _this.audioContext.createMediaStreamSource(_this.mediaStream); _this.audioNode = _this.audioContext.createScriptProcessor(_this.config.bufferSize, 1, 1); _this.audioInput.connect(_this.audioNode); _this.audioNode.onaudioprocess = _this.onAudioDataAvailable; _this.audioNode.connect(_this.audioContext.createMediaStreamDestination()); _this.audioResampler = new speech_audio_resampler_1.default(_this.audioContext.sampleRate, _this.config.sampleRate, true, true); }; this.initiateAudio = function () { try { _this.config.bufferSize = _this.config.bufferSize || 1024; _this.initiateAudioWithSampleRate(16000); } catch (err) { try { _this.config.bufferSize = 4096; _this.initiateAudioWithSampleRate(48000); } catch (err) { try { _this.config.bufferSize = 4096; _this.initiateAudioWithSampleRate(44100); } catch (err) { console.log(err); _this.reset(); return false; } } } return true; }; this.isMediaStreamActive = function () { if ("active" in _this.mediaStream) { if (!_this.mediaStream.active) { // console.error("Please make sure MediaStream is active."); return false; } } return true; }; this.reset = function () { _this.setState("INACTIVE"); _this.state = "INACTIVE"; _this.blob = new Blob(); _this.audioContext = {}; if (_this.audioNode) { _this.audioNode.onaudioprocess = null; try { _this.audioNode.disconnect(); } catch (err) { // console.error(err); } _this.audioNode = {}; } if (_this.audioInput) { try { _this.audioInput.disconnect(); } catch (err) { // console.error(err); } _this.audioInput = {}; } _this.audioProcessStatus = false; _this.audioContext = {}; _this.timeSlicedAudioBuffer = { length: 0, bufferArray: [], }; _this.completeAudioBuffer = { length: 0, bufferArray: [], }; _this.audioResampler = null; }; this.getTracks = function (mediaStream) { if (!mediaStream || !mediaStream.getTracks) { return []; } return mediaStream.getTracks().filter(function (track) { return track.kind === "audio"; }); }; this.startRecording = function () { _this.reset(); if (_this.isMediaStreamActive()) { _this.setState("RECORDING"); return _this.initiateAudio(); } else return false; }; this.pauseRecording = function () { if (_this.state === "PAUSED") return; _this.setState("PAUSED"); }; this.resumeRecording = function () { _this.isMediaStreamActive(); if (_this.state !== "PAUSED") return; _this.setState("RECORDING"); }; this.stopRecording = function (callback) { callback = callback || (function () { }); if (_this.state === "PAUSED") { _this.resumeRecording(); setTimeout(function () { _this.stopRecording(callback); }, 1); return; } _this.setState("STOPPED"); if (callback) { var url = void 0; try { url = URL.createObjectURL(_this.blob); } catch (e) { } if (typeof callback.call === "function") { callback.call(_this, url); } else { callback(url); } } _this.reset(); }; this.destroy = function () { _this.reset(); _this.mediaStream = {}; _this.setState("DESTROYED"); }; this.getBlob = function () { if (!_this.blob) return new Blob(); return _this.blob; }; this.getURL = function () { if (!_this.blob) return; return URL.createObjectURL(_this.blob); }; this.getState = function () { return _this.state; }; this.config = config; this.mediaStream = mediaStream; this.state = "INACTIVE"; this.enableCompatibility(); } return AudioStreamer; }()); exports.default = AudioStreamer; //# sourceMappingURL=speech-audio-streamer.js.map