9.3 실습: 고객 응대 시스템의 음성화
이 절에서는 OpenAI의 Whisper 및 TTS(Text-to-Speech) API를 활용하여 기존 텍스트 기반 고객 응대 시스템을 음성 기반으로 확장하는 실습을 진행합니다. 사용자의 음성 입력을 텍스트로 변환한 후, 이를 OpenAI의 GPT 모델로 처리하고, 다시 자연스러운 음성으로 출력하여 보다 몰입감 있는 대화형 시스템을 만드는 것이 목표입니다.
🛠️ 실습 목표
사용자의 음성 입력을 텍스트로 변환(STT: Speech-to-Text)
텍스트 입력을 GPT 모델에 전달하여 응답 생성
모델 응답을 음성으로 변환(TTS: Text-to-Speech)
Flask 서버를 통해 프론트엔드와 통신하는 REST 기반 음성 챗봇 구축
1️⃣ 실습 준비 사항
🔧 사전 준비
Python 3.8+
OpenAI Python SDK (openai >= 1.0 이상)
Flask
FFmpeg (Whisper 음성 처리용 필수)
마이크 입력용 프론트엔드 또는 사전 녹음된 음성 파일
📦 필수 라이브러리 설치
pip install openai flask pydub
Whisper가 MP3, WAV, M4A 등의 오디오 파일 형식을 지원하기 위해 ffmpeg 설치도 필요합니다.
# Ubuntu
sudo apt-get install ffmpeg
# MacOS (Homebrew)
brew install ffmpeg
2️⃣ 전체 아키텍처 개요
다음은 고객 응대 음성 시스템의 기본 데이터 흐름입니다.
🎤 사용자 음성 입력
↓ (마이크 or 오디오 파일)
[Whisper API]
↓ (텍스트 변환)
[OpenAI GPT 모델 (Chat API)]
↓ (텍스트 응답)
[Text-to-Speech API]
↓
🔊 스피커 또는 오디오 출력을 통한 응답
3️⃣ Step-by-Step 실습
3.1 사용자 음성 입력 → Whisper로 텍스트 변환
Whisper API 호출은 단일 오디오 파일로 진행됩니다. 예제를 위해 audio_input.mp3
라는 파일을 사용합니다.
import openai
openai.api_key = "your-api-key"
audio_file = open("audio_input.mp3", "rb")
transcript = openai.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
response_format="json"
)
print("📝 변환된 텍스트:", transcript.text)
📌 참고사항:
Whisper는 다양한 포맷을 지원하지만, 사전에 ffmpeg를 통해 WAV 또는 MP3로 변환해 두는 것이 좋습니다.
실시간 음성을 스트리밍하려면 WebRTC 등의 별도 구성 필요
3.2 변환된 텍스트 → GPT로 답변 생성
앞에서 받은 텍스트(transcript.text)를 대화형 프롬프트로 GPT에게 전달합니다.
response = openai.chat.completions.create(
model='gpt-4',
messages=[
{"role": "system", "content": "당신은 친절한 고객 서비스 상담원입니다."},
{"role": "user", "content": transcript.text}
]
)
result_text = response.choices[0].message.content
print("🤖 GPT 응답:", result_text)
📌 프롬프트 구조 사용 팁:
시스템 프롬프트를 활용하여 일관된 어투 및 응답 스타일 유지
대화 맥락을 위해 message history를 유지하면 지속적인 상담 가능
3.3 GPT 응답 → Text-to-Speech로 음성 출력
GPT가 생성한 응답을 TTS API로 전달하여 음성으로 변환합니다.
speech_response = openai.audio.speech.create(
model="tts-1-hd",
voice="nova", # other options: alloy, shimmer, echo, fable, onyx
input=result_text
)
# 응답을 파일로 저장
with open("output_speech.mp3", "wb") as f:
f.write(speech_response.content)
이후 해당 MP3 파일을 웹페이지, 데스크탑 앱, 스마트폰 등에서 재생하면 음성 응답이 구현됩니다.
📌 TTS 출력 품질 팁:
tts-1-hd
모델은 고음질을 제공하며 추가 latency 발생 가능voice
파라미터를 통해 사용자 맞춤화. (agent에 어울리는 목소리 선택)
4️⃣ Flask로 RESTful 서비스 구성 (베이스라인)
음성 기반 챗봇을 서버 형태로 제공하고 싶다면 Flask와 API 엔드포인트를 구성할 수 있습니다.
from flask import Flask, request, jsonify
import openai
import tempfile
app = Flask(__name__)
openai.api_key = "your-api-key"
@app.route("/voice-chat", methods=["POST"])
def voice_chat():
audio = request.files['audio']
# 음성 파일 처리
with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp:
audio.save(tmp.name)
transcript = openai.audio.transcriptions.create(
model="whisper-1",
file=open(tmp.name, "rb")
)
gpt_response = openai.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "당신은 고객 응대 전문 상담원입니다."},
{"role": "user", "content": transcript.text}
]
)
result_text = gpt_response.choices[0].message.content
tts_audio = openai.audio.speech.create(
model="tts-1",
voice="nova",
input=result_text
)
# 응답으로 음성 파일 반환
return tts_audio.content, 200, {
'Content-Type': 'audio/mpeg',
'Content-Disposition': 'inline; filename=reply.mp3'
}
if __name__ == "__main__":
app.run(debug=True)
🛰️ 프론트엔드 연동 간단 설명:
사용자 마이크 입력 → 음성 파일로 Blob 생성
FormData로 POST /voice-chat 전송
결과 응답으로 받은 MP3를 웹상에서 바로 재생
5️⃣ 확장 아이디어 (Advanced)
✅ 웹 기반 음성 인터페이스 구현 (Streamlit, React + WebRTC 등 활용)
✅ 대화 상태 메모리(context memory) 유지하여 연속 상담 형식 구성
✅ 음성 자동 인식 실패 시 fallback 메시지 제공 (“죄송해요, 다시 말씀해주시겠어요?”)
✅ 고객 요청 유형 분류 (예: 일반 문의 / 불만 접수 / 주문 상태 확인 등)
🧪 테스트와 검수
음성 인식 정확도
다양한 억양/속도에서도 잘 작동하는가?
응답 자연스러움
목소리 톤과 억양이 상담원처럼 들리는가?
응답 시간
음성 입력 → 응답까지 3~5초 내외 유지되는가?
보안
API 키가 안전하게 관리되고 있는가?
✅ 정리
Whisper STT와 GPT, TTS를 연동하여 유용한 음성 기반 고객 상담 시스템을 손쉽게 구현 가능
오디오 처리 자동화와 빠른 응답 생성을 통해 사용자 경험 극대화
향후 챗봇과 통합하거나 멀티모달 기능을 결합하여 더욱 고도화된 응대 시스템으로 확장 가능
다음 절에서는 이러한 음성 시스템에 다국어 처리 기능을 통합하여 글로벌 사용자 대상 실시간 응답을 구현하는 방법을 배웁니다.
Last updated