카테고리 없음
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를 호출하는 방식을 사용합니다.
반응형