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
JavaScript
;
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