UNPKG

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