카테고리 없음

5월 10일 개발일지 - open api를 클라이언트 측 에서 실행불가능 판단 근거

newbeverse 2023. 5. 11. 13:29
import { Configuration, OpenAIApi } from "openai";
import { Readable } from "stream";
import mic from "mic";
import ffmpeg from "fluent-ffmpeg";
import ffmpegPath from "@ffmpeg-installer/ffmpeg";
import dotenv from "dotenv";
import fs, { PathLike } from "fs";

dotenv.config();

const configuration = new Configuration({
  apiKey: process.env.OPENAI_API_KEY,
});
const openai = new OpenAIApi(configuration);
ffmpeg.setFfmpegPath(ffmpegPath.path);

// Record audio
function recordAudio(filename: PathLike) {
  return new Promise<void>((resolve, reject) => {
    const micInstance = mic({
      rate: "16000",
      channels: "1",
      fileType: "wav",
    });

    const micInputStream = micInstance.getAudioStream();
    const output = fs.createWriteStream(filename);
    const writable = new Readable().wrap(micInputStream);

    console.log("Recording... Press Ctrl+C to stop.");

    writable.pipe(output);

    micInstance.start();

    process.on("SIGINT", () => {
      micInstance.stop();
      console.log("Finished recording");
      resolve();
    });

    micInputStream.on("error", (err: Error) => {
      reject(err);
    });
  });
}

// Transcribe audio
async function transcribeAudio(filename: PathLike) {
  const transcript = await openai.createTranscription(
    fs.createReadStream(filename) as unknown as File,
    "whisper-1"
  );
  return transcript.data.text;
}

// Main function
async function main() {
  const audioFilename = "recorded_audio.wav";
  await recordAudio(audioFilename);
  const transcription = await transcribeAudio(audioFilename);
  console.log("Transcription:", transcription);
}

main();

이 코드는 node.js 환경에서 동작하도록 설계되어 있습니다.
node.js는 서버측 javascript 런타임이므로, 코드를 브라우저 환경에서 직접실행하는 것은 어렵고,

클라이언트 측에서 오디오를 녹음하고 그것을 제공하는 기능을 사용하려면, 브라우저 api와 클라이언트 측 javascript를 사용해야 하는데, 브라우저에서 직접 openai api를 호출하는것은 보안상 문제가 생길 수 있고, api 키가 노출될 위험이 있으므로, 문제가 발생하기 때문에

이러한 문제를 해결하기 위해 일반적으로, 서버를 중간에 두고 클라이언트에서 서버로 오디오를 전송한 후에 open api를 호출하는 방식을 사용합니다.

 

반응형