안녕하세요, 저는 HolySheep AI의 기술 엔지니어입니다. 이번 튜토리얼에서는 GPT-4o의 음성 대화 기능을 활용하여 실시간 음성 인터페이스를 구축하는 방법을 단계별로 설명드리겠습니다. API 개발 경험이 전혀 없는 분들도 따라할 수 있도록 기초 개념부터 차근차근 설명하겠습니다.

1. 실시간 음성 대화란 무엇인가?

기존 텍스트 기반 ChatGPT와 달리, GPT-4o 음성 대화는 마이크로 음성을 입력하면 즉시 텍스트와 음성 응답을 받을 수 있습니다. 이러한 실시간 통신은 웹사이트의 채팅창에 메시지를 보내는 단순한 HTTP 요청과는 다릅니다. 음성 데이터가 끊임없이 흐르므로, 지속적인 연결을 유지하는 특별한 기술이 필요합니다.

핵심 차이점: 텍스트 대화는 '질문 → 답변'의 한 쌍으로 동작하지만, 음성 대화는 '음성 입력 → 실시간 처리 → 음성 출력'의 연속적인 흐름을 형성합니다. 마치 전화 통화처럼 양방향으로 데이터가 오갑니다.

2. 아키텍처 설계의 기본 원칙

실시간 음성 대화 시스템을 만들려면 세 가지 핵심 구성 요소가 필요합니다:

아래는 가장 기본적인 시스템 구조도입니다:

┌─────────────────────────────────────────────────────────┐
│                    사용자 브라우저                        │
│  ┌──────────────┐    ┌──────────────┐    ┌───────────┐  │
│  │  마이크 녹음   │───▶│  WebRTC/Blob │───▶│  서버 전송 │  │
│  └──────────────┘    └──────────────┘    └─────┬─────┘  │
│                                                 │        │
│  ┌──────────────┐    ┌──────────────┐    ┌─────▼─────┐  │
│  │  스피커 출력   │◀───│  오디오 디코딩 │◀───│  서버 수신 │  │
│  └──────────────┘    └──────────────┘    └───────────┘  │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                   HolySheep AI API                      │
│              https://api.holysheep.ai/v1                 │
│                                                         │
│  [오디오 입력] ──▶ [GPT-4o 음성 모델] ──▶ [오디오 출력]  │
└─────────────────────────────────────────────────────────┘

3. WebSocket 연결 설정하기

실시간 음성 통신의 핵심은 WebSocket입니다. 일반 HTTP 요청이 '요청 → 응답 → 종료'의 단발성 통신이라면, WebSocket은 한 번 연결하면 양쪽이 자유롭게 데이터를 주고받을 수 있습니다. 전화 통화처럼 선이 연결된 상태를 유지합니다.

WebSocket의 장점: 연결 수립 후에는 추가 인증이나 헤더 없이 즉시 데이터 전송이 가능합니다. 음성 데이터가 0.1초 단위로 계속 들어오므로, 매번 새로운 연결을 만드는 것은 비효율적입니다.

3.1 Node.js 기반 WebSocket 서버 구현

먼저 프로젝트 폴더를 만들고 필요한 도구를 설치합니다:

mkdir voice-chat-app
cd voice-chat-app
npm init -y
npm install ws openai dotenv

이제 HolySheep AI의 API 키를 .env 파일에 저장합니다:

# .env 파일
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

실시간 음성 대화를 위한 WebSocket 서버 코드를 작성합니다:

// server.js
const WebSocket = require('ws');
const { Readable } = require('stream');
require('dotenv').config();

const HOLYSHEEP_API_KEY = process.env.HOLYSHEEP_API_KEY;
const HOLYSHEEP_WS_URL = 'wss://api.holysheep.ai/v1/realtime';

const wss = new WebSocket.Server({ port: 8080 });

console.log('음성 대화 서버 시작: ws://localhost:8080');

wss.on('connection', (ws) => {
    console.log('클라이언트 연결됨');

    let holySheepWs = null;
    let isConnected = false;

    // HolySheep AI 실시간 세션 시작
    const connectToHolySheep = async () => {
        try {
            holySheepWs = new WebSocket(HOLYSHEEP_WS_URL, {
                headers: {
                    'Authorization': Bearer ${HOLYSHEEP_API_KEY},
                    'OpenAI-Beta': 'realtime=v1'
                }
            });

            holySheepWs.on('open', () => {
                console.log('HolySheep AI 연결 성공');
                isConnected = true;
                
                // GPT-4o 음성 세션 설정
                holySheepWs.send(JSON.stringify({
                    type: 'session.update',
                    session: {
                        modalities: ['audio', 'text'],
                        model: 'gpt-4o-realtime-preview',
                        voice: 'alloy',
                        audio_format: 'pcm16',
                        sample_rate: 24000
                    }
                }));
            });

            holySheepWs.on('message', (data) => {
                const message = JSON.parse(data);
                handleHolySheepMessage(message, ws);
            });

            holySheepWs.on('error', (error) => {
                console.error('HolySheep API 오류:', error.message);
            });

            holySheepWs.on('close', () => {
                console.log('HolySheep AI 연결 종료');
                isConnected = false;
            });

        } catch (error) {
            console.error('연결 실패:', error.message);
            ws.send(JSON.stringify({ type: 'error', message: error.message }));
        }
    };

    // HolySheep AI 응답 처리
    const handleHolySheepMessage = (message, clientWs) => {
        switch (message.type) {
            case 'session.created':
                console.log('세션 생성됨');
                clientWs.send(JSON.stringify({ type: 'connected' }));
                break;

            case 'conversation.item.audio_transcript':
                // 음성 입력 → 텍스트 변환 결과
                console.log('사용자 말함:', message.transcript);
                break;

            case 'response.audio.delta':
                // AI 음성 응답 스트림
                if (message.delta) {
                    clientWs.send(JSON.stringify({
                        type: 'audio',
                        data: message.delta
                    }));
                }
                break;

            case 'response.done':
                // 응답 완료
                console