ai-code-writer
Version:
An AI code writer application using OpenAI APIs for audio transcription and chat completion.
127 lines (126 loc) • 5.19 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const FallbackAudio_1 = __importDefault(require("./FallbackAudio"));
class OpenAiAudio {
constructor(apiUrl, openApiKey, openAi, temperature, logger) {
this.apiUrl = apiUrl;
this.openApiKey = openApiKey;
this.openAi = openAi;
this.temperature = temperature;
this.logger = logger;
}
transformAudioToText(audioBuffer) {
return __awaiter(this, void 0, void 0, function* () {
const file = new File([audioBuffer], 'audio.wav', { type: 'audio/wav' });
const dataSize = audioBuffer.length;
try {
const responsePromise = this.openAi.audio.transcriptions.create({
file: file,
model: 'whisper-1',
response_format: 'json',
temperature: this.temperature
});
return yield this.showProgress(responsePromise, dataSize);
}
catch (error) {
return '';
}
});
}
transformTextToAudio(text) {
return __awaiter(this, void 0, void 0, function* () {
const headers = {
'Authorization': 'Bearer ' + this.openApiKey,
'Content-Type': 'application/json'
};
const data = {
model: 'tts-1',
input: text,
voice: 'nova',
speed: 1
};
const dataSize = text.length;
try {
const responsePromise = fetch(this.apiUrl, {
method: 'POST',
headers: headers,
body: JSON.stringify(data)
});
return yield this.showProgressForAudio(responsePromise, dataSize);
}
catch (error) {
return Buffer.from(OpenAiAudio.FALLBACK, 'base64');
}
});
}
showProgress(responsePromise, dataSize) {
return __awaiter(this, void 0, void 0, function* () {
let progress = 0;
const interval = this.calculateInterval(dataSize);
const progressInterval = setInterval(() => {
this.logger.logProgress(`Progress: ${'.'.repeat(progress % 10 + 1)}\r`);
progress++;
}, interval);
try {
const response = yield responsePromise;
clearInterval(progressInterval);
this.logger.log('Progress: Done \n');
return response.text;
}
catch (error) {
clearInterval(progressInterval);
this.logger.logError('Progress: Failed\n');
throw error;
}
});
}
showProgressForAudio(responsePromise, dataSize) {
return __awaiter(this, void 0, void 0, function* () {
let progress = 0;
const interval = this.calculateInterval(dataSize);
const progressInterval = setInterval(() => {
this.logger.logProgress(`Progress: ${'.'.repeat(progress % 10 + 1)}\r`);
progress++;
}, interval);
try {
const response = yield responsePromise;
clearInterval(progressInterval);
this.logger.log('Progress: Done \n');
if (response.ok == false) {
return Buffer.from(OpenAiAudio.FALLBACK, 'base64');
}
return yield this.convertAudio(response);
}
catch (error) {
clearInterval(progressInterval);
this.logger.logError('Progress: Failed\n');
return Buffer.from(OpenAiAudio.FALLBACK, 'base64');
}
});
}
convertAudio(response) {
return __awaiter(this, void 0, void 0, function* () {
const audioBuffer = yield response.arrayBuffer();
return Buffer.from(audioBuffer);
});
}
calculateInterval(dataSize) {
const baseInterval = 500;
const sizeFactor = Math.log2(dataSize / 1024);
return baseInterval * (1 + sizeFactor / 10);
}
}
OpenAiAudio.FALLBACK = FallbackAudio_1.default;
exports.default = OpenAiAudio;